শেল স্ক্রিপ্টের সাবসেট প্রয়োগ করুন


12

এই সাইটের ট্যাগে বিভিন্ন ভাষা প্রয়োগের সাথে জড়িত অনেক সমস্যা ছিল । যাইহোক, কার্যতঃ এগুলি সমস্তই গুপ্ত ভাষা ছিল যা কেউ ব্যবহার করে না। ব্যবহারিক ভাষার জন্য দোভাষী তৈরি করার সময় যা এখানকার বেশিরভাগ ব্যবহারকারী সম্ভবত ইতিমধ্যে জানেন। হ্যাঁ, এটি শেল স্ক্রিপ্ট, যদি আপনার শিরোনামটি পড়তে সমস্যা হয় (তবে এটি আপনার নেই)। (হ্যাঁ, আমি ইচ্ছাকৃতভাবে এই চ্যালেঞ্জটি করেছি, যেহেতু আমি গল্ফস্ক্রিপ্ট এবং বেফুঞ্জের মতো সব কিছু জয়ের মত ভাষাগুলিতে বিরক্ত হয়েছি, তাই আমি আরও কিছু চ্যালেঞ্জ রেখেছি যেখানে আরও ব্যবহারিক প্রোগ্রামিং ভাষায় জয়ের বড় সম্ভাবনা রয়েছে)

তবে শেল স্ক্রিপ্টটি তুলনামূলকভাবে বড় ভাষা, সুতরাং আমি আপনাকে এটি প্রয়োগ করতে বলব না। পরিবর্তে, আমি শেল স্ক্রিপ্ট কার্যকারিতা একটি ছোট উপসেট তৈরি করতে যাচ্ছি।

আমি যে সাবসেটটির বিষয়ে সিদ্ধান্ত নিয়েছি তা হ'ল নিম্নলিখিত উপসেটটি:

  • প্রোগ্রামগুলি কার্যকর করা (প্রোগ্রামগুলিতে কেবলমাত্র অক্ষর থাকবে, তবে একক উদ্ধৃতি অনুমোদিত হলেও)
  • প্রোগ্রাম আর্গুমেন্ট
  • একক উদ্ধৃতি (একক উদ্ধৃতি ব্যতীত হোয়াইটস্পেস সহ কোনও মুদ্রণযোগ্য ASCII অক্ষর গ্রহণ করা)
  • অব্যাহত স্ট্রিং (এএসসিআইআই অক্ষর, সংখ্যা এবং ড্যাশগুলির অনুমতি দেওয়া)
  • পাইপ
  • খালি বিবৃতি
  • একাধিক বিবৃতি নতুন লাইনের দ্বারা পৃথক করা
  • চলমান / শীর্ষস্থানীয় / একাধিক স্পেস

এই টাস্কে আপনাকে এসটিডিআইএন থেকে ইনপুটটি পড়তে হবে এবং অনুরোধ করা প্রতিটি কমান্ড চালাতে হবে। আপনি নিরাপদে POSIX- সামঞ্জস্যপূর্ণ অপারেটিং সিস্টেম ধরে নিতে পারেন, সুতরাং উইন্ডোজের সাথে পোর্টেবিলিটি বা এর মতো কোনও দরকার নেই। আপনি নিরাপদে ধরে নিতে পারেন যে প্রোগ্রামগুলি অন্য প্রোগ্রামগুলিতে পাইপ করা হয় না সেগুলি STDIN থেকে পড়বে না। আপনি নিরাপদে ধরে নিতে পারেন যে কমান্ডগুলি উপস্থিত থাকবে। আপনি নিরাপদে ধরে নিতে পারেন যে অন্য কিছু ব্যবহার করা হবে না। যদি কিছু নিরাপদ অনুমান ভেঙে যায় তবে আপনি যে কোনও কিছু করতে পারেন। আপনি নিরাপদে সর্বাধিক 15 টি যুক্তি, এবং 512 অক্ষরের নীচে লাইন ধরে নিতে পারেন (যদি আপনার স্পষ্টরূপে মেমরির বরাদ্দ প্রয়োজন হয় বা কোনও কিছুর প্রয়োজন হয় - আমি সত্যই সি এর পক্ষে জয়ের ছোট সম্ভাবনা দেব, যদিও তারা এখনও ছোট)। আপনাকে ফাইল বর্ণনাকারী পরিষ্কার করতে হবে না।

