<<

ߞ The Plan 9

Tom Duff [email protected]−labs.com

ABSTRACT

Rc EI = ?omm=n@ EnJAHFHAJAH BoH 2l=n ' JD=J FHoLE@AI IEmEl=H B=?ElEJEAI Jo 7N1:ߣI *oKHnA IDAll, MEJD IomA Im=ll =@@EJEonI =n@ lAII E@EoIOn?H=JE? IOnJ=N. 6DEI F=FAH KIAI nKmAHoKI AN=mFlAI Jo @AI?HE>A rcߣI BA=JKHAI, =n@ ?onJH=IJI rc MEJD JDA *oKHnA IDAll, = mo@Al JD=J m=nO HA=@AHI MEll >A B=mElE=HMEJD.

1. Introduction Rc EI IEmEl=H En IFEHEJ >KJ @EBBAHAnJ En @AJ=El BHom 7N1:ߣI *oKHnA IDAll. 6DEI F=FAH @AI?HE>AI rcߣI FHEn?EF=l BA=JKHAI MEJD m=nO Im=ll AN=mFlAI =n@ = BAM l=HCAH onAI. 1J =IIKmAIB=mElE=HEJOMEJDJDA*oKHnAIDAll.

2. Simple commands .oH JDA IEmFlAIJ KIAI rc D=I IOnJ=N B=mElE=H Jo *oKHnA-IDAll KIAHI. )ll oB JDA Bol­ loMEnC>AD=LA=IANFA?JA@:

date /lib/news/build >user.names who >>user.names

3. Quotation )n =HCKmAnJ JD=J ?onJ=EnI = IF=?A oH onA oB rcߣI oJDAH IOnJ=N ?D=H=?JAHI mKIJ >A An?loIA@En=FoIJHoFDAI’: rm ’odd name’ )n=FoIJHoFDAEn=GKoJA@=HCKmAnJmKIJ>A@oK>lA@:

echo ’How’’s your father?’

4. Patterns )n KnGKoJA@ =HCKmAnJ JD=J ?onJ=EnI =nO oB JDA ?D=H=?JAHI *?[EI = F=JJAHn Jo >A m=J?DA@ =C=EnIJ BElA n=mAI. ) * ?D=H=?JAH m=J?DAI =nO IAGKAn?A oB ?D=H=?JAHI, ? m=J?DAI =nO IEnClA ?D=H=?JAH, =n@ [class] m=J?DAI =nO ?D=H=?JAH En JDA class, KnlAII JDA BEHIJ ?D=H=?JAH oB class EI ~, En MDE?D ?=IA JDA ?l=II EI ?omFlAmAnJA@. 6DA class m=O ­ ­

=lIo ?onJ=En F=EHI oB ?D=H=?JAHI IAF=H=JA@ >O −, IJ=n@EnC BoH =ll ?D=H=?JAHI lANE?=llO >AJMAAn JDA JMo. 6DA ?D=H=?JAH / mKIJ =FFA=H ANFlE?EJlO En = F=JJAHn, =I mKIJ JDA F=JD n=mA ?omFonAnJI . =n@ ... ) F=JJAHn EI HAFl=?A@ >O = lEIJ oB =HCKmAnJI, onA BoH A=?D F=JD n=mA m=J?DA@, AN?AFJ JD=J = F=JJAHn m=J?DEnC no n=mAI EI noJ HAFl=?A@ >O JDA AmFJOlEIJ;H=JDAHEJIJ=n@IBoHEJIAlB.

5. Variables 7N1:ߣI *oKHnA IDAll oBBAHI IJHEnC-L=lKA@ L=HE=>lAI. Rc FHoLE@AI L=HE=>lAI MDoIA L=lKAI =HA lEIJI oB =HCKmAnJI ߞ JD=J EI, =HH=OI oB IJHEnCI. 6DEI EI JDA FHEn?EF=l @EBBAHAn?A >AJMAAn rc =n@ JH=@EJEon=l 7N1: ?omm=n@ EnJAHFHAJAHI. 8=HE=>lAI m=O >A CELAn L=lKAI >OJOFEnC,BoHAN=mFlA:

=(. /bin) user=td font=/lib/font/bit/pelm/.9.font 6DA F=HAnJDAIAI En@E?=JA JD=J JDA L=lKA =IIECnA@ Jo path EI = lEIJ oB JMo IJHEnCI. 6DA L=HE=>lAI user =n@ font =HA=IIECnA@lEIJI?onJ=EnEnC=IEnClAIJHEnC. 6DA L=lKA oB = L=HE=>lA ?=n >A IK>IJEJKJA@ EnJo = ?omm=n@ >O FHA?A@EnC EJI n=mA MEJD= $,lEkAJDEI: echo $path 1B path D=@>AAnIAJ=I=>oLA,JDEIMoKl@>AAGKEL=lAnJJo echo . /bin 8=HE=>lAIm=O>AIK>I?HEFJA@>OnKm>AHIoHlEIJIoBnKm>AHI,lEkAJDEI:

echo $path(2) echo $path(2 1 2) 6DAIA=HAAGKEL=lAnJJo

echo /bin echo /bin . /bin 6DAHA ?=n >A no IF=?A IAF=H=JEnC JDA L=HE=>lAߣI n=mA BHom JDA lABJ F=HAnJDAIEI; oJDAH­ MEIA,JDAIK>I?HEFJMoKl@>A?onIE@AHA@=IAF=H=JAF=HAnJDAIEzA@lEIJ. 6DA nKm>AH oB IJHEnCI En = L=HE=>lA ?=n >A @AJAHmEnA@ >O JDA $# oFAH=JoH. .oH AN=mFlA,

echo $#path MoKl@FHEnJ BoHJDEIAN=mFlA. 6DABolloMEnCJMo=IIECnmAnJI=HAIK>JlO@EBBAHAnJ:

empty=() null=’’ 6DABEHIJIAJI empty Jo=lEIJ?onJ=EnEnCnoIJHEnCI. 6DAIA?on@IAJI null Jo= lEIJ ?on­ J=EnEnC=IEnClAIJHEnC,>KJJDAIJHEnC?onJ=EnIno?D=H=?JAHI. )lJDoKCD JDAIA m=O IAAm lEkA moHA oH lAII JDA I=mA JDEnC En *oKHnAߣI IDAll, JDAO =HA En@EIJEnCKEID=>lA, JDAO >AD=LA @EBBAHAnJlO En =lmoIJ =ll ?EH?KmIJ=n?AI. )monC oJDAH JDEnCI

echo $#empty FHEnJI,MDAHA=I

echo $#null FHEnJI . ­!­

)llL=HE=>lAIJD=JD=LAnALAH>AAnIAJD=LAJDAL=lKA (). O??=IEon=llO, EJ EI ?onLAnEAnJ Jo JHA=J = L=HE=>lAߣI L=lKA =I = IEnClA IJHEnC. 6DA AlA­ mAnJI oB = IJHEnC =HA ?on?=JAn=JA@ EnJo = IEnClA IJHEnC, MEJD IF=?AI >AJMAAn JDA AlA­ mAnJI,>OJDA $" oFAH=JoH. 6DKI,EBMAIAJ list=(How now brown cow) string=$"list JDAn>oJD

echo $list =n@

echo $string ?=KIAJDAI=mAoKJFKJ,LEz:

How now brown cow >KJ

echo $#list $#string MElloKJFKJ

41 >A?=KIA $list D=I BoKH mAm>AHI, >KJ $string D=I = IEnClA mAm>AH, MEJD JDHAA IF=?AIIAF=H=JEnCEJIMoH@I.