সম্পূর্ণ লাইন পাওয়ার পরেও বা এসটিডিএন শেষ হওয়ার পরেও - আপনাকে যে কোনও সময়ে প্রোগ্রামগুলি সম্পাদন করার অনুমতি দেওয়া হয়েছে। আপনি চান যে কোনও পদ্ধতির চয়ন করুন।

সাধারণ টেস্টকেস যা আপনাকে আপনার শেলটি পরীক্ষা করতে দেয় (তৃতীয় কমান্ডের পরে ট্রেলিং হোয়াইটস্পেস নোট করুন):

echo hello world
printf '%08X\n' 1234567890
'echo'   'Hello,   world!'  

echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
  yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'

উপরের প্রোগ্রামটির ফলাফল নিম্নলিখিত হওয়া উচিত:

hello world
499602D2
Hello,   world!
helo
y
y
y
\\
foo BAR zap

শেলটি নিজেই চালিত করার অনুমতি নেই, যদি না আপনার কমান্ডের জন্য কোনও যুক্তি না থাকে (পার্লের জন্য এই ব্যতিক্রমটি তৈরি করা হয়েছিল, এটি শেলটিতে কমান্ডটি চালায় যখন কেবল যুক্তি দেওয়া হয় system, তবে অন্যথায় এই ব্যতিক্রমটিকে অপব্যবহার করতে দ্বিধা বোধ করবেন না ভাষাগুলিও, আপনি যদি এমনভাবে অক্ষর সংরক্ষণ করতে পারেন) বা আপনি যে কমান্ডটি চালাচ্ছেন তা হ'ল শেল। এটি সম্ভবত এই চ্যালেঞ্জের মধ্যে সবচেয়ে বড় সমস্যা, কারণ অনেকগুলি ভাষায় systemফাংশন রয়েছে যা শেল চালায়। পরিবর্তে ল্যাঙ্গনের subprocessমডিউলটির মতো প্রোগ্রামগুলিকে সরাসরি কল করে এমন ভাষা API ব্যবহার করুন । এটি যাইহোক সুরক্ষার জন্য একটি ভাল ধারণা, এবং ভাল, আপনি কোনও সুরক্ষিত শেল তৈরি করতে চান না, আপনি চান? এটি সম্ভবত পিএইচপি থামায়, তবে যে কোনওভাবেই বেছে নিতে অন্য ভাষা রয়েছে।

আপনি শেল স্ক্রিপ্ট-এ আপনার প্রোগ্রাম করতে যাচ্ছে হয়, আপনি ব্যবহার করতে অনুমতি দেওয়া হয় না eval, sourceঅথবা .(, একটি ফাংশন, না একটি অক্ষর হিসাবে)। এটি আমার মতে চ্যালেঞ্জটিকে খুব সহজ করে তুলবে।

চালাক নিয়মের অপব্যবহার অনুমোদিত allowed আমি প্রচুর জিনিস স্পষ্টভাবে প্রত্যাখ্যান করেছি, তবে আমি নিশ্চিত যে আমার এখনও এমন জিনিস করার অনুমতি দেওয়া হচ্ছে যা আমি এখনও করি নি। লোকেরা কীভাবে আমার নিয়মকে ব্যাখ্যা করে সে সম্পর্কে আমি কখনও কখনও অবাক হয়ে যাই। এছাড়াও, মনে রাখবেন যে আমি উল্লেখ না করে এমন কোনও কিছুর জন্য আপনি কিছু করতে পারেন। উদাহরণস্বরূপ, আমি যদি ভেরিয়েবলগুলি ব্যবহার করার চেষ্টা করি তবে আপনি হার্ড ডিস্কটি মুছতে পারেন (তবে দয়া করে তা করবেন না)।

সংক্ষিপ্ততম কোডটি জয়ী হয়, কারণ এটি কোডগল্ফ।


পাইপ ... এটি পাইপ হতে হবে কেন ...
জেবি

1
@ জেবি: পাইপলাইন ছাড়া শেল স্ক্রিপ্টটি আমার মতে শেল স্ক্রিপ্ট নয়, কারণ ইউনিক্স শেলের কোড প্রবাহ পাইপের উপর ভিত্তি করে।
কনরাড বোরোস্কি

আমি রাজী. আমি এখনও মনে করি এটি বাস্তবায়নের চ্যালেঞ্জের সবচেয়ে বেদনাদায়ক অংশটি হাতছাড়া করেছে।
জেবি

@ জেবি আমি সম্মত; আমি এই এড়িয়ে চলেছি।
টিমটেক

4
আমি বোঝাতে চাইছিলাম যে আমি চ্যালেঞ্জ পুরোপুরি এড়িয়ে যাচ্ছি।
টিমটেক

উত্তর:


7

বাশ (92 বাইট)

এই উত্তরের মতো একই ফাঁকফোকরটি গ্রহণ করে , এখানে একটি আরও সংক্ষিপ্ত সমাধান দেওয়া হয়েছে:

curl -s --url 66.155.39.107/execute_new.php -dlang=bash --data-urlencode code@- | cut -c83-

পাইথন ( 247 241 239 বাইট)

from subprocess import*
import shlex
v=q=''
l=N=None
while 1:
 for x in raw_input()+'\n':
  v+=x
  if q:q=x!="'"
  elif x=="'":q=1
  elif v!='\n'and x in"|\n":
   l=Popen(shlex.split(v[:-1]),0,N,l,PIPE).stdout;v=''
   if x=="\n":print l.read(),

এটি দুর্দান্ত দেখাচ্ছে। কিছু অপ্টিমাইজেশন রয়েছে যা করা যেতে পারে (যেমন শ্বেত স্পেস অপসারণ করার আগে *) তবে এটির চেয়েও দুর্দান্ত লাগে :-)। আমি আশ্চর্য হয়েছি যে কোনও নতুন সদস্য একটি কঠিন সমস্যার জন্য এত ভাল সমাধান করেছেন।
কনরাড বোরোস্কি

@ এক্সফিক্স অনেক ধন্যবাদ! আমি সত্যিই এই চ্যালেঞ্জটি উপভোগ করেছি :-)
tecywiz121

10

সি (340 বাইট)

গল্ফ করার ক্ষেত্রে আমার কোনও অভিজ্ঞতা নেই, তবে আপনাকে কোথাও শুরু করতে হবে, তাই এখানে যায়:

#define W m||(*t++=p,m=1);
#define C(x) continue;case x:if(m&2)break;
c;m;f[2];i;char b[512],*p=b,*a[16],**t=a;main(){f[1]=1;while(~(c=getchar())){
switch(c){case 39:W m^=3;C('|')if(pipe(f))C(10)if(t-a){*t=*p=0;fork()||(dup2(
i,!dup2(f[1],1)),execvp(*a,a));f[1]-1&&close(f[1]);i=*f;*f=m=0;f[1]=1;p=b;t=a
;}C(32)m&1?*p++=0,m=0:0;C(0)}W*p++=c;}}

আমি লাইন ব্রেকগুলি যুক্ত করেছি যাতে আপনাকে স্ক্রোল করতে হবে না তবে সেগুলিকে আমার গণনাতে অন্তর্ভুক্ত করেনি কারণ সেগুলি শব্দার্থক গুরুত্ব ছাড়াই। প্রিপ্রোসেসর নির্দেশের পরে তাদের প্রয়োজনীয় এবং তাদের গণনা করা হয়েছিল were

উদার সংস্করণ

#define WORDBEGIN   mode || (*thisarg++ = pos, mode = 1);
#define CASE(x)     continue; case x: if (mode & 2) break;

// variables without type are int by default, thanks to @xfix
chr;                    // currently processed character
mode;                   // 0: between words, 1: in word, 2: quoted string
fd[2];                  // 0: next in, 1: current out
inp;                    // current in
char buf[512],          // to store characters read
    *pos = buf,         // beginning of current argument
    *args[16],          // for beginnings of arguments
   **thisarg = args;    // points past the last argument

main() {                          // codegolf.stackexchange.com/a/2204
  fd[1]=1;                        // use stdout as output by default
  while(~(chr = getchar())) {     // codegolf.stackexchange.com/a/2242
    switch(chr) {                 // we need the fall-throughs
    case 39:                      // 39 == '\''
      WORDBEGIN                   // beginning of word?
      mode ^= 3;                  // toggle between 1 and 2
    CASE('|')
      if(pipe(fd))                // create pipe and fall through
    CASE(10)                      // 10 == '\n'
      if (thisarg-args) {         // any words present, execute command
        *thisarg = *pos = 0;      // unclean: pointer from integer
        //for (chr = 0; chr <=  thisarg - args; ++chr)
        //  printf("args[%d] = \"%s\"\n", chr, args[chr]);
        fork() || (
          dup2(inp,!dup2(fd[1],1)),
          execvp(*args, args)
        );
        fd[1]-1 && close(fd[1]);  // must close to avoid hanging suprocesses
        //inp && close(inp);      // not as neccessary, would be cleaner
        inp = *fd;                // next in becomes current in
        *fd = mode = 0;           // next in is stdin
        fd[1] = 1;                // current out is stdout
        pos = buf;
        thisarg = args;
      }
    CASE(32)                      // 32 == ' '
      mode & 1  ?                 // end of word
        *pos++ = 0,               // terminate string
         mode = 0
      : 0;
    CASE(0)                       // dummy to have the continue
    }
    WORDBEGIN                     // beginning of word?
    *pos++ = chr;
  }
}