6. Arguments 9DAn rc EI HA=@EnC EJI EnFKJ BHom = BElA, JDA BElA D=I =??AII Jo JDA =HCKmAnJI IKF­ FlEA@ on rcߣI ?omm=n@ lEnA. 6DA L=HE=>lA $* EnEJE=llO D=I JDA lEIJ oB =HCKmAnJI =IIECnA@ Jo EJ. 6DA n=mAI $1, $2, AJ?. =HA IOnonOmI BoH $*(1), $*(2), AJ?. 1n =@@EJEon, $0 EI JDAn=mAoBJDABElABHomMDE?D rcߣIEnFKJEI>AEnCHA=@.

7. Concatenation Rc D=I = IJHEnC ?on?=JAn=JEon oFAH=JoH, JDA ?=HAJ ^, Jo >KEl@ =HCKmAnJI oKJ oB FEA?AI.

echo hully^gully EIAN=?JlOAGKEL=lAnJJo

echo hullygully 5KFFoIAL=HE=>lA i ?onJ=EnIJDAn=mAoB=?omm=n@. 6DAn vc $i^.c vl −o $1 $i^.v mECDJ?omFElAJDA?omm=n@ߣIIoKH?A?o@A,lA=LEnCJDAHAIKlJEnJDA=FFHoFHE=JABElA. +on?=JAn=JEon@EIJHE>KJAIoLAHlEIJI.6DABolloMEnC

echo (a b c)^(1 2 3) src=(main subr io) cc $src^.c =HAAGKEL=lAnJJo

echo a1 b2 c3 cc main.c subr.c io.c 1n @AJ=El, JDA HKlA EI: EB >oJD oFAH=n@I oB ^ =HA lEIJI oB JDA I=mA non-zAHo nKm>AH oB IJHEnCI, JDAO =HA ?on?=JAn=JA@ F=EHMEIA. OJDAHMEIA, EB onA oB JDA oFAH=n@I EI = IEnClA ­"­

IJHEnC, EJ EI ?on?=JAn=JA@ MEJD A=?D mAm>AH oB JDA oJDAH oFAH=n@ En JKHn. )nO oJDAH ?om>En=JEonoBoFAH=n@IEI=nAHHoH.

8. Free carets 7IAH@Am=n@D=I@E?J=JA@JD=J rc EnIAHJ?=HAJIEn ?AHJ=En Fl=?AI, Jo m=kA JDA IOnJ=N lookmoHAlEkAJDA*oKHnAIDAll. .oHAN=mFlA,JDEI:

cc −$flags $stems.c EIAGKEL=lAnJJo

cc −^$flags $stems^.c 1n CAnAH=l, rc MEll EnIAHJ ^ >AJMAAn JMo =HCKmAnJI JD=J =HA noJ IAF=H=JA@ >O MDEJA IF=?A. 5FA?EBE?=llO, MDAnALAH onA oB $’‘ BolloMI = GKoJA@ oH KnGKoJA@ MoH@, oH =n KnGKoJA@ MoH@ BolloMI = GKoJA@ MoH@ MEJD no EnJAHLAnEnC >l=nkI oH J=>I, =n EmFlE?EJ ^ EI EnIAHJA@ >AJMAAn JDA JMo. 1B =n KnGKoJA@ MoH@ EmmA@E=JAlO BolloMEnC = $ ?onJ=EnI = ?D=H=?JAH oJDAH JD=n =n =lFD=nKmAHE?, Kn@AHI?oHA oH *,=^ EI EnIAHJA@ >ABoHA JDA BEHIJ IK?D?D=H=?JAH.

9. 1J EI oBJAn KIABKl Jo >KEl@ =n =HCKmAnJ lEIJ BHom JDA oKJFKJ oB = ?omm=n@. Rc =lloMI = ?omm=n@, An?loIA@ En >H=?AI =n@FHA?A@A@>O=lABJGKoJA, ‘{...},=nOMDAHA JD=J =n =HCKmAnJ EI HAGKEHA@. 6DA ?omm=n@ EI ANA?KJA@ =n@ EJI IJ=n@=H@ oKJFKJ ?=F­ JKHA@. 6DA ?D=H=?JAHI IJoHA@ En JDA L=HE=>lA ifs =HA KIA@ Jo IFlEJ JDA oKJFKJ EnJo =HCK­ mAnJI. .oHAN=mFlA,

cat ‘{| 10q} MEll ?on?=JAn=JA JDA JAn ol@AIJ BElAI En JDA ?KHHAnJ @EHA?JoHO En JAmFoH=l oH@AH, CELAn JDA @AB=KlJ ifs IAJJEnCoBIF=?A,J=>,=n@nAMlEnA.

10. branching 6DA noHm=l FEFAlEnA noJ=JEon EI CAnAH=l AnoKCD BoH =lmoIJ =ll ?=IAI. 8AHO o??=­ IEon=llO EJ EI KIABKl Jo D=LA FEFAlEnAI JD=J =HA noJ lEnA=H. 2EFAlEnA JoFoloCEAI moHA CAn­ AH=l JD=n JHAAI ?=n HAGKEHA =H>EJH=HElO l=HCA FEFA >KBBAHI, oH MoHIA, ?=n ?=KIA @A=@lo?k. Rc D=IIOnJ=NBoHIomAkEn@IoBnon-lEnA=H>KJJHAAlEkAFEFAlEnAI. .oHAN=mFlA, <{old} <{new} MEll HACHAIIEon-JAIJ = nAM LAHIEon oB = ?omm=n@. < oH > BolloMA@ >O = ?omm=n@ En >H=?AI ?=KIAI JDA ?omm=n@ Jo >A HKn MEJD EJI IJ=n@=H@ oKJFKJ oH EnFKJ =JJ=?DA@ Jo = FEFA. 6DA F=HAnJ ?omm=n@ cmp En JDA AN=mFlA EI IJ=HJA@ MEJD JDA oJDAH An@ oB JDA FEFA =JJ=?DA@ Jo IomA BElA @AI?HEFJoH oH oJDAH, =n@ MEJD =n =HCKmAnJ JD=J MEll ?onnA?J Jo JDA FEFA MDAn oFAnA@ A.C., /dev/fd/6. 5omA ?omm=n@I =HA KnFHAF=HA@ Jo @A=l MEJD EnFKJ BElAI JD=J JKHn oKJ noJ Jo >A IAAk=>lA. .oH AN=mFlA nAA@I Jo HA=@ EJI EnFKJJME?A.

11. status 9DAn=?omm=n@ANEJI EJ HAJKHnI IJ=JKI Jo JDA FHoCH=m JD=J ANA?KJA@ EJ. On 2l=n ' IJ=JKI EI = ?D=H=?JAH IJHEnC @AI?HE>EnC =n AHHoH ?on@EJEon. On noHm=l JAHmEn=JEon EJ EI AmFJO. Rc ?=FJKHAI ?omm=n@ ANEJ IJ=JKI En JDA L=HE=>lA $status. .oH = IEmFlA ?om­ m=n@ JDA L=lKA oB $status EI jKIJ =I @AI?HE>A@ =>oLA. .oH = FEFAlEnA $status EI IAJ Jo JDA ?on?=JAn=JEon oB JDA IJ=JKIAI oB JDA FEFAlEnA ?omFonAnJI MEJD | ?D=H=?JAHI BoH IAF=H=JoHI. Rc D=I = IALAH=l kEn@I oB ?onJHol BloM, m=nO oB JDAm ?on@EJEonA@ >O JDA IJ=JKI ­#­

HAJKHnA@ BHom FHALEoKIlO ANA?KJA@ ?omm=n@I. )nO $status ?onJ=EnEnC onlO 0ߣI =n@ |ߣID=I>oolA=nL=lKA true. )nOoJDAHIJ=JKIEI false.

12. Command grouping ) IAGKAn?A oB ?omm=n@I An?loIA@ En {} m=O >A KIA@ =nOMDAHA = ?omm=n@ EI HAGKEHA@. .oHAN=mFlA:

{ 3600;echo ’’’s up!’}& MEllM=EJ=nDoKHEnJDA>=?kCHoKn@,JDAnFHEnJ=mAII=CA. 9EJDoKJJDA>H=?AI,

sleep 3600;echo ’Time’’s up!’& MoKl@lo?kKFJDAJAHmEn=lBoH=nDoKH,JDAnFHEnJJDAmAII=CAEnJDA>=?kCHoKn@.

13. ߞ for ) ?omm=n@ m=O >A ANA?KJA@ on?A BoH A=?D mAm>AH oB = lEIJ >O JOFEnC, BoH AN=m­ FlA:

for(i in scanf putchar) look $i /usr/td/lib/dw.dat 6DEI lookI BoH A=?D oB JDA MoH@I printf, scanf =n@ putchar En JDA CELAn BElA. 6DA CAnAH=lBoHmEI

for(name in list) command oH

for(name) command 1n JDA BEHIJ ?=IA command EI ANA?KJA@ on?A BoH A=?D mAm>AH oB list MEJD JD=J mAm>AH =IIECnA@JoL=HE=>lA name. 1BJDA?l=KIAߢߢin listߣߣ EImEIIEnC,ߢߢin $*ߣߣ EI=IIKmA@.

14. Conditional execution ߞ if Rc =lIoFHoLE@AI=CAnAH=lEB-IJ=JAmAnJ. .oHAN=mFlA: for(i in *.c) if(cpp $i >/tmp/$i) vc /tmp/$i HKnI JDA + ?omFElAH on A=?D + IoKH?A FHoCH=m JD=J ?FF FHo?AIIAI MEJDoKJ AHHoH. )n ߢEB noJߣ IJ=JAmAnJFHoLE@AI=JMo-J=ElA@?on@EJEon=l. .oHAN=mFlA:

for(i){ if( −f /tmp/$i) echo $i already in /tmp if not $i /tmp } 6DEIlooFIoLAHA=?DBElAEn $*, ?oFOEnC Jo /tmp JDoIA JD=J @o noJ =lHA=@O =FFA=H JDAHA, =n@FHEnJEnC=mAII=CABoHJDoIAJD=J@o.

15. Control flow ߞ while RcߣIMDElAIJ=JAmAnJlookIlEkAJDEI: while(newer subr.v subr.c) sleep 5 6DEI M=EJI KnJEl subr.v EI nAMAH JD=n subr.c, FHAIKm=>lO >A?=KIA JDA + ?omFElAH BEnEIDA@MEJDEJ. 1BJDA?onJHollEnC?omm=n@EIAmFJO,JDAlooFMEllnoJJAHmEn=JA. 6DKI,

while() echo y AmKl=JAIJDA ?omm=n@. ­$­

16. Control flow ߞ switch Rc FHoLE@AI = IMEJ?D IJ=JAmAnJ Jo @o F=JJAHn-m=J?DEnC on =H>EJH=HO IJHEnCI. 1JI CAnAH=lBoHmEI

switch(word){ case pattern ... commands case pattern ... commands ... } Rc =JJAmFJI Jo m=J?D JDA MoH@ =C=EnIJ JDA F=JJAHnI En A=?D ?=IA IJ=JAmAnJ En JKHn. 2=J­ JAHnI =HA JDA I=mA =I BoH BElAn=mA m=J?DEnC, AN?AFJ JD=J / =n@ . =n@ .. nAA@ noJ >A m=J?DA@ANFlE?EJlO. 1B =nO F=JJAHn m=J?DAI, JDA ?omm=n@I BolloMEnC JD=J ?=IA KF Jo JDA nANJ ?=IA oH JDA An@ oB JDA IMEJ?D =HA ANA?KJA@, =n@ ANA?KJEon oB JDA IMEJ?D EI ?omFlAJA. .oH AN=m­ FlA,