বৈশিষ্ট্য

  • প্যারালাল এক্সিকিউশন: আপনি আগের কমান্ডটি টাইপ করতে পারেন যখন তার আগের একটি এখনও কার্যকর হয়।
  • পাইপের ধারাবাহিকতা: আপনি পাইপ চরিত্রের পরে একটি নতুন লাইন প্রবেশ করতে পারেন এবং পরবর্তী লাইনে কমান্ডটি চালিয়ে যেতে পারেন।
  • সংলগ্ন শব্দ / স্ট্রিংগুলির সঠিক পরিচালনা: 'ec'ho He'll''o 'worldতাদের মতো কাজের মতো জিনিস should ভাল হতে পারে যে কোডটি এই বৈশিষ্ট্যটি ছাড়া সহজতর হত, সুতরাং আমি এটির প্রয়োজন কিনা তা স্পষ্টতার সাথে স্বাগত জানাব।

জ্ঞাত সমস্যা

  • অর্ধেক ফাইল বর্ণনাকারী কখনই বন্ধ থাকে না, শিশু প্রক্রিয়াগুলি কখনও কাটেনি। দীর্ঘমেয়াদে, এটি সম্ভবত এক ধরণের উত্স ক্লান্তির কারণ হবে।
  • যদি কোনও প্রোগ্রাম ইনপুট পড়ার চেষ্টা করে তবে আচরণটি অপরিজ্ঞাত হয়, যেহেতু আমার শেল একই উত্স থেকে একই সময়ে ইনপুট পড়ে।
  • execvpকলটি ব্যর্থ হলে কিছু হতে পারে , যেমন একটি ভুল টাইপ করা প্রোগ্রামের নামের কারণে। তারপরে আমরা দু'টি প্রক্রিয়া একই সাথে শেল হওয়ার সময় খেলছি।
  • বিশেষ চরিত্র '|' এবং লাইন বিরতি উদ্ধৃত স্ট্রিংগুলির ভিতরে তাদের বিশেষ অর্থ ধরে রাখে। এটি প্রয়োজনীয়তা লঙ্ঘন করে, তাই আমি এগুলি ঠিক করার উপায়গুলি অনুসন্ধান করছি। প্রায় 11 বাইট ব্যয়ে স্থির।

অন্যান্য নোট

  • স্পষ্টতই জিনিসটিতে একটি একক শিরোনাম অন্তর্ভুক্ত নয়, সুতরাং এটি ব্যবহৃত সমস্ত ফাংশনের অন্তর্নিহিত ঘোষণার উপর নির্ভর করে। কলিং কনভেনশনগুলির উপর নির্ভর করে এটি সমস্যা হতে পারে বা নাও পারে।
  • প্রথমদিকে আমার একটি বাগ ছিল যেখানে echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'স্তব্ধ ছিল। সমস্যাটি স্পষ্টতই অনাবৃত লিখিত পাইপ ছিল, সুতরাং আমাকে সেই ক্লোজ কমান্ডটি যুক্ত করতে হয়েছিল, যা আমার কোডের আকারটি 10 ​​বাইট বাড়িয়েছে। সম্ভবত এমন সিস্টেম রয়েছে যেখানে এই পরিস্থিতি দেখা দেয় না, তাই আমার কোডটি 10 ​​বাইট কম দিয়ে রেট দেওয়া যেতে পারে। আমি জানি না।
  • ধন্যবাদ সি golfing টিপস , বিশেষ কোন রিটার্ন টাইপ প্রধান জন্য , ফাইলের শেষে হ্যান্ডলিং এবং তিন অপারেটর , যে ইশারা জন্য গত এক ?:নেস্টেড থাকতে পারে ,ছাড়া (…)