switch($#*){ case 1 cat >>$1 case 2 cat >>$2 <$1 case * echo ’Usage: append [from] to’ } EI =n =FFAn@ ?omm=n@. +=llA@ MEJD onA BElA =HCKmAnJ, EJ =FFAn@I EJI IJ=n@=H@ EnFKJ Jo JDA n=mA@ BElA. 9EJD JMo, JDA BEHIJ EI =FFAn@A@ Jo JDA IA?on@. )nO oJDAH nKm>AH AlE?EJI =nAHHoHmAII=CA. 6DA >KElJ-En ~ ?omm=n@ =lIo m=J?DAI F=JJAHnI, =n@ EI oBJAn moHA ?on?EIA JD=n = IMEJ?D. 1JI =HCKmAnJI =HA = IJHEnC =n@ = lEIJ oB F=JJAHnI. 1J IAJI $status Jo JHKA EB =n@ onlO EB =nO oB JDA F=JJAHnI m=J?DAI JDA IJHEnC. 6DA BolloMEnC AN=mFlA FHo?AIIAI oFJEon =HCKmAnJIBoHJDA man ?omm=n@: opt=() while(~ $1 −* [1−9] 10){ switch($1){ case [1−9] 10 sec=$1 secn=$1 case −f c=f s=f case −[qwnt] cmd=$1 case −T* T=$1 case −* opt=($opt $1) } shift }

17. Functions .Kn?JEonIm=O>A@ABEnA@>OJOFEnC

fn name { commands } 5K>IAGKAnJlO, MDAnALAH = ?omm=n@ n=mA@ name EI An?oKnJAHA@, JDA HAm=En@AH oB JDA ­%­

?omm=n@ߣI =HCKmAnJ lEIJ MEll =IIECnA@ Jo $* =n@ rc MEll ANA?KJA JDA commands. 6DA L=lKAoB $* MEll>AHAIJoHA@on?omFlAJEon. .oHAN=mFlA: fng{ $1 *.[hcyl] } @ABEnAI g pattern Jo look BoH o??KHHAn?AI oB pattern En =ll FHoCH=m IoKH?A BElAI En JDA ?KHHAnJ@EHA?JoHO. .Kn?JEon@ABEnEJEonI=HA@AlAJA@>OMHEJEnC

fn name MEJDnoBKn?JEon>o@O.

18. Command execution Rc @oAI onA oB IALAH=l JDEnCI Jo ANA?KJA = IEmFlA ?omm=n@. 1B JDA ?omm=n@ n=mA EI JDA n=mA oB = BKn?JEon @ABEnA@ KIEnC fn, JDA BKn?JEon EI ANA?KJA@. OJDAHMEIA, EB EJ EI JDA n=mA oB = >KElJ-En ?omm=n@, JDA >KElJ-En EI ANA?KJA@ @EHA?JlO >O rc. OJDAH­ MEIA, @EHA?JoHEAI mAnJEonA@ En JDA L=HE=>lA $path =HA IA=H?DA@ KnJEl =n ANA?KJ=>lA BElA EI BoKn@. -NJAnIELA KIA oB JDA $path L=HE=>lA EI @EI?oKH=CA@ En 2l=n '. 1nIJA=@, KIA JDA@AB=KlJ (. /bin) =n@>En@MD=JOoKnAA@EnJo /bin.

19. Built−in commands 5ALAH=l ?omm=n@I =HA ANA?KJA@ EnJAHn=llO >O rc >A?=KIA JDAO =HA @EBBE?KlJ Jo EmFlA­ mAnJoJDAHMEIA. . [−i] file ... -NA?KJA ?omm=n@I BHom file. $* EI IAJ BoH JDA @KH=JEon Jo JDA HAmEn@AH oB JDA =HCKmAnJ lEIJ BolloMEnC file. $path EI KIA@ Jo IA=H?D BoH file. OFJEon −i En@E?=JAI EnJAH=?JELA EnFKJ ߞ = FHomFJ BoKn@ En $prompt EI FHEnJA@ >ABoHA A=?D ?omm=n@ EIHA=@. builtin command ... -NA?KJA command =I KIK=l AN?AFJ JD=J =nO BKn?JEon n=mA@ command EI ECnoHA@. .oHAN=mFlA,

fn { builtin cd $* && } @ABEnAI = HAFl=?AmAnJ BoH JDA cd >KElJ-En IAA >AloM JD=J =nnoKn?AI JDA BKll n=mA oBJDAnAM@EHA?JoHO. cd [dir] +D=nCAJDA?KHHAnJ@EHA?JoHOJo dir. 6DA @AB=KlJ =HCKmAnJ EI $home. $cdpath EI =lEIJoBFl=?AIEnMDE?DJoIA=H?DBoH dir. eval [arg ...] 6DA =HCKmAnJI =HA ?on?=JAn=JA@ IAF=H=JA@ >O IF=?AI EnJo = IJHEnC, HA=@ =I EnFKJ Jo rc,=n@ANA?KJA@. .oHAN=mFlA, x=’$y’ y=Doody eval echo Howdy, $x MoKl@A?Do

Howdy, Doody IEn?AJDA=HCKmAnJIoB eval MoKl@>A ­&­

echo Howdy, $y =BJAHIK>IJEJKJEnCBoH $x. exec [command ...] Rc HAFl=?AI EJIAlB MEJD JDA CELAn command. 6DEI EI lEkA = goto ߞ rc @oAI noJ M=EJ BoHJDA?omm=n@JoANEJ,=n@@oAInoJHAJKHnJoHA=@=nOmoHA?omm=n@I. exit [status] Rc ANEJI EmmA@E=JAlO MEJD JDA CELAn IJ=JKI. 1B nonA EI CELAn, JDA ?KHHAnJ L=lKA oB $status EIKIA@. flag f [+−] 6DEI?omm=n@m=nEFKl=JAI=n@JAIJIJDA?omm=n@lEnABl=CI@AI?HE>A@>AloM.

flag f + IAJIBl=C f. flag f − ?lA=HIBl=C f. flag f JAIJIBl=C f,IAJJEnC $status =FFHoFHE=JAlO. 6DKI if(flag x) flag v + IAJIJDA −v Bl=CEBJDA −x Bl=CEI=lHA=@OIAJ. rfork [nNeEsfF] 6DEI KIAI JDA 2l=n ' rfork IOIJAm AnJHO Jo FKJ rc EnJo = nAM FHo?AII CHoKF MEJD JDA BolloMEnC=JJHE>KJAI: ____________.l=C N=mA .Kn?JEon   4.N)M-/ M=kA=?oFOoBJDAF=HAnJߣIn=mAIF=?A   n   N 4.+N)M-/ 5J=HJMEJD=nAM,AmFJOn=mAIF=?A   e 4.-N8/ M=kA=?oFOoBJDAF=HAnJߣIAnLEHonmAnJ   E 4.+-N8/ 5J=HJMEJD=nAM,AmFJOAnLEHonmAnJ   s 4.NO6-/ M=kA=nAMnoJACHoKF   4..,/ M=kA=?oFOoBJDAF=HAnJߣIBElA@AI?HEFJoHIF=?A   f  ______F 4.+.,/ M=kA=nAM,AmFJOBElA@AI?HEFJoHIF=?A  5A?JEon   oB JDA 2HoCH=mmAHߣI M=nK=l @AI?HE>AI JDAIA =JJHE>KJAI En moHA @AJ=El. shift [n] ,AlAJAJDABEHIJ n @AB=KlJ AlAmAnJIoB $*. [pid] 9=EJ BoH JDA FHo?AII MEJD JDA CELAn pid Jo ANEJ. 1B no pid EI CELAn, =ll oKJIJ=n@EnC FHo?AIIAI=HAM=EJA@BoH. whatis name ... 2HEnJ JDA L=lKA oB A=?D name En = BoHm IKEJ=>lA BoH EnFKJ Jo rc. 6DA oKJFKJ EI =n =IIECnmAnJ Jo = L=HE=>lA, JDA @ABEnEJEon oB = BKn?JEon, = ?=ll Jo builtin BoH = >KElJ-En?omm=n@,oHJDAF=JDn=mAoB=>En=HOFHoCH=m. .oHAN=mFlA,

whatis path g cd who mECDJFHEnJ ­'­

path=(. /bin) fn g {gre −e $1 *.[hycl]} builtin cd /bin/who

~ subject pattern ... 6DA subject EI m=J?DA@ =C=EnIJ A=?D pattern En JKHn. On = m=J?D, $status EI IAJ Jo JHKA. OJDAHMEIA, EJ EI IAJ Jo ’no match’. 2=JJAHnI =HA JDA I=mA =I BoH BElA­ n=mA m=J?DEnC. 6DA patterns =HA noJ IK>jA?JA@ Jo BElAn=mA HAFl=?AmAnJ >ABoHA JDA ~ ?omm=n@ EI ANA?KJA@, Io JDAO nAA@ noJ >A An?loIA@ En GKoJ=JEon m=HkI, KnlAIIoB?oKHIA,=lEJAH=lm=J?DBoH *[oH ? EIHAGKEHA@. .oHAN=mFlA ~$1? m=J?DAI=nOIEnClA?D=H=?JAH,MDAHA=I

~$1’?’ onlOm=J?DAI=lEJAH=lGKAIJEonm=Hk.

20. Advanced I/O Rc =lloMI HA@EHA?JEon oB BElA @AI?HEFJoHI oJDAH JD=n  =n@ IJ=n@=H@ EnFKJ =n@ oKJ­ FKJ >O IFA?EBOEnC JDA BElA @AI?HEFJoH En IGK=HA >H=?kAJI []=BJAH JDA < oH >. .oHAN=m­ FlA,

vc junk.c >[2]junk.diag I=LAIJDA?omFElAHߣI@E=CnoIJE?IBHomIJ=n@=H@AHHoHEn junk.diag. .ElA @AI?HEFJoHI m=O >A HAFl=?A@ >O = ?oFO, En JDA IAnIA oB dup , oB =n =lHA=@O- oFAnBElA>OJOFEnC,BoHAN=mFlA

vc junk.c >[2=1] 6DEI HAFl=?AI BElA @AI?HEFJoH MEJD = ?oFO oB BElA @AI?HEFJoH . 1J EI moHA KIABKl En ?on­ jKn?JEonMEJDoJDAHHA@EHA?JEonI,lEkAJDEI

vc junk.c >junk.out >[2=1] 4A@EHA?JEonI =HA AL=lK=JA@ BHom lABJ Jo HECDJ, Io JDEI HA@EHA?JI BElA @AI?HEFJoH Jo junk.out,JDAnFoEnJIBElA@AI?HEFJoH =JJDAI=mABElA. *O?onJH=IJ, vc junk.c >[2=1] >junk.out HA@EHA?JI BElA @AI?HEFJoH Jo = ?oFO oB BElA @AI?HEFJoH FHAIKm=>lO JDA JAHmEn=l, =n@ JDAn @EHA?JI BElA @AI?HEFJoH Jo = BElA. 1n JDA BEHIJ ?=IA, IJ=n@=H@ =n@ @E=CnoIJE? oKJFKJ MEll >A EnJAHmENA@ En junk.out. 1n JDA IA?on@, @E=CnoIJE? oKJFKJ MEll =FFA=H on JDA JAHmEn=l,=n@IJ=n@=H@oKJFKJMEll>AIAnJJoJDABElA. .ElA @AI?HEFJoHI m=O >A ?loIA@ >O KIEnC JDA @KFlE?=JEon noJ=JEon MEJD =n AmFJO HECDJ-D=n@IE@A. .oHAN=mFlA,

vc junk.c >[2=] MEll@EI?=H@@E=CnoIJE?IBHomJDA?omFEl=JEon. )H>EJH=HOBElA@AI?HEFJoHIm=O>AIAnJJDHoKCD=FEFA>OJOFEnC,BoHAN=mFlA,

vc junk.c |[2] grep −v ’^$’ 6DEI @AlAJAI >l=nk lEnAI BHom JDA + ?omFElAHߣI AHHoH oKJFKJ. NoJA JD=J JDA oKJFKJ oB grep IJEll=FFA=HIonBElA@AI?HEFJoH . O??=IEon=llO OoK m=O MEID Jo ?onnA?J JDA EnFKJ IE@A oB = FEFA Jo IomA BElA @AI?HEF­ JoHoJDAHJD=nzAHo. 6DAnoJ=JEon ­ ­

cmd1 |[5=19] cmd2 ?HA=JAI = FEFAlEnA MEJD cmd1ߣI BElA @AI?HEFJoH # ?onnA?JA@ JDHoKCD = FEFA Jo cmd2ߣI BElA @AI?HEFJoH '.

21. Here documents Rc FHo?A@KHAI m=O En?lK@A @=J=, ?=llA@ ߢߢDAHA @o?KmAnJIߣߣ, Jo >A FHoLE@A@ =I EnFKJ Jo?omm=n@I,=IEnJDEILAHIEonoBJDA tel ?omm=n@ for(i) grep $i ol <<, BolloMA@ >O =n =H>EJH=HO -O. m=HkAH ! En JDA AN=mFlA. LEnAI BolloMEnC JDA ?omm=n@, KF Jo = lEnA ?onJ=EnEnC onlO JDA -O. m=HkAH =HA I=LA@ En = JAmFoH=HO BElA JD=J EI ?onnA?JA@ Jo JDA ?omm=n@ߣI IJ=n@=H@EnFKJMDAnEJEIHKn. Rc @oAIL=HE=>lAIK>IJEJKJEonEnDAHA@o?KmAnJI. 6DABolloMEnC?omm=n@: $3 <lA EI BolloMA@ EmmA@E=JAlO >O ^, JDA ?=HAJ EI @AlAJA@. 8=HE=>lA IK>IJEJKJEon ?=n >A AnJEHAlO IKFFHAIIA@ >O An?loIEnC JDA -O. m=HkAH Bol­ loMEnC << EnGKoJ=JEonm=HkI,=IEn <<’EOF’. 0AHA @o?KmAnJI m=O >A FHoLE@A@ on BElA @AI?HEFJoHI oJDAH JD=n  >O JOFEnC, BoH AN=mFlA,

cmd <<[4]End ... End 1B = DAHA @o?KmAnJ =FFA=HI MEJDEn = ?omFoKn@ >lo?k, JDA ?onJAnJI oB JDA @o?K­ mAnJmKIJ>A=BJAHJDAMDolA>lo?k:

for(i in $*){ $i <

22. Catching Notes Rc I?HEFJI noHm=llO JAHmEn=JA MDAn =n EnJAHHKFJ EI HA?AELA@ BHom JDA JAHmEn=l. ) BKn?JEon MEJD JDA n=mA oB = 7N1: IECn=l, En loMAH ?=IA, EI @ABEnA@ En JDA KIK=l M=O, >KJ ?=llA@ MDAn rc HA?AELAI JDA ?oHHAIFon@EnC noJA. 6DA notify  IA?JEon oB JDA 2HoCH=mmAHߣIM=nK=l@EI?KIIAInoJAIEnIomA@AJ=El. NoJAIoBEnJAHAIJ=HA: sighup 6DA noJA M=I ߢD=nCKFߣ. 2l=n ' IAn@I JDEI MDAn JDA JAHmEn=l D=I @EI?onnA?JA@ BHom rc. ­ ­

sigint 6DA noJA M=I ߢEnJAHHKFJߣ, KIK=llO IAnJ MDAn JDA EnJAHHKFJ ?D=H=?JAH )5+11 ,-L EI JOFA@onJDAJAHmEn=l. sigterm 6DAnoJAM=IߢkEllߣ,noHm=llOIAnJ>O  . sigexit )n=HJEBE?E=lnoJAIAnJMDAn rc EI=>oKJJoANEJ. )I=nAN=mFlA,

fn sigint{ rm /tmp/junk exit } IAJI=JH=FBoHJDAkAO>o=H@EnJAHHKFJJD=JHAmoLAI=JAmFoH=HOBElA>ABoHAANEJEnC. NoJAI MEll >A ECnoHA@ EB JDA noJA HoKJEnA EI IAJ Jo {}. 5ECn=lI HALAHJ Jo JDAEH @AB=KlJ >AD=LEoHMDAnJDAEHD=n@lAHIߣ @ABEnEJEonI=HA@AlAJA@.

23. Environment 6DA AnLEHonmAnJ EI = lEIJ oB n=mA-L=lKA F=EHI m=@A =L=El=>lA Jo ANA?KJEnC >En=HEAI. On 2l=n ', JDA AnLEHonmAnJ EI IJoHA@ En = BElA IOIJAm n=mA@ #e, noHm=llO moKnJA@ on /. 6DA L=lKA oB A=?D L=HE=>lA EI IJoHA@ En = IAF=H=JA BElA, MEJD ?omFonAnJI JAHmE­ n=JA@ >O zAHo >OJAI. 6DA BElA IOIJAm EI m=EnJ=EnA@ AnJEHAlO En ?oHA, Io no @EIk oH nAJ­ MoHk =??AII EI EnLolLA@. 6DA ?onJAnJI oB /env =HA ID=HA@ on = FAH-FHo?AII CHoKF >=IEI − MDAn = nAM FHo?AII CHoKF EI ?HA=JA@ EJ ABBA?JELAlO =JJ=?DAI /env Jo = nAM BElA IOIJAm EnEJE=lEzA@ MEJD = ?oFO oB JDA ol@ onA. ) ?onIAGKAn?A oB JDEI oHC=nEz=JEon EI JD=J ?omm=n@I?=n?D=nCAAnLEHonmAnJAnJHEAI=n@IAAJDA?D=nCAIHABlA?JA@En rc. .Kn?JEonI =lIo =FFA=H En JDA AnLEHonmAnJ, n=mA@ >O FHABENEnC fn# Jo JDAEH n=mAI, lEkA /env/fn#.