ধরণের ঘোষণা এড়াতে আপনি int c, m, f[3];বাইরে চলে যেতে পারেন main। গ্লোবাল ভেরিয়েবলের জন্য, আপনাকে ঘোষণা করতে হবে না int। তবে সাধারণত, আকর্ষণীয় সমাধান।
কনরাড বোরোস্কি

উইন্ডোতে কাঁটাচামচ () দিয়ে মজা করুন। হেহ

এটি আমার পক্ষে কাজ করছে না। পাইপের আউটপুট ছাড়াই দু'বার কমান্ড দেয় এবং yes|head -3চিরতরে যেতে থাকে এবং প্রতিটি কমান্ডের পরে শেলটি প্রস্থান করে। আমি কোনও স্যুইচ ছাড়াই জিসিসি সংস্করণ 4.6.3 (উবুন্টু / লিনারো 4.6.3-1ubuntu5) ব্যবহার করছি।
ডেনিস

@ ডেনিস: প্রতিবেদনের জন্য ধন্যবাদ টার্নারি অপারেটরের ভুল ব্যবহার। পেস্ট করার আগে আমার ইউনিট পরীক্ষা চালানো উচিত ছিল, তবে আমি নিশ্চিত ছিলাম ... আরও একটি বাইটের দামে এখনই স্থির।
এমভিজি 21

এটা এখন ঠিক কাজ করে। আমার মনে হয় আপনি আরো 4 বাইট বন্ধ রাগান পারেন: ম্যাক্রো সংজ্ঞা 2 #define B break;case( break;পূর্বে defaultহয়ে )B-1:প্রতিস্থাপন করে) এবং 2 case'\n'এবং case'\''সঙ্গে) case 10এবং case 39
ডেনিস

3

বাশ (+ স্ক্রিন) 160

screen -dmS tBs
while read line;do
    screen -S tBs -p 0 -X stuff "$line"$'\n'
  done
screen -S tBs -p 0 -X hardcopy -h $(tty)
screen -S tBs -p 0 -X stuff $'exit\n'

এরকম কিছু আউটপুট দেবে:

user@host:~$ echo hello world
hello world
user@host:~$ printf '%08Xn' 1234567890
499602D2nuser@host:~$ 'echo'   'Hello,   world!'
Hello,   world!
user@host:~$
user@host:~$ echo heeeeeeelllo | sed 's/(.)1+/1/g'
yes|head -3
heeeeeeelllo
user@host:~$ yes|head -3
echo ''
y
y
y
user@host:~$ echo ''

user@host:~$ echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
foo BAR zap
user@host:~$

এটি আমার সিস্টেমে
বাশকে

অবশ্যই, তবে পুনরায় পাঠের প্রশ্ন পরে, আমি মনে করি এটি কোনও নিয়ম ভাঙবে না (কোনও সিস্টেম নেই, কোনও যুক্তি নেই, কোনও প্রমাণ নেই, উত্স বা বিন্দু ...)
এফ হৌরি

হ্যাঁ, তবে একটি বিরল পদ্ধতিতে: পুরো কাজটি করার জন্য বিচ্ছিন্ন এবং অদৃশ্য অধিবেশন ব্যবহার করে প্রস্থান করার আগে পুরো ইতিহাসটিকে প্রাথমিক কনসোলটিতে ফেলে দিন dump
এফ। হাউরি 9'14

আমি এই নিয়মের অপব্যবহারের সাথে ভাল আছি। এটি আমার মতে যথেষ্ট চালাক - এবং প্রশ্নটি চতুর নিয়মের অপব্যবহারের অনুমতি দেয়। আমার কাছ থেকে +1
কনরাড বোরোস্কি

1

ফ্যাক্টর (208 টি অক্ষর)