24. Local Variables 1J EI oBJAn KIABKl Jo IAJ = L=HE=>lA BoH JDA @KH=JEon oB = IEnClA ?omm=n@. )n =IIECn­ mAnJBolloMA@>O=?omm=n@D=IJDEIABBA?J. .oHAN=mFlA

a=global a=local echo $a echo $a MEllFHEnJ

local global 6DEIMoHkIALAnBoH?omFoKn@?omm=n@I,lEkA

f=/fairly/long/file/name { { wc $f; $f; diff $f.old $f } | −h ’Facts about ’$f | lp −dfn }

25. Examples ߞ cd, pwd 0AHA EI = F=EH oB BKn?JEonI JD=J FHoLE@A AnD=n?A@ LAHIEonI oB JDA IJ=n@=H@ cd =n@ pwd ?omm=n@I. 6D=nkIJo4o>2EkABoHJDAIA. ­ ­

ps1=’% ’ # default prompt tab=’ ’ # a tab character fn cd{ builtin cd $1 && switch($#*){ case 0 dir=$home prompt=($ps1 $tab) case * switch($1) case /* dir=$1 prompt=(‘{ ‘{pwd}}^$ps1 $tab) case */* ..* dir=() prompt=(‘{basename ‘{pwd}}^$ps1 $tab) case * dir=() prompt=($1^$ps1 $tab) } } } fn pwd{ if(~ $#dir 0) dir=‘{/bin/pwd} echo $dir } .Kn?JEon pwd EI = LAHIEon oB JDA IJ=n@=H@ pwd JD=J ?=?DAI EJI L=lKA En L=HE=>lA $dir, >A?=KIA JDA CAnKEnA pwd ?=n >A GKEJA IloM Jo ANA?KJA. 4A?AnJ LAHIEonI oB 2l=n ' D=LA LAHOB=IJEmFlAmAnJ=JEonIoB pwd,HA@K?EnCJDA=@L=nJ=CAoBJDA pwd BKn?JEon. .Kn?JEon cd ?=llI JDA cd >KElJ-En, =n@ ?DA?kI JD=J EJ M=I IK??AIIBKl. 1B Io, EJ IAJI $dir =n@ $prompt. 6DA FHomFJ MEll En?lK@A JDA l=IJ ?omFonAnJ oB JDA ?KHHAnJ @EHA?­ JoHO AN?AFJ En JDA DomA @EHA?JoHO, MDAHA EJ MEll >A nKll, =n@ $dir MEll >A HAIAJ AEJDAH JoJDA?oHHA?JL=lKAoHJo (),IoJD=JJDA pwd BKn?JEonMEllMoHk?oHHA?JlO.

26. Examples ߞ man 6DA man ?omm=n@ FHEnJI F=CAI oB JDA 2HoCH=mmAHߣI M=nK=l. 1J EI ?=llA@, BoH AN=mFlA,=I

man 2 sinh man rc man −t cat 1n JDA BEHIJ ?=IA, JDA F=CA BoH sinh En IA?JEon EI FHEnJA@. 1n JDA IA?on@ ?=IA, JDA m=n­ K=l F=CA BoH rc EIFHEnJA@. 5En?Anom=nK=lIA?JEonEIIFA?EBEA@,=llIA?JEonI=HAIA=H?DA@ BoH JDA F=CA, =n@ EJ EI BoKn@ En IA?JEon . 1n JDA JDEH@ ?=IA, JDA F=CA BoH cat EI JOFAIAJ JDA −t oFJEon. ­ !­

cd /sys/man || { echo $0: No manual! >[1=2] exit 1 } NT=n # default s=’*’ # section, default try all for(i) switch($i){ case −t NT=t case −n NT=n case −* echo Usage: $0 ’[−nt] [section] ...’ >[1=2] exit 1 case [1−9] 10 s=$i case * eval ’pages=’$s/$i for(page in $pages){ if(test −f $page) $NT^roff −man $page if not echo $0: $i not found >[1=2] } } NoJA JDA KIA oB eval Jo m=kA = lEIJ oB ?=n@E@=JA m=nK=l F=CAI. 9EJDoKJ eval, JDA * IJoHA@ En $s MoKl@ noJ JHECCAH BElAn=mA m=J?DEnC ߞ EJߣI An?loIA@ En GKoJ=JEon m=HkI, =n@ ALAn EB EJ MAHAnߣJ, EJ MoKl@ >A ANF=n@A@ MDAn =IIECnA@ Jo $s. -L=l ?=KIAI EJI =HCK­ mAnJI Jo >A HA-FHo?AIIA@ >O rcߣI F=HIAH =n@ EnJAHFHAJAH, ABBA?JELAlO @Al=OEnC AL=lK=JEon oBJDA * KnJElJDA=IIECnmAnJJo $pages.

27. Examples ߞ holmdel 6DA BolloMEnC rc I?HEFJ Fl=OI JDA @A?AFJELAlO IEmFlA C=mA holmdel, En MDE?D JDA Fl=OAHI =lJAHn=JAlO n=mA *All L=>I lo?=JEonI, JDA MEnnAH >AEnC JDA BEHIJ Jo mAnJEon 0olm@Al. 6DEII?HEFJEIMoHJD@AI?HE>EnCEn@AJ=ElH=JDAH,EJMoKl@>AEBEJMAHAnߣJIoIEllO. 8=HE=>lA $t EI =n =>>HALE=JEon BoH JDA n=mA oB = JAmFoH=HO BElA. 1n?lK@EnC $pid, EnEJE=lEzA@ >O rc Jo EJI FHo?AII-E@, En JDA n=mAI oB JAmFoH=HO BElAI EnIKHAI JD=J JDAEH n=mAIMonߣJ?ollE@A,En?=IAmoHAJD=nonAEnIJ=n?AoBJDAI?HEFJEIHKnnEnC=J=JEmA. .Kn?JEon readߣI =HCKmAnJ EI JDA n=mA oB = L=HE=>lA EnJo MDE?D = lEnA C=JDAHA@ BHom IJ=n@=H@ EnFKJ EI HA=@. $ifs EI IAJ Jo jKIJ = nAMlEnA. 6DKI readߣI EnFKJ EI noJ IFlEJ=F=HJ=JIF=?AI,>KJJDAJAHmEn=JEnCnAMlEnAEI@AlAJA@. ) D=n@lAH EI IAJ Jo ?=J?D sigint, sigquit, =n@ sighup, =n@ JDA =HJEBE?E=l sigexit IECn=l. 1JjKIJHAmoLAIJDAJAmFoH=HOBElA=n@ANEJI. 6DA JAmFoH=HO BElA EI EnEJE=lEzA@ BHom = DAHA @o?KmAnJ ?onJ=EnEnC = lEIJ oB *All L=>I lo?=JEonI,=n@JDAm=EnlooFIJ=HJI. .EHIJ, JDA FHoCH=m CKAIIAI = lo?=JEon En $lab KIEnC JDA FHoCH=m Jo FE?k = H=n@om lEnA BHom JDA lo?=JEon lEIJ. 1J FHEnJI JDA lo?=JEon, =n@ EB EJ CKAIIA@ 0olm@Al,FHEnJI=mAII=CA=n@ANEJI. 6DAn EJ KIAI JDA read BKn?JEon Jo CAJ lEnAI BHom IJ=n@=H@ EnFKJ =n@ L=lE@EJO-?DA?k JDAm KnJEl EJ CAJI = lAC=l n=mA. NoJA JD=J JDA ?on@EJEon F=HJ oB = while ?=n >A = ?om­ FoKn@?omm=n@. OnlOJDAANEJIJ=JKIoBJDAl=IJ?omm=n@EnJDAIAGKAn?AEI?DA?kA@. )C=En, EB JDA HAIKlJ EI 0olm@Al, EJ FHEnJI = mAII=CA =n@ ANEJI. OJDAHMEIA EJ CoAI ­ "­

t=/tmp/holmdel$pid fn read{ $1=‘{ ’{print;exit}’} } ifs=’ ’ # just a fn sigexit sigint sigquit sighup{ rm −f $t exit } cat <<’!’ >$t Allentown Atlanta Cedar Crest Chester Columbus Elmhurst Fullerton Holmdel Indian Hill Merrimack Valley Morristown Neptune Piscataway Reading Short Hills South Plainfield Summit Whippany West Long Branch ! while(){ lab=‘{fortune $t} echo $lab if(~ $lab Holmdel){ echo You lose. exit } while(read lab; ! grep −i −s $lab $t) echo No such location. if(~ $lab [hH]olmdel){ echo You win. exit } } >=?kJoJDAJoFoBJDAlooF.

28. Design Principles Rc @H=MI DA=LElO BHom 5JALA *oKHnAߣI /bin/sh. )nO IK??AIIoH oB JDA *oKHnA IDAll EI >oKn@ Jo IKBBAH En ?omF=HEIon. 1 D=LA JHEA@ Jo BEN EJI >AIJ-=?knoMlA@CA@ IDoHJ­ ?omEnCI =n@ Jo IEmFlEBO JDEnCI MDAHALAH FoIIE>lA, KIK=llO >O omEJJEnC EnAIIAnJE=l BA=­ JKHAI. OnlO MDAn EHHAIEIJE>lO JAmFJA@ D=LA 1 EnJHo@K?A@ noLAl E@A=I. O>LEoKIlO 1 D=LA JEnkAHA@ANJAnIELAlOMEJD*oKHnAߣIIOnJ=N. 6DA moIJ EmFoHJ=nJ FHEn?EFlA En rcߣI @AIECn EI JD=J EJߣI noJ = m=?Ho FHo?AIIoH. 1nFKJ EI nALAH I?=nnA@ moHA JD=n on?A >O JDA lANE?=l =n@ IOnJ=?JE? =n=lOIEI ?o@A AN?AFJ,oB?oKHIA,>OJDA eval ?omm=n@,MDoIA raison d’être EIJo>HA=kJDAHKlA. *oKHnA IDAll I?HEFJI ?=n oBJAn >A m=@A Jo HKn MEl@ >O F=IIEnC JDAm =HCKmAnJI ­ #­

?onJ=EnEnC IF=?AI. 6DAIA MEll >A IFlEJ EnJo mKlJEFlA =HCKmAnJI KIEnC IFS,oBJAn=JEnoF­ FoHJKnA JEmAI. 1n rc, L=lKAI oB L=HE=>lAI, En?lK@EnC ?omm=n@ lEnA =HCKmAnJI, =HA noJ HA-HA=@ MDAn IK>IJEJKJA@ EnJo = ?omm=n@. )HCKmAnJI D=LA FHAIKm=>lO >AAn I?=nnA@ EnJDAF=HAnJFHo?AII,=n@oKCDJnoJJo>AHA-HA=@. 9DO @oAI *oKHnA HA-I?=n ?omm=n@I =BJAH L=HE=>lA IK>IJEJKJEon? 0A nAA@I Jo >A =>lA Jo IJoHA lEIJI oB =HCKmAnJI En L=HE=>lAI MDoIA L=lKAI =HA ?D=H=?JAH IJHEnCI. 1B MA AlEmEn=JA HA-I?=nnEnC, MA mKIJ ?D=nCA JDA JOFA oB L=HE=>lAI, Io JD=J JDAO ?=n ANFlE?EJlO ?=HHOlEIJIoBIJHEnCI. 6DEI EnJHo@K?AI IomA ?on?AFJK=l ?omFlE?=JEonI. 9A nAA@ = noJ=JEon BoH lEIJI oB MoH@I. 6DAHA =HA JMo @EBBAHAnJ kEn@I oB ?on?=JAn=JEon, BoH IJHEnCI ߞ $a^$b, =n@ lEIJI ߞ ($a $b). 6DA @EBBAHAn?A >AJMAAn () =n@ ’’ EI ?onBKIEnC Jo noLE?AI, =lJDoKCD JDA @EIJEn?JEonEI=HCK=>lOIAnIE>lAߞ =nKll=HCKmAnJEInoJJDAI=mA=Ino=HCKmAnJ. *oKHnA =lIo HAI?=nI EnFKJ MDAn @oEnC ?omm=n@ IK>IJEJKJEon. 6DEI EI >A?=KIA JDA JANJ An?loIA@ En >=?k-GKoJAI EI noJ = IJHEnC, >KJ = ?omm=n@. 2HoFAHlO, EJ oKCDJ Jo >A F=HIA@ MDAn JDA An?loIEnC ?omm=n@ EI, >KJ JDEI m=kAI EJ @EBBE?KlJ Jo D=n@lA nAIJA@ ?omm=n@IK>IJEJKJEonI,lEkAJDEI:

size=‘wc −l \‘ls −t|sed 1q\‘‘ 6DA EnnAH >=?k-GKoJAI mKIJ >A AI?=FA@ Jo =LoE@ JAHmEn=JEnC JDA oKJAH ?omm=n@. 6DEI ?=n CAJ mK?D MoHIA JD=n JDA =>oLA AN=mFlA; JDA nKm>AH oB \ߣI HAGKEHA@ EI ANFonAnJE=l En JDA nAIJEnC @AFJD. Rc BENAI JDEI >O m=kEnC JDA >=?kGKoJA = Kn=HO oFAH=JoH MDoIA =HCKmAnJEI=?omm=n@,lEkAJDEI:

size=‘{wc −l ‘{ls −t|sed 1q}} NoAI?=FAI=HAALAHHAGKEHA@,=n@JDAMDolAJDEnCEIF=HIA@EnonAF=II. .oH IEmEl=H HA=IonI rc @ABEnAI IECn=l D=n@lAHI =I JDoKCD JDAO MAHA BKn?JEonI, EnIJA=@ oB =IIo?E=JEnC = IJHEnC MEJD A=?D IECn=l, =I *oKHnA @oAI, MEJD JDA =JJAn@=nJ FoI­ IE>ElEJO oB CAJJEnC = IOnJ=N AHHoH mAII=CA En HAIFonIA Jo JOFEnC JDA EnJAHHKFJ ?D=H=?JAH. 5En?A rc F=HIAIEnFKJMDAnJOFA@,EJHAFoHJIAHHoHIMDAnOoKm=kAJDAm. .oH =ll JDEI JHoK>lA, MA C=En IK>IJ=nJE=l IAm=nJE? IEmFlEBE?=JEonI. 6DAHA EI no nAA@ BoH JDA @EIJEn?JEon >AJMAAn $* =n@ $@. 6DAHA EI no nAA@ BoH BoKH JOFAI oB GKoJ=JEon, noH JDA ANJHAmAlO ?omFlE?=JA@ HKlAI JD=J CoLAHn JDAm. 1n rc OoK KIA GKoJ=JEon m=HkI MDAn OoK M=nJ = IOnJ=N ?D=H=?JAH Jo =FFA=H En =n =HCKmAnJ, oH =n =HCKmAnJ JD=J EI JDA AmFJO IJHEnC, =n@ =J no oJDAH JEmA. IFS EI no lonCAH KIA@, AN?AFJ En JDA onA ?=IA MDAHA EJ M=IEn@EIFAnI=>lA:?onLAHJEnC?omm=n@oKJFKJEnJo=HCKmAnJlEIJI@KHEnC?om­ m=n@IK>IJEJKJEon. 6DEI =lIo =LoE@I =n EmFoHJ=nJ 7N1: IA?KHEJO DolA. 1n 7N1:, JDA system =n@ popen BKn?JEonI ?=ll /bin/sh Jo ANA?KJA = ?omm=n@. 1J EI EmFoIIE>lA Jo KIA AEJDAH oB JDAIA HoKJEnAI MEJD =nO =IIKH=n?A JD=J JDA IFA?EBEA@ ?omm=n@ MEll >A ANA?KJA@, ALAn EB JDA ?=llAH oB system oH popen IFA?EBEAI = BKll F=JD n=mA BoH JDA ?omm=n@. 6DEI ?=n >A @AL­ =IJ=JEnC EB EJ o??KHI En = IAJ-KIAHE@ FHoCH=m. 6DA FHo>lAm EI JD=J IFS EI KIA@ Jo IFlEJ JDA ?omm=n@ EnJo MoH@I, Io =n =JJ=?kAH ?=n jKIJ IAJ IFS=/ En DEI AnLEHonmAnJ =n@ lA=LA=6Hoj=n DoHIA n=mA@ usr oH bin En JDA ?KHHAnJ MoHkEnC @EHA?JoHO >ABoHA HKnnEnC JDAFHELElACA@FHoCH=m. Rc BENAIJDEI>OnALAHHAI?=nnEnCEnFKJBoH=nOHA=Ion. MoIJ oB JDA oJDAH @EBBAHAn?AI >AJMAAn rc =n@ JDA *oKHnA IDAll =HA noJ Io IAHEoKI. 1 AlEmEn=JA@*oKHnAߣIFA?KlE=HBoHmIoBL=HE=>lAIK>IJEJKJEon,lEkA

echo ${a=b} ${c−d} ${e?error} >A?=KIA JDAO =HA lEJJlA KIA@, HA@Kn@=nJ =n@ A=IElO ANFHAIIA@ En lAII =>IJHKIA JAHmI. 1 @AlAJA@ JDA >KElJEnI export, readonly, break, continue, read, return, set, times =n@ unset >A?=KIAJDAOIAAmHA@Kn@=nJoHonlOm=HCEn=llOKIABKl. 9DAHA *oKHnAߣI IOnJ=N @H=MI BHom )lCol $&, rcߣI EI >=IA@ on + oH )Mk. 6DEI EI ­ $­

D=H@AHJo@ABAn@. 1>AlEALAJD=J,BoHAN=mFlA

if(test −f junk) rm junk EI>AJJAHIOnJ=NJD=n

if test −f junk; then rm junk; fi >A?=KIA EJ EI lAII ?lKJJAHA@ MEJD kAOMoH@I, EJ =LoE@I JDA IAmE?olonI JD=J *oKHnA HAGKEHAI Eno@@Fl=?AI,=n@JDAIOnJ=N?D=H=?JAHI>AJJAHIAJoBBJDA=?JELAF=HJIoBJDA?omm=n@. 6DA onA >EJ oB l=HCA-I?=lA IOnJ=N JD=J *oKHnA KnGKAIJEon=>lO @oAI >AJJAH JD=n rc EI JDA if IJ=JAmAnJ MEJD else ?l=KIA. RcߣI if D=I no JAHmEn=JEnC fi-lEkA >H=?kAJ. )I = HAIKlJ, JDA F=HIAH ?=nnoJ JAll MDAJDAH oH noJ Jo ANFA?J =n else ?l=KIA MEJDoKJ lookEnC =DA=@EnEJIEnFKJ. 6DAFHo>lAmEIJD=J=BJAHHA=@EnC,BoHAN=mFlA

if(test −f junk) echo junk found En EnJAH=?JELA mo@A, rc ?=nnoJ @A?E@A MDAJDAH Jo ANA?KJA EJ EmmA@E=JAlO =n@ FHEnJ $prompt(1), oH Jo FHEnJ $prompt(2) =n@ M=EJ BoH JDA else Jo >A JOFA@. 1n JDA *oKHnAIDAll,JDEIEInoJ=FHo>lAm,>A?=KIAJDA if ?omm=n@mKIJAn@MEJD fi, HAC=H@­ lAIIoBMDAJDAHEJ?onJ=EnI=n else oHnoJ. RcߣI =@mEJJA@lO BAA>lA IolKJEon EI Jo @A?l=HA JD=J JDA else ?l=KIA EI = IAF=H=JA IJ=JAmAnJ, MEJD JDA IAm=nJE? FHoLEIo JD=J EJ mKIJ EmmA@E=JAlO BolloM =n if, =n@ Jo ?=ll EJ if not H=JDAH JD=n else, =I = HAmEn@AH JD=J IomAJDEnC o@@ EI CoEnC on. 6DA onlO noJE?A=>lA?onIAGKAn?AoBJDEIEIJD=JJDA>H=?AI=HAHAGKEHA@EnJDA?onIJHK?JEon

for(i){ if(test −f $i) echo $i found if not echo $i not found } =n@ JD=J rc HAIolLAI JDA ߢߢ@=nClEnC AlIAߣߣ =m>ECKEJO En oFFoIEJEon Jo moIJ FAoFlAߣI ANFA?J=JEonI. 1J EI HAm=Hk=>lA JD=J En JDA BoKH moIJ HA?AnJ A@EJEonI oB JDA 7N1: IOIJAm FHoCH=mmAHߣI m=nK=l JDA *oKHnA IDAll CH=mm=H @AI?HE>A@ En JDA m=nK=l F=CA @oAI noJ =@mEJ JDA ?omm=n@ who|wc. 6DEI EI IKHAlO =n oLAHIECDJ, >KJ EJ IKCCAIJI IomAJDEnC @=HkAH: no>o@O HA=llO knoMI MD=J JDA *oKHnA IDAllߣI CH=mm=H EI. -LAn AN=mEn=JEon oB JDA IoKH?A ?o@A EI lEJJlA DAlF. 6DA F=HIAH EI EmFlAmAnJA@ >O HA?KHIELA @AI?AnJ, >KJ JDA HoKJEnAI ?oHHAIFon@EnC Jo JDA IOnJ=?JE? ?=JACoHEAI =ll D=LA = Bl=C =HCKmAnJ JD=J IK>JlO ?D=nCAI JDAEH oFAH=JEon @AFAn@EnC on JDA ?onJANJ. RcߣI F=HIAH EI EmFlAmAnJA@ KIEnC ,Io1?=nI=OFHA?EIAlOMD=JJDACH=mm=HEI.

29. Acknowledgements 4o> 2EkA, 0oM=H@ 6HE?kAO =n@ oJDAH 2l=n ' KIAHI D=LA >AAn EnIEIJAnJ, En?AII=nJ IoKH?AI oB Coo@ E@A=I =n@ ?HEJE?EIm. 5omA AN=mFlAI En JDEI @o?KmAnJ =HA Fl=CE=HEzA@ BHom[*oKHnA],=I=HAmoIJoB rcߣICoo@BA=JKHAI.

30. Reference 5. 4. *oKHnA, 7N1: 6EmA-5D=HEnC 5OIJAm: 6DA 7N1: 5DAll, *All 5OIJAm 6A?DnE?=l JoKHn=l, 8olKmA#%nKm>AH$,JKlO-)KCKIJ '%&