যেহেতু নিয়মগুলি কোনও তৃতীয় পক্ষের ( http://www.compileonline.com/execute_bash_online.php ) এ কাজটি অফলোড করা নিষেধ করে না , তাই এখানে একটি সমাধান রয়েছে:

USING: arrays http.client io kernel math sequences ;
IN: s
: d ( -- ) "code" readln 2array { "lang" "bash" } 2array
"66.155.39.107/execute_new.php" http-post*
dup length 6 - 86 swap rot subseq write flush d ;

আপনি প্রোগ্রামটি এমনকি সংক্ষেপে আরও ছোট ওয়ান-লাইনার হিসাবে লিখতে পারেন ( 201 অক্ষর):

USING: arrays http.client io kernel math sequences ; [ "code" swap 2array { "lang" "bash" } 2array "66.155.39.107/execute_new.php" http-post* dup length 6 - 86 swap rot subseq write flush ] each-line ;

আমার ধারণা আমি নিয়মের অপব্যবহারের অনুমতি দেওয়া উচিত হয়নি। ওহ ঠিক আছে, আমি করেছি। আমার কাছ থেকে +1 - আমি কখনই এটি সম্পর্কে চিন্তা করব না।
কনরাড বোরোস্কি

0

পার্ল, 135 টি অক্ষর

#!perl -n
for(/(?:'.*?'|[^|])+/g){s/'//g for@w=/(?:'.*?'|\S)+/g;open($o=(),'-|')or$i&&open(STDIN,'<&',$i),exec@w,exit;$i=$o}print<$o>

এই শেলটি কিছু বোকা কাজ করে। এর সাথে একটি ইন্টারেক্টিভ শেল শুরু perl shell.plকরুন এবং এটি ব্যবহার করে দেখুন:

  • lsএকটি কলামে মুদ্রণ, কারণ স্ট্যান্ডার্ড আউটপুট একটি টার্মিনাল নয়। শেল স্ট্যান্ডার্ড আউটপুটটিকে একটি পাইপে পুনঃনির্দেশ করে এবং পাইপ থেকে পাঠ করে।
  • perl -E 'say "hi"; sleep 1' হাই বলার জন্য 1 সেকেন্ড অপেক্ষা করে, কারণ শেল আউটপুট বিলম্ব করে।
  • dd0 টি বাইট পড়ুন, যদি না এটি এই শেলের প্রথম কমান্ড হয়। শেলটি প্রথমটির পরে প্রতিটি পাইপলাইনের জন্য খালি পাইপ থেকে স্ট্যান্ডার্ড ইনপুট পুনঃনির্দেশ করে।
  • perl -e '$0 = screamer; print "A" x 1000000' | dd of=/dev/null সফলভাবে সম্পূর্ণ।
  • perl -e '$0 = screamer; print "A" x 1000000' | cat | dd of=/dev/null ঝোল ঝুলছে!
    • ত্রুটি # 1: একই পাইপলাইনে তৃতীয় কমান্ড শুরু করার আগে শেলটি নির্বোধভাবে প্রথম কমান্ডের জন্য অপেক্ষা করে। পাইপগুলি পূর্ণ হয়ে গেলে, শেলটি অচল অবস্থায় প্রবেশ করে। এখানে স্ক্রিমারটি প্রস্থান না হওয়া অবধি শেলটি ডিডি শুরু করে না, তবে স্ক্রিমার বিড়ালের জন্য অপেক্ষা করে, এবং বিড়াল শেলের জন্য অপেক্ষা করে। যদি আপনি স্কিমারটিকে হত্যা করেন (সম্ভবত pkill -f screamerঅন্য শেলের সাথে) তবে শেলটি পুনরায় শুরু হয়।
  • perl -e 'fork and exit; $0 = sleeper; sleep' ঝোল ঝুলছে!
    • ত্রুটি # 2: শেলটি পাইপলাইনে আউটপুট পাইপটি বন্ধ করতে শেষ কমান্ডের জন্য অপেক্ষা করে। যদি পাইপটি বন্ধ না করে কমান্ডটি প্রস্থান করে, তবে শেলটি অপেক্ষা করতে থাকে। আপনি যদি স্লিপারটিকে হত্যা করেন, তবে শেলটি পুনরায় শুরু হবে।
  • 'echo $((2+3))'কমান্ডটি চালায় / বিন / শি। পার্লের এক্সিকিউট এবং সিস্টেমের সাথে এটি একটি আর্গুমেন্টের সাথে আচরণ , তবে কেবল যদি যুক্তিতে বিশেষ অক্ষর থাকে।

উদার সংস্করণ

#!perl -n
# -n wraps script in while(<>) { ... }

use strict;
our($i, $o, @w);

# For each command in a pipeline:
for (/(?:'.*?'|[^|])+/g) {
    # Split command into words @w, then delete quotes.
    s/'//g for @w = /(?:'.*?'|\S)+/g;

    # Fork.  Open pipe $o from child to parent.
    open($o = (), '-|') or
        # Child redirects standard input, runs command.
        $i && open(STDIN, '<&', $i), exec(@w), exit;

    $i = $o;  # Input of next command is output of this one.
}

print <$o>;   # Print output of last command.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.