home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume23 / rc / part04 < prev    next >
Text File  |  1991-10-18  |  56KB  |  2,062 lines

  1. Newsgroups: comp.sources.misc
  2. From: byron@archone.tamu.edu (Byron Rakitzis)
  3. Subject:  v23i064:  rc - A Plan 9 shell reimplementation, v1.2, Part04/06
  4. Message-ID: <1991Oct18.034413.2362@sparky.imd.sterling.com>
  5. X-Md4-Signature: b20aaa006ae36b5a6e1aeb17a64f5b33
  6. Date: Fri, 18 Oct 1991 03:44:13 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: byron@archone.tamu.edu (Byron Rakitzis)
  10. Posting-number: Volume 23, Issue 64
  11. Archive-name: rc/part04
  12. Environment: UNIX
  13. Supersedes: rc: Volume 20, Issue 10-13
  14.  
  15. #!/bin/sh
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file parse.y continued
  18. #
  19. if test ! -r _shar_seq_.tmp; then
  20.     echo 'Please unpack part 1 first!'
  21.     exit 1
  22. fi
  23. (read Scheck
  24.  if test "$Scheck" != 4; then
  25.     echo Please unpack part "$Scheck" next!
  26.     exit 1
  27.  else
  28.     exit 0
  29.  fi
  30. ) < _shar_seq_.tmp || exit 1
  31. if test ! -f _shar_wnt_.tmp; then
  32.     echo 'x - still skipping parse.y'
  33. else
  34. echo 'x - continuing file parse.y'
  35. sed 's/^X//' << 'SHAR_EOF' >> 'parse.y' &&
  36. redir    : DUP            { $$ = newnode(rDUP,$1.type,$1.left,$1.right); }
  37. X    | REDIR word        { $$ = newnode(rREDIR,$1.type,$1.fd,$2);
  38. X                  if ($1.type == HEREDOC && !qdoc($2, $$)) YYABORT; /* queue heredocs up */
  39. X                }
  40. X
  41. case    : CASE words ';'             { $$ = newnode(rCASE, $2); }
  42. X    | CASE words '\n'             { $$ = newnode(rCASE, $2); }
  43. X
  44. cbody    : cmd                    { $$ = newnode(CBODY, $1, NULL); }
  45. X    | case cbody                { $$ = newnode(CBODY, $1, $2); }
  46. X    | cmdsan cbody                { $$ = newnode(CBODY, $1, $2); }
  47. X
  48. iftail    : cmd        %prec ELSE
  49. X    | brace ELSE optnl cmd            { $$ = newnode(rELSE,$1,$4); }
  50. X
  51. cmd    : /* empty */    %prec WHILE        { $$ = NULL; }
  52. X    | simple
  53. X    | brace epilog                { $$ = newnode(BRACE,$1,$2); }
  54. X    | IF paren optnl iftail            { $$ = newnode(rIF,$2,$4); }
  55. X    | FOR '(' word IN words ')' optnl cmd    { $$ = newnode(FORIN,$3,$5,$8); }
  56. X    | FOR '(' word ')' optnl cmd        { $$ = newnode(FORIN,$3,star,$6); }
  57. X    | WHILE paren optnl cmd            { $$ = newnode(rWHILE,$2,$4); }
  58. X    | SWITCH '(' word ')' optnl '{' cbody '}' { $$ = newnode(rSWITCH,$3,$7); }
  59. X    | TWIDDLE optcaret word words        { $$ = newnode(MATCH,$3,$4); }
  60. X    | cmd ANDAND optnl cmd            { $$ = newnode(rANDAND,$1,$4); }
  61. X    | cmd OROR optnl cmd            { $$ = newnode(rOROR,$1,$4); }
  62. X     | cmd PIPE optnl cmd            { $$ = newnode(rPIPE,$2.left,$2.right,$1,$4); }
  63. X    | redir cmd    %prec BANG        { $$ = ($2 != NULL ? newnode(PRE,$1,$2) : $1); }
  64. X    | assign cmd    %prec BANG        { $$ = ($2 != NULL ? newnode(PRE,$1,$2) : $1); }
  65. X    | BANG optcaret cmd            { $$ = newnode(rBANG,$3); }
  66. X    | SUBSHELL optcaret cmd            { $$ = newnode(rSUBSHELL,$3); }
  67. X    | FN words brace            { $$ = newnode(NEWFN,$2,$3); }
  68. X    | FN words                { $$ = newnode(RMFN,$2); }
  69. X
  70. optcaret : /* empty */
  71. X    | '^'
  72. X
  73. simple    : first
  74. X    | simple word            { $$ = ($2 != NULL ? newnode(ARGS,$1,$2) : $1); }
  75. X    | simple redir            { $$ = newnode(ARGS,$1,$2); }
  76. X
  77. first    : comword
  78. X    | first '^' sword        { $$ = newnode(CONCAT,$1,$3); }
  79. X
  80. sword    : comword
  81. X    | keyword            { $$ = newnode(rWORD,$1, NULL); }
  82. X
  83. word    : sword
  84. X    | word '^' sword        { $$ = newnode(CONCAT,$1,$3); }
  85. X
  86. comword    : '$' sword            { $$ = newnode(VAR,$2); }
  87. X    | '$' sword SUB words ')'    { $$ = newnode(VARSUB,$2,$4); }
  88. X    | COUNT sword            { $$ = newnode(rCOUNT,$2); }
  89. X    | FLAT sword            { $$ = newnode(rFLAT, $2); }
  90. X    | '`' sword            { $$ = newnode(BACKQ,nolist,$2); }
  91. X    | '`' brace            { $$ = newnode(BACKQ,nolist,$2); }
  92. X    | BACKBACK word    brace        { $$ = newnode(BACKQ,$2,$3); }
  93. X    | BACKBACK word    sword        { $$ = newnode(BACKQ,$2,$3); }
  94. X    | '(' words ')'            { $$ = $2; }
  95. X    | REDIR brace            { $$ = newnode(NMPIPE,$1.type,$1.fd,$2); }
  96. X    | WORD                { $$ = ($1.w[0] == '\'') ? newnode(QWORD, $1.w+1, NULL) : newnode(rWORD,$1.w, $1.m); }
  97. X
  98. keyword    : FOR        { $$ = "for"; }
  99. X    | IN        { $$ = "in"; }
  100. X    | WHILE        { $$ = "while"; }
  101. X    | IF        { $$ = "if"; }
  102. X    | SWITCH    { $$ = "switch"; }
  103. X    | FN        { $$ = "fn"; }
  104. X    | ELSE        { $$ = "else"; }
  105. X    | CASE        { $$ = "case"; }
  106. X    | TWIDDLE    { $$ = "~"; }
  107. X    | BANG        { $$ = "!"; }
  108. X    | SUBSHELL    { $$ = "@"; }
  109. X
  110. words    :        { $$ = NULL; }
  111. X    | words word    { $$ = ($1 != NULL ? ($2 != NULL ? newnode(LAPPEND,$1,$2) : $1) : $2); }
  112. X
  113. optnl    : /* empty */
  114. X    | optnl '\n'
  115. X
  116. %%
  117. X
  118. void initparse() {
  119. X    star = treecpy(newnode(VAR,newnode(rWORD,"*",NULL)), ealloc);
  120. X    nolist = treecpy(newnode(VAR,newnode(rWORD,"ifs",NULL)), ealloc);
  121. }
  122. X
  123. SHAR_EOF
  124. echo 'File parse.y is complete' &&
  125. chmod 0644 parse.y ||
  126. echo 'restore of parse.y failed'
  127. Wc_c="`wc -c < 'parse.y'`"
  128. test 5406 -eq "$Wc_c" ||
  129.     echo 'parse.y: original size 5406, current size' "$Wc_c"
  130. rm -f _shar_wnt_.tmp
  131. fi
  132. # ============= plan9.ps ==============
  133. if test -f 'plan9.ps' -a X"$1" != X"-c"; then
  134.     echo 'x - skipping plan9.ps (File already exists)'
  135.     rm -f _shar_wnt_.tmp
  136. else
  137. > _shar_wnt_.tmp
  138. echo 'x - extracting plan9.ps (Text)'
  139. sed 's/^X//' << 'SHAR_EOF' > 'plan9.ps' &&
  140. %!PS
  141. %%Version: 3.3
  142. %%DocumentFonts: (atend)
  143. %%Pages: (atend)
  144. %%EndComments
  145. %
  146. % Version 3.3 prologue for troff files.
  147. %
  148. X
  149. /#copies 1 store
  150. /aspectratio 1 def
  151. /formsperpage 1 def
  152. /landscape false def
  153. /linewidth .3 def
  154. /magnification 1 def
  155. /margin 0 def
  156. /orientation 0 def
  157. /resolution 720 def
  158. /rotation 1 def
  159. /xoffset 0 def
  160. /yoffset 0 def
  161. X
  162. /roundpage true def
  163. /useclippath true def
  164. /pagebbox [0 0 612 792] def
  165. X
  166. /R  /Times-Roman def
  167. /I  /Times-Italic def
  168. /B  /Times-Bold def
  169. /BI /Times-BoldItalic def
  170. /H  /Helvetica def
  171. /HI /Helvetica-Oblique def
  172. /HB /Helvetica-Bold def
  173. /HX /Helvetica-BoldOblique def
  174. /CW /Courier def
  175. /CO /Courier def
  176. /CI /Courier-Oblique def
  177. /CB /Courier-Bold def
  178. /CX /Courier-BoldOblique def
  179. /PA /Palatino-Roman def
  180. /PI /Palatino-Italic def
  181. /PB /Palatino-Bold def
  182. /PX /Palatino-BoldItalic def
  183. /Hr /Helvetica-Narrow def
  184. /Hi /Helvetica-Narrow-Oblique def
  185. /Hb /Helvetica-Narrow-Bold def
  186. /Hx /Helvetica-Narrow-BoldOblique def
  187. /KR /Bookman-Light def
  188. /KI /Bookman-LightItalic def
  189. /KB /Bookman-Demi def
  190. /KX /Bookman-DemiItalic def
  191. /AR /AvantGarde-Book def
  192. /AI /AvantGarde-BookOblique def
  193. /AB /AvantGarde-Demi def
  194. /AX /AvantGarde-DemiOblique def
  195. /NR /NewCenturySchlbk-Roman def
  196. /NI /NewCenturySchlbk-Italic def
  197. /NB /NewCenturySchlbk-Bold def
  198. /NX /NewCenturySchlbk-BoldItalic def
  199. /ZD /ZapfDingbats def
  200. /ZI /ZapfChancery-MediumItalic def
  201. /S  /S def
  202. /S1 /S1 def
  203. /GR /Symbol def
  204. X
  205. /inch {72 mul} bind def
  206. /min {2 copy gt {exch} if pop} bind def
  207. X
  208. /setup {
  209. X    counttomark 2 idiv {def} repeat pop
  210. X
  211. X    landscape {/orientation 90 orientation add def} if
  212. X    /scaling 72 resolution div def
  213. X    linewidth setlinewidth
  214. X    1 setlinecap
  215. X
  216. X    pagedimensions
  217. X    xcenter ycenter translate
  218. X    orientation rotation mul rotate
  219. X    width 2 div neg height 2 div translate
  220. X    xoffset inch yoffset inch neg translate
  221. X    margin 2 div dup neg translate
  222. X    magnification dup aspectratio mul scale
  223. X    scaling scaling scale
  224. X
  225. X    /Symbol /S Sdefs cf
  226. X    /Times-Roman /S1 S1defs cf
  227. X    0 0 moveto
  228. } def
  229. X
  230. /pagedimensions {
  231. X    useclippath userdict /gotpagebbox known not and {
  232. X        /pagebbox [clippath pathbbox newpath] def
  233. X        roundpage currentdict /roundpagebbox known and {roundpagebbox} if
  234. X    } if
  235. X    pagebbox aload pop
  236. X    4 -1 roll exch 4 1 roll 4 copy
  237. X    landscape {4 2 roll} if
  238. X    sub /width exch def
  239. X    sub /height exch def
  240. X    add 2 div /xcenter exch def
  241. X    add 2 div /ycenter exch def
  242. X    userdict /gotpagebbox true put
  243. } def
  244. X
  245. /pagesetup {
  246. X    /page exch def
  247. X    currentdict /pagedict known currentdict page known and {
  248. X        page load pagedict exch get cvx exec
  249. X    } if
  250. } def
  251. X
  252. /decodingdefs [
  253. X    {counttomark 2 idiv {y moveto show} repeat}
  254. X    {neg /y exch def counttomark 2 idiv {y moveto show} repeat}
  255. X    {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat}
  256. X    {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat}
  257. X    {counttomark 2 idiv {y moveto show} repeat}
  258. X    {neg setfunnytext}
  259. ] def
  260. X
  261. /setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def
  262. X
  263. /w {neg moveto show} bind def
  264. /m {neg dup /y exch def moveto} bind def
  265. /done {/lastpage where {pop lastpage} if} def
  266. X
  267. /f {
  268. X    dup /font exch def findfont exch
  269. X    dup /ptsize exch def scaling div dup /size exch def scalefont setfont
  270. X    linewidth ptsize mul scaling 10 mul div setlinewidth
  271. X    /spacewidth ( ) stringwidth pop def
  272. } bind def
  273. X
  274. /changefont {
  275. X    /fontheight exch def
  276. X    /fontslant exch def
  277. X    currentfont [
  278. X        1 0
  279. X        fontheight ptsize div fontslant sin mul fontslant cos div
  280. X        fontheight ptsize div
  281. X        0 0
  282. X    ] makefont setfont
  283. } bind def
  284. X
  285. /sf {f} bind def
  286. X
  287. /cf {
  288. X    dup length 2 idiv
  289. X    /entries exch def
  290. X    /chtab exch def
  291. X    /newfont exch def
  292. X
  293. X    findfont dup length 1 add dict
  294. X    /newdict exch def
  295. X    {1 index /FID ne {newdict 3 1 roll put} {pop pop} ifelse} forall
  296. X
  297. X    newdict /Metrics entries dict put
  298. X    newdict /Metrics get
  299. X    begin
  300. X        chtab aload pop
  301. X        1 1 entries {pop def} for
  302. X        newfont newdict definefont pop
  303. X    end
  304. } bind def
  305. X
  306. %
  307. % A few arrays used to adjust reference points and character widths in some
  308. % of the printer resident fonts. If square roots are too high try changing
  309. % the lines describing /radical and /radicalex to,
  310. %
  311. %    /radical    [0 -75 550 0]
  312. %    /radicalex    [-50 -75 500 0]
  313. %
  314. % Move braceleftbt a bit - default PostScript character is off a bit.
  315. %
  316. X
  317. /Sdefs [
  318. X    /bracketlefttp        [201 500]
  319. X    /bracketleftbt        [201 500]
  320. X    /bracketrighttp        [-81 380]
  321. X    /bracketrightbt        [-83 380]
  322. X    /braceleftbt        [203 490]
  323. X    /bracketrightex        [220 -125 500 0]
  324. X    /radical        [0 0 550 0]
  325. X    /radicalex        [-50 0 500 0]
  326. X    /parenleftex        [-20 -170 0 0]
  327. X    /integral        [100 -50 500 0]
  328. X    /infinity        [10 -75 730 0]
  329. ] def
  330. X
  331. /S1defs [
  332. X    /underscore        [0 80 500 0]
  333. X    /endash            [7 90 650 0]
  334. ] def
  335. %
  336. % Tries to round clipping path dimensions, as stored in array pagebbox, so they
  337. % match one of the known sizes in the papersizes array. Lower left coordinates
  338. % are always set to 0.
  339. %
  340. X
  341. /roundpagebbox {
  342. X    7 dict begin
  343. X    /papersizes [8.5 inch 11 inch 14 inch 17 inch] def
  344. X
  345. X    /mappapersize {
  346. X        /val exch def
  347. X        /slop .5 inch def
  348. X        /diff slop def
  349. X        /j 0 def
  350. X        0 1 papersizes length 1 sub {
  351. X            /i exch def
  352. X            papersizes i get val sub abs
  353. X            dup diff le {/diff exch def /j i def} {pop} ifelse
  354. X        } for
  355. X        diff slop lt {papersizes j get} {val} ifelse
  356. X    } def
  357. X
  358. X    pagebbox 0 0 put
  359. X    pagebbox 1 0 put
  360. X    pagebbox dup 2 get mappapersize 2 exch put
  361. X    pagebbox dup 3 get mappapersize 3 exch put
  362. X    end
  363. } bind def
  364. X
  365. %%EndProlog
  366. %%BeginSetup
  367. mark
  368. /linewidth 0.5 def
  369. /xoffset 0 def
  370. /yoffset 0 def
  371. /#copies 1 store
  372. /magnification 1 def
  373. %%FormsPerPage: 1
  374. /formsperpage 1 def
  375. X
  376. /landscape false def
  377. /resolution 720 def
  378. setup
  379. 2 setdecoding
  380. %%EndSetup
  381. %%Page: 1 1
  382. /saveobj save def
  383. mark
  384. 1 pagesetup
  385. 12 B f
  386. (Rc \320 A Shell for Plan 9 and UNIX Systems)9 2230 1 1765 1230 t
  387. 10 I f
  388. (Tom Duff)1 381 1 2689 1470 t
  389. 10 R f
  390. (AT&T Bell Laboratories)2 993 1 2383 1650 t
  391. (Murray Hill, New Jersey 07974)4 1267 1 2246 1770 t
  392. 10 I f
  393. (ABSTRACT)2643 2150 w
  394. (Rc)1330 2410 w
  395. 10 R f
  396. ( also runs on a variety of traditional sys-)8 1641( It)1 115( interpreter for Plan 9.)4 900(is a command)2 561 4 1463 2410 t
  397. ( provides similar facilities to Bourne's)5 1580( It)1 120( SunOS and the Tenth Edition.)5 1273(tems, including)1 627 4 1080 2530 t
  398. 10 I f
  399. (/bin/sh)1080 2650 w
  400. 10 R f
  401. ( paper intro-)2 497( This)1 229(, with some small additions and mostly less idiosyncratic syntax.)9 2601 3 1353 2650 t
  402. (duces)1080 2770 w
  403. 10 I f
  404. (rc)1335 2770 w
  405. 10 R f
  406. ( why it varies)3 547('s highlights with numerous examples, and discusses its design and)9 2715 2 1418 2770 t
  407. (from Bourne's.)1 610 1 1080 2890 t
  408. 10 B f
  409. (1. Introduction)1 670 1 720 3250 t
  410. 10 R f
  411. ( new)1 208( porting the Bourne shell to an incompatible)7 1875( As)1 177(Plan 9 needs a command-programming language.)5 2060 4 720 3406 t
  412. ( new command interpreter, called)4 1350(environment seemed a daunting task, I chose to write a)9 2232 2 720 3526 t
  413. 10 I f
  414. (rc)4330 3526 w
  415. 10 R f
  416. (because it runs)2 599 1 4441 3526 t
  417. ( could hardly resist trying to)5 1220( tinkering with perfection is a dangerous business, I)8 2197(commands. Although)1 903 3 720 3646 t
  418. ( Thus)1 250(`improve' on Bourne's design.)3 1226 2 720 3766 t
  419. 10 I f
  420. (rc)2221 3766 w
  421. 10 R f
  422. (is similar in spirit but different in detail from Bourne's shell.)10 2424 1 2329 3766 t
  423. (The bulk of this paper describes)5 1318 1 720 3922 t
  424. 10 I f
  425. (rc)2071 3922 w
  426. 10 R f
  427. ( features with many small examples and a few larger ones.)10 2426('s principal)1 460 2 2154 3922 t
  428. (We close with a discussion of the principles guiding)8 2143 1 720 4042 t
  429. 10 I f
  430. (rc)2895 4042 w
  431. 10 R f
  432. ( it differs from Bourne's design.)5 1317('s design and why)3 745 2 2978 4042 t
  433. ( features, as individual details)4 1198(The descriptive sections include little discussion of the rationale for particular)10 3122 2 720 4162 t
  434. ( skip to the discussion at the end before)8 1632( impatient reader may wish to)5 1230( The)1 213(are hard to justify in isolation.)5 1245 4 720 4282 t
  435. (skimming the expository parts of the paper.)6 1740 1 720 4402 t
  436. 10 B f
  437. ( commands)1 486(2. Simple)1 420 2 720 4642 t
  438. 10 R f
  439. (For the simplest uses)3 881 1 720 4798 t
  440. 10 I f
  441. (rc)1639 4798 w
  442. 10 R f
  443. ( all of the following behave as)6 1293( Thus)1 263(has syntax familiar to Bourne-shell users.)5 1724 3 1760 4798 t
  444. (expected:)720 4918 w
  445. 9 CW f
  446. (date)1008 5088 w
  447. (con alice)1 486 1 1008 5198 t
  448. (who >user.names)1 810 1 1008 5308 t
  449. (who >>user.names)1 864 1 1008 5418 t
  450. (wc <file)1 432 1 1008 5528 t
  451. (echo [a-f]*.c)1 702 1 1008 5638 t
  452. (who | wc)2 432 1 1008 5748 t
  453. (who; date)1 486 1 1008 5858 t
  454. (cc *.c &)2 432 1 1008 5968 t
  455. (cyntax *.c && cc -g -o cmd *.c)7 1620 1 1008 6078 t
  456. (rm -r junk || echo rm failed!)6 1566 1 1008 6188 t
  457. 10 B f
  458. (3. Quotation)1 559 1 720 6488 t
  459. 10 R f
  460. (An argument that contains a space or one of)8 1813 1 720 6644 t
  461. 10 I f
  462. (rc)2565 6644 w
  463. 10 R f
  464. ( in apostrophes)2 621('s other syntax characters must be enclosed)6 1771 2 2648 6644 t
  465. (\()720 6764 w
  466. 10 CW f
  467. (')753 6764 w
  468. 10 R f
  469. (\):)813 6764 w
  470. 9 CW f
  471. (rm 'odd file name')3 972 1 1008 6934 t
  472. 10 R f
  473. (An apostrophe in a quoted argument must be doubled:)8 2170 1 720 7114 t
  474. cleartomark
  475. showpage
  476. saveobj restore
  477. %%EndPage: 1 1
  478. %%Page: 2 2
  479. /saveobj save def
  480. mark
  481. 2 pagesetup
  482. 10 R f
  483. (- 2 -)2 166 1 2797 480 t
  484. 9 CW f
  485. (echo 'How''s your father?')3 1404 1 1008 830 t
  486. 10 B f
  487. (4. Variables)1 536 1 720 1130 t
  488. 10 I f
  489. (Rc)720 1286 w
  490. 10 R f
  491. ( by typing, for)3 602( may be given values)4 879( Variables)1 441(provides variables whose values are lists of arguments.)7 2259 4 859 1286 t
  492. (example:)720 1406 w
  493. 9 CW f
  494. (path=\(. /bin /usr/bin\))2 1188 1 1008 1576 t
  495. (user=td)1008 1686 w
  496. (tty=/dev/tty8)1008 1796 w
  497. 10 R f
  498. (The parentheses indicate that the value assigned to)7 2049 1 720 1976 t
  499. 10 CW f
  500. (path)2798 1976 w
  501. 10 R f
  502. ( strings. The variables)3 897(is a list of three)4 632 2 3067 1976 t
  503. 10 CW f
  504. (user)4626 1976 w
  505. 10 R f
  506. (and)4896 1976 w
  507. 10 CW f
  508. (tty)720 2096 w
  509. 10 R f
  510. (are assigned lists containing a single string.)6 1735 1 925 2096 t
  511. (The value of a variable can be substituted into a command by preceding its name with a)16 3505 1 720 2252 t
  512. 10 CW f
  513. ($)4250 2252 w
  514. 10 R f
  515. (, like this:)2 398 1 4310 2252 t
  516. 9 CW f
  517. (echo $path)1 540 1 1008 2422 t
  518. 10 R f
  519. (If)720 2602 w
  520. 10 CW f
  521. (path)811 2602 w
  522. 10 R f
  523. (had been set as above, this would be equivalent to)9 1997 1 1076 2602 t
  524. 9 CW f
  525. (echo . /bin /usr/bin)3 1080 1 1008 2772 t
  526. 10 R f
  527. (Variables may be subscripted by numbers or lists of numbers, like this:)11 2842 1 720 2952 t
  528. 9 CW f
  529. (echo $path\(2\))1 702 1 1008 3122 t
  530. (echo $path\(3 2 1\))3 918 1 1008 3232 t
  531. 10 R f
  532. (These are equivalent to)3 928 1 720 3412 t
  533. 9 CW f
  534. (echo /bin)1 486 1 1008 3582 t
  535. (echo /usr/bin /bin .)3 1080 1 1008 3692 t
  536. 10 R f
  537. ( the subscript)2 555( Otherwise,)1 496(There can be no space separating the variable's name from the left parenthesis.)12 3269 3 720 3872 t
  538. (would be considered a separate parenthesized list.)6 1992 1 720 3992 t
  539. (The number of strings in a variable can be determined by the)11 2431 1 720 4148 t
  540. 10 CW f
  541. ($#)3176 4148 w
  542. 10 R f
  543. ( example,)1 388(operator. For)1 546 2 3321 4148 t
  544. 9 CW f
  545. (echo $#path)1 594 1 1008 4318 t
  546. 10 R f
  547. (would print the number of entries in)6 1443 1 720 4498 t
  548. 10 CW f
  549. ($path)2188 4498 w
  550. 10 R f
  551. (.)2488 4498 w
  552. (The following two assignments are subtly different:)6 2070 1 720 4654 t
  553. 9 CW f
  554. (empty=\(\))1008 4824 w
  555. (null='')1008 4934 w
  556. 10 R f
  557. (The first sets)2 538 1 720 5114 t
  558. 10 CW f
  559. (empty)1294 5114 w
  560. 10 R f
  561. ( second sets)2 501( The)1 217( list containing no strings.)4 1085(to a)1 158 4 1630 5114 t
  562. 10 CW f
  563. (null)3628 5114 w
  564. 10 R f
  565. (to a list containing a single)5 1135 1 3905 5114 t
  566. (string, but the string contains no characters.)6 1742 1 720 5234 t
  567. ( indistinguishable\),)1 775(Although these may seem like more or less the same thing \(in Bourne's shell, they are)15 3545 2 720 5390 t
  568. ( other things)2 500( Among)1 350(they behave differently in almost all circumstances.)6 2060 3 720 5510 t
  569. 9 CW f
  570. (echo $#empty)1 648 1 1008 5680 t
  571. 10 R f
  572. (prints 0, whereas)2 679 1 720 5860 t
  573. 9 CW f
  574. (echo $#null)1 594 1 1008 6030 t
  575. 10 R f
  576. (prints 1.)1 328 1 720 6210 t
  577. (All variables that have never been set have the value)9 2097 1 720 6366 t
  578. 10 CW f
  579. (\(\))2842 6366 w
  580. 10 R f
  581. (.)2962 6366 w
  582. 10 B f
  583. (5. Arguments)1 602 1 720 6606 t
  584. 10 R f
  585. (When)720 6762 w
  586. 10 I f
  587. (rc)983 6762 w
  588. 10 R f
  589. ( from a file, the file has access to the arguments supplied on)12 2405(is reading its input)3 742 2 1091 6762 t
  590. 10 I f
  591. (rc)4264 6762 w
  592. 10 R f
  593. ('s command line.)2 693 1 4347 6762 t
  594. (The variable)1 504 1 720 6882 t
  595. 10 CW f
  596. ($*)1252 6882 w
  597. 10 R f
  598. ( names)1 282( The)1 207( it.)1 108(initially has the list of arguments assigned to)7 1807 4 1400 6882 t
  599. 10 CW f
  600. ($1)3831 6882 w
  601. 10 R f
  602. (,)3951 6882 w
  603. 10 CW f
  604. ($2)4003 6882 w
  605. 10 R f
  606. (, etc. are synonyms for)4 917 1 4123 6882 t
  607. 10 CW f
  608. ($*\(1\))720 7002 w
  609. 10 R f
  610. (,)1020 7002 w
  611. 10 CW f
  612. ($*\(2\))1070 7002 w
  613. 10 R f
  614. ( addition,)1 378( In)1 133(, etc.)1 191 3 1370 7002 t
  615. 10 CW f
  616. ($0)2097 7002 w
  617. 10 R f
  618. (is the name of the file from which)7 1356 1 2242 7002 t
  619. 10 I f
  620. (rc)3623 7002 w
  621. 10 R f
  622. ('s input is being read.)4 863 1 3706 7002 t
  623. cleartomark
  624. showpage
  625. saveobj restore
  626. %%EndPage: 2 2
  627. %%Page: 3 3
  628. /saveobj save def
  629. mark
  630. 3 pagesetup
  631. 10 R f
  632. (- 3 -)2 166 1 2797 480 t
  633. 10 B f
  634. (6. Concatenation)1 747 1 720 840 t
  635. 10 I f
  636. (Rc)720 996 w
  637. 10 R f
  638. (has a string concatenation operator, the caret)6 1781 1 850 996 t
  639. 10 CW f
  640. (\303)2656 996 w
  641. 10 R f
  642. (, to build arguments out of pieces.)6 1360 1 2716 996 t
  643. 9 CW f
  644. (echo hully\303gully)1 864 1 1008 1166 t
  645. 10 R f
  646. (is exactly equivalent to)3 924 1 720 1346 t
  647. 9 CW f
  648. (echo hullygully)1 810 1 1008 1516 t
  649. 10 R f
  650. (Suppose variable)1 685 1 720 1696 t
  651. 10 CW f
  652. (i)1430 1696 w
  653. 10 R f
  654. ( Then)1 255(contains the name of a command.)5 1342 2 1515 1696 t
  655. 9 CW f
  656. (cc -o $i $i\303.c)3 756 1 1008 1866 t
  657. 10 R f
  658. (might compile the command's source code, leaving the result in the appropriate file.)12 3367 1 720 2046 t
  659. (Concatenation distributes over lists. The following)5 2027 1 720 2202 t
  660. 9 CW f
  661. (echo \(a b c\)\303\(1 2 3\))5 1080 1 1008 2372 t
  662. (src=\(main subr io\))2 972 1 1008 2482 t
  663. (cc $src\303.c)1 540 1 1008 2592 t
  664. 10 R f
  665. (are equivalent to)2 665 1 720 2772 t
  666. 9 CW f
  667. (echo a1 b2 c3)3 702 1 1008 2942 t
  668. (cc main.c subr.c io.c)3 1134 1 1008 3052 t
  669. 10 R f
  670. (In detail, the rule is: if both operands of)8 1640 1 720 3232 t
  671. 10 CW f
  672. (\303)2392 3232 w
  673. 10 R f
  674. ( non-zero number of strings, they are con-)7 1735(are lists of the same)4 821 2 2484 3232 t
  675. ( if one of the operands is a single string, it is concatenated with each mem-)15 3059( Otherwise,)1 491(catenated pairwise.)1 770 3 720 3352 t
  676. ( other combination of operands is an error.)7 1702( Any)1 222(ber of the other operand in turn.)6 1272 3 720 3472 t
  677. 10 B f
  678. ( carets)1 279(7. Free)1 318 2 720 3712 t
  679. 10 R f
  680. (User demand has dictated that)4 1263 1 720 3868 t
  681. 10 I f
  682. (rc)2023 3868 w
  683. 10 R f
  684. ( syntax look more like the)5 1121(insert carets in certain places, to make the)7 1773 2 2146 3868 t
  685. ( example, this:)2 586( For)1 189(Bourne shell.)1 533 3 720 3988 t
  686. 9 CW f
  687. (cc -$flags $stems.c)2 1026 1 1008 4158 t
  688. 10 R f
  689. (is equivalent to)2 611 1 720 4338 t
  690. 9 CW f
  691. (cc -\303$flags $stems\303.c)2 1134 1 1008 4508 t
  692. 10 R f
  693. (In general,)1 440 1 720 4688 t
  694. 10 I f
  695. (rc)1199 4688 w
  696. 10 R f
  697. (will insert)1 417 1 1321 4688 t
  698. 10 CW f
  699. (\303)1777 4688 w
  700. 10 R f
  701. ( Specifically,)1 567( not separated by white space.)5 1272(between two arguments that are)4 1325 3 1876 4688 t
  702. (whenever one of)2 668 1 720 4808 t
  703. 10 CW f
  704. ($'`)1415 4808 w
  705. 10 R f
  706. (follows a quoted or unquoted word, or an unquoted word follows a quoted word with)14 3418 1 1622 4808 t
  707. (no intervening blanks or tabs, a)5 1264 1 720 4928 t
  708. 10 CW f
  709. (\303)2011 4928 w
  710. 10 R f
  711. ( an unquoted word immediately following)5 1700( If)1 119( between the two.)3 713(is inserted)1 410 4 2098 4928 t
  712. (a)720 5048 w
  713. 10 CW f
  714. ($)797 5048 w
  715. 10 R f
  716. (contains a character other than an alphanumeric, underscore or)8 2564 1 890 5048 t
  717. 10 CW f
  718. (*)3487 5048 w
  719. 10 R f
  720. (, a)1 102 1 3547 5048 t
  721. 10 CW f
  722. (\303)3682 5048 w
  723. 10 R f
  724. ( the first such)3 562(is inserted before)2 703 2 3775 5048 t
  725. (character.)720 5168 w
  726. 10 B f
  727. ( substitution)1 532(8. Command)1 575 2 720 5408 t
  728. 10 R f
  729. ( list from the output of a command.)7 1444(It is often useful to build an argument)7 1528 2 720 5564 t
  730. 10 I f
  731. (Rc)3746 5564 w
  732. 10 R f
  733. (allows a command, enclosed)3 1160 1 3880 5564 t
  734. (in braces and preceded by a left quote,)7 1569 1 720 5684 t
  735. 10 CW f
  736. (`{...})2319 5684 w
  737. 10 R f
  738. ( command is)2 519( The)1 209( an argument is required.)4 1011(, anywhere that)2 622 4 2679 5684 t
  739. ( characters stored in the variable)5 1333( The)1 213( its standard output captured.)4 1189(executed and)1 530 4 720 5804 t
  740. 10 CW f
  741. (ifs)4018 5804 w
  742. 10 R f
  743. (are used to split the)4 809 1 4231 5804 t
  744. ( example,)1 388( For)1 189(output into arguments.)2 903 3 720 5924 t
  745. 9 CW f
  746. (cat `{ls -tr|sed 10q})3 1134 1 1008 6094 t
  747. 10 R f
  748. (will catenate the ten oldest files in the current directory in temporal order.)12 2947 1 720 6274 t
  749. 10 B f
  750. ( branching)1 465(9. Pipeline)1 470 2 720 6514 t
  751. 10 R f
  752. ( occasionally it is useful to have)6 1312( Very)1 254( for almost all cases.)4 838(The normal pipeline notation is general enough)6 1916 4 720 6670 t
  753. ( can require arbitrarily large pipe)5 1350( topologies more general than trees)5 1440( Pipeline)1 386(pipelines that are not linear.)4 1144 4 720 6790 t
  754. (buffers, or worse, can cause deadlock.)5 1567 1 720 6910 t
  755. 10 I f
  756. (Rc)2346 6910 w
  757. 10 R f
  758. ( of non-linear but treelike pipelines.)5 1481(has syntax for some kinds)4 1074 2 2485 6910 t
  759. (For example,)1 527 1 720 7030 t
  760. 9 CW f
  761. (cmp <{old} <{new})2 918 1 1440 7200 t
  762. cleartomark
  763. showpage
  764. saveobj restore
  765. %%EndPage: 3 3
  766. %%Page: 4 4
  767. /saveobj save def
  768. mark
  769. 4 pagesetup
  770. 10 R f
  771. (- 4 -)2 166 1 2797 480 t
  772. (will regression test a new version of a command.)8 1963 1 720 840 t
  773. 10 CW f
  774. (<)2734 840 w
  775. 10 R f
  776. (or)2820 840 w
  777. 10 CW f
  778. (>)2929 840 w
  779. 10 R f
  780. ( in braces causes the com-)5 1054(followed by a command)3 971 2 3015 840 t
  781. ( parent command \()3 751( The)1 205( be run with its standard output or input attached to a pipe.)12 2334(mand to)1 326 4 720 960 t
  782. 10 CW f
  783. (cmp)4336 960 w
  784. 10 R f
  785. (in the exam-)2 499 1 4541 960 t
  786. ( descriptor or other, and with an argument)7 1701(ple\) is started with the other end of the pipe attached to some file)13 2619 2 720 1080 t
  787. ( connect to the pipe when opened \(e.g.)7 1601(that will)1 341 2 720 1200 t
  788. 10 CW f
  789. (/dev/fd/6)2721 1200 w
  790. 10 R f
  791. ( systems without)2 691(.\) On)1 239 2 3261 1200 t
  792. 10 CW f
  793. (/dev/fd)4225 1200 w
  794. 10 R f
  795. (or some-)1 361 1 4679 1200 t
  796. (thing similar \(SunOS for example\) this feature does not work.)9 2475 1 720 1320 t
  797. 10 B f
  798. ( status)1 275(10. Exit)1 353 2 720 1560 t
  799. 10 R f
  800. ( Plan 9 status is a character)6 1153( On)1 184( executed it.)2 509(When a command exits it returns status to the program that)10 2474 4 720 1716 t
  801. ( normal termination it is empty.)5 1267( On)1 172(string describing an error condition.)4 1434 3 720 1836 t
  802. 10 I f
  803. (Rc)720 1992 w
  804. 10 R f
  805. ( the variable)2 537(captures commands' exit statuses in)4 1521 2 871 1992 t
  806. 10 CW f
  807. ($status)2976 1992 w
  808. 10 R f
  809. ( a simple command the value of)6 1408(. For)1 236 2 3396 1992 t
  810. 10 CW f
  811. ($status)720 2112 w
  812. 10 R f
  813. ( a pipeline)2 420( For)1 191(is just as described above.)4 1048 3 1167 2112 t
  814. 10 CW f
  815. ($status)2853 2112 w
  816. 10 R f
  817. ( to the concatenation of the statuses of)7 1535(is set)1 205 2 3300 2112 t
  818. (the pipeline components with)3 1180 1 720 2232 t
  819. 10 CW f
  820. (|)1925 2232 w
  821. 10 R f
  822. (characters for separators.)2 998 1 2010 2232 t
  823. 10 I f
  824. (Rc)720 2388 w
  825. 10 R f
  826. ( control flow, many of them conditioned by the status returned from previously)12 3286(has a several kinds of)4 895 2 859 2388 t
  827. ( Any)1 224(executed commands.)1 839 2 720 2508 t
  828. 10 CW f
  829. ($status)1810 2508 w
  830. 10 R f
  831. (containing only)1 627 1 2257 2508 t
  832. 10 CW f
  833. (0)2911 2508 w
  834. 10 R f
  835. ('s and)1 243 1 2971 2508 t
  836. 10 CW f
  837. (|)3241 2508 w
  838. 10 R f
  839. ('s has boolean value)3 818 1 3301 2508 t
  840. 10 I f
  841. (true)4146 2508 w
  842. 10 R f
  843. ( other status)2 485(. Any)1 248 2 4307 2508 t
  844. (is)720 2628 w
  845. 10 I f
  846. (false)812 2628 w
  847. 10 R f
  848. (.)1001 2628 w
  849. 10 B f
  850. ( grouping)1 415(11. Command)1 625 2 720 2868 t
  851. 10 R f
  852. (A sequence of commands enclosed in)5 1505 1 720 3024 t
  853. 10 CW f
  854. ({})2250 3024 w
  855. 10 R f
  856. ( example:)1 391( For)1 189(may be used anywhere a command is required.)7 1873 3 2395 3024 t
  857. 9 CW f
  858. ({sleep 3600;echo 'Time''s up!'}&)3 1728 1 1008 3194 t
  859. 10 R f
  860. ( the braces:)2 454( Without)1 378(will wait an hour in the background, then print a message.)10 2319 3 720 3374 t
  861. 9 CW f
  862. (sleep 3600;echo 'Time''s up!'&)3 1620 1 1008 3544 t
  863. 10 R f
  864. (this would lock up the terminal for an hour, then print the message in the background!)15 3440 1 720 3724 t
  865. 10 B f
  866. ( flow \320)2 333(12. Control)1 508 2 720 3964 t
  867. 10 CW f
  868. (for)1586 3964 w
  869. 10 R f
  870. (A command may be executed once for each member of a list by typing, for example:)15 3387 1 720 4120 t
  871. 9 CW f
  872. (for\(i in printf scanf putchar\) look $i /usr/td/lib/dw.dat)7 3078 1 1008 4290 t
  873. 10 R f
  874. (This looks for each of the words)6 1292 1 720 4470 t
  875. 10 CW f
  876. (printf)2037 4470 w
  877. 10 R f
  878. (,)2397 4470 w
  879. 10 CW f
  880. (scanf)2447 4470 w
  881. 10 R f
  882. (and)2772 4470 w
  883. 10 CW f
  884. (putchar)2941 4470 w
  885. 10 R f
  886. ( general form is)3 629( The)1 205(in the given file.)3 655 3 3386 4470 t
  887. 9 CW f
  888. (for\()1008 4640 w
  889. 9 I f
  890. (name)1224 4640 w
  891. 9 CW f
  892. (in)1473 4640 w
  893. 9 I f
  894. (list)1635 4640 w
  895. 9 CW f
  896. (\))1745 4640 w
  897. 9 I f
  898. (command)1853 4640 w
  899. 10 R f
  900. (or)720 4820 w
  901. 9 CW f
  902. (for\()1008 4990 w
  903. 9 I f
  904. (name)1224 4990 w
  905. 9 CW f
  906. (\))1419 4990 w
  907. 9 I f
  908. (command)1527 4990 w
  909. 10 R f
  910. ( first case)2 394(In the)1 235 2 720 5170 t
  911. 10 I f
  912. (command)1380 5170 w
  913. 10 R f
  914. (is executed once for each member of)6 1503 1 1799 5170 t
  915. 10 I f
  916. (list)3333 5170 w
  917. 10 R f
  918. (with that member assigned to variable)5 1553 1 3487 5170 t
  919. 10 I f
  920. (name)720 5290 w
  921. 10 R f
  922. (. If)1 141 1 936 5290 t
  923. 10 CW f
  924. (in)1102 5290 w
  925. 10 I f
  926. (list)1247 5290 w
  927. 10 R f
  928. (is not given,)2 492 1 1395 5290 t
  929. 10 I f
  930. ($*)1912 5290 w
  931. 10 R f
  932. (is used.)1 300 1 2037 5290 t
  933. 10 B f
  934. ( execution \320)2 555(13. Conditional)1 682 2 720 5530 t
  935. 10 CW f
  936. (if)1982 5530 w
  937. 10 I f
  938. (Rc)720 5686 w
  939. 10 R f
  940. ( example:)1 391( For)1 189(also provides a general if-statement.)4 1444 3 850 5686 t
  941. 9 CW f
  942. (if\(cyntax *.c\) cc -g -o cmd *.c)6 1674 1 1008 5856 t
  943. 10 R f
  944. (runs the C compiler whenever)4 1259 1 720 6036 t
  945. 10 CW f
  946. (cyntax)2018 6036 w
  947. 10 R f
  948. (finds no problems with)3 967 1 2417 6036 t
  949. 10 CW f
  950. (*.c)3423 6036 w
  951. 10 R f
  952. ( `if not' statement provides a)5 1226(. An)1 211 2 3603 6036 t
  953. ( example:)1 391( For)1 189(two-tailed conditional.)1 905 3 720 6156 t
  954. 9 CW f
  955. (for\(i\){)1008 6326 w
  956. (if\(test -f /tmp/$i\) echo $i already in /tmp)7 2322 1 1224 6436 t
  957. (if not cp $i /tmp)4 918 1 1224 6546 t
  958. (})1008 6656 w
  959. 10 R f
  960. (This loops over each file in)5 1090 1 720 6836 t
  961. 10 CW f
  962. ($*)1835 6836 w
  963. 10 R f
  964. (, copying to)2 475 1 1955 6836 t
  965. 10 CW f
  966. (/tmp)2455 6836 w
  967. 10 R f
  968. (those that do not already appear there, and printing a mes-)10 2320 1 2720 6836 t
  969. (sage for those that do.)4 879 1 720 6956 t
  970. cleartomark
  971. showpage
  972. saveobj restore
  973. %%EndPage: 4 4
  974. %%Page: 5 5
  975. /saveobj save def
  976. mark
  977. 5 pagesetup
  978. 10 R f
  979. (- 5 -)2 166 1 2797 480 t
  980. 10 B f
  981. ( flow \320)2 333(14. Control)1 508 2 720 840 t
  982. 10 CW f
  983. (while)1586 840 w
  984. 10 I f
  985. (Rc)720 996 w
  986. 10 R f
  987. ('s while statement looks like this:)5 1342 1 825 996 t
  988. 9 CW f
  989. (while\(newer subr.c subr.o\) sleep 5)4 1836 1 1008 1166 t
  990. 10 R f
  991. (This waits until)2 623 1 720 1346 t
  992. 10 CW f
  993. (subr.o)1368 1346 w
  994. 10 R f
  995. (is newer than)2 532 1 1753 1346 t
  996. 10 CW f
  997. (subr.c)2310 1346 w
  998. 10 R f
  999. (\(presumably because the C compiler finished with it.\))7 2147 1 2695 1346 t
  1000. 10 B f
  1001. ( flow \320)2 333(15. Control)1 508 2 720 1586 t
  1002. 10 CW f
  1003. (switch)1586 1586 w
  1004. 10 I f
  1005. (Rc)720 1742 w
  1006. 10 R f
  1007. ( general form is)3 629( Its)1 150(provides a switch statement to do pattern-matching on arbitrary strings.)9 2852 3 850 1742 t
  1008. 9 CW f
  1009. (switch\()1008 1912 w
  1010. 9 I f
  1011. (word)1386 1912 w
  1012. 9 CW f
  1013. (\){)1571 1912 w
  1014. (case)1008 2022 w
  1015. 9 I f
  1016. (pattern ...)1 352 1 1278 2022 t
  1017. (commands)1224 2132 w
  1018. 9 CW f
  1019. (case)1008 2242 w
  1020. 9 I f
  1021. (pattern ...)1 352 1 1278 2242 t
  1022. (commands)1224 2352 w
  1023. 9 CW f
  1024. (...)1008 2462 w
  1025. (})1008 2572 w
  1026. 10 I f
  1027. (Rc)720 2752 w
  1028. 10 R f
  1029. ( are the same as)4 647( Patterns)1 376(attempts to match the word against the patterns in each case statement in turn.)13 3164 3 853 2752 t
  1030. (for filename matching, except that)4 1372 1 720 2872 t
  1031. 10 CW f
  1032. (/)2117 2872 w
  1033. 10 R f
  1034. (and the first characters of)4 1013 1 2202 2872 t
  1035. 10 CW f
  1036. (.)3240 2872 w
  1037. 10 R f
  1038. (and)3350 2872 w
  1039. 10 CW f
  1040. (..)3519 2872 w
  1041. 10 R f
  1042. (need not be matched explicitly.)4 1251 1 3689 2872 t
  1043. ( to the next case \(or the end of the switch\) are)11 1864(If any pattern matches, the commands following that case up)9 2456 2 720 3028 t
  1044. ( example,)1 388( For)1 189(executed, and execution of the switch is complete.)7 2010 3 720 3148 t
  1045. 9 CW f
  1046. (switch\($#*\){)1008 3318 w
  1047. (case 1)1 324 1 1008 3428 t
  1048. (cat >>$1)1 432 1 1224 3538 t
  1049. (case 2)1 324 1 1008 3648 t
  1050. (cat >>$2 <$1)2 648 1 1224 3758 t
  1051. (case *)1 324 1 1008 3868 t
  1052. (echo 'Usage: append [from] to')4 1620 1 1224 3978 t
  1053. (})1008 4088 w
  1054. 10 R f
  1055. ( two, the first)3 536( With)1 251( with one file argument, it tacks standard input to its end.)11 2279( Called)1 311(is an append command.)3 943 5 720 4268 t
  1056. ( other number elicits a usage message.)6 1533( Any)1 222(is appended to the second.)4 1051 3 720 4388 t
  1057. (The built-in)1 475 1 720 4544 t
  1058. 10 CW f
  1059. (\304)1220 4544 w
  1060. 10 R f
  1061. ( arguments are a)3 659( Its)1 151( more concise than a switch.)5 1136(command also matches patterns, and is often)6 1789 4 1305 4544 t
  1062. ( sets)1 181( It)1 118(string and a list of patterns.)5 1123 3 720 4664 t
  1063. 10 CW f
  1064. ($status)2173 4664 w
  1065. 10 R f
  1066. (to true if and only if any of the patterns matches the string.)12 2416 1 2624 4664 t
  1067. (The following example processes option arguments for the)7 2349 1 720 4784 t
  1068. 10 I f
  1069. (man)3094 4784 w
  1070. 10 R f
  1071. (\(1\) command:)1 563 1 3266 4784 t
  1072. 9 CW f
  1073. (opt=\(\))1008 4954 w
  1074. (while\(\304 $1 -* [1-9] 10\){)4 1296 1 1008 5064 t
  1075. (switch\($1\){)1224 5174 w
  1076. (case [1-9] 10)2 702 1 1224 5284 t
  1077. (sec=$1 secn=$1)1 756 1 1440 5394 t
  1078. (case -f)1 378 1 1224 5504 t
  1079. (c=f s=f)1 378 1 1440 5614 t
  1080. (case -[qwnt])1 648 1 1224 5724 t
  1081. (cmd=$1)1440 5834 w
  1082. (case -T*)1 432 1 1224 5944 t
  1083. (T=$1)1440 6054 w
  1084. (case -*)1 378 1 1224 6164 t
  1085. (opt=\($opt $1\))1 702 1 1440 6274 t
  1086. (})1224 6384 w
  1087. (shift)1224 6494 w
  1088. (})1008 6604 w
  1089. cleartomark
  1090. showpage
  1091. saveobj restore
  1092. %%EndPage: 5 5
  1093. %%Page: 6 6
  1094. /saveobj save def
  1095. mark
  1096. 6 pagesetup
  1097. 10 R f
  1098. (- 6 -)2 166 1 2797 480 t
  1099. 10 B f
  1100. (16. Functions)1 598 1 720 840 t
  1101. 10 R f
  1102. (Functions may be defined by typing)5 1441 1 720 996 t
  1103. 9 CW f
  1104. (fn)1008 1166 w
  1105. 9 I f
  1106. (name)1170 1166 w
  1107. 9 CW f
  1108. ({)1419 1166 w
  1109. 9 I f
  1110. (commands)1527 1166 w
  1111. 9 CW f
  1112. (})1966 1166 w
  1113. 10 R f
  1114. (Subsequently, whenever a command named)4 1795 1 720 1346 t
  1115. 10 I f
  1116. (name)2550 1346 w
  1117. 10 R f
  1118. (is encountered, the remainder of the command's argu-)7 2238 1 2802 1346 t
  1119. ( to)1 106(ment list will assigned)3 910 2 720 1466 t
  1120. 10 CW f
  1121. ($*)1764 1466 w
  1122. 10 R f
  1123. (and)1912 1466 w
  1124. 10 I f
  1125. (rc)2084 1466 w
  1126. 10 R f
  1127. (will execute the)2 638 1 2195 1466 t
  1128. 10 I f
  1129. (commands)2861 1466 w
  1130. 10 R f
  1131. ( value of)2 355(. The)1 233 2 3288 1466 t
  1132. 10 CW f
  1133. ($*)3904 1466 w
  1134. 10 R f
  1135. (will be restored on com-)4 988 1 4052 1466 t
  1136. ( example:)1 391(pletion. For)1 492 2 720 1586 t
  1137. 9 CW f
  1138. (fn g {)2 324 1 1008 1756 t
  1139. (gre -e $1 *.[hcyl])3 972 1 1224 1866 t
  1140. (})1008 1976 w
  1141. 10 R f
  1142. (defines)720 2156 w
  1143. 10 CW f
  1144. (g)1033 2156 w
  1145. 10 I f
  1146. (pattern)1118 2156 w
  1147. 10 R f
  1148. (to look for occurrences of)4 1030 1 1432 2156 t
  1149. 10 I f
  1150. (pattern)2487 2156 w
  1151. 10 R f
  1152. (in all program source files in the current directory.)8 2015 1 2801 2156 t
  1153. (Function definitions are deleted by writing)5 1707 1 720 2312 t
  1154. 9 CW f
  1155. (fn)1008 2482 w
  1156. 9 I f
  1157. (name)1170 2482 w
  1158. 10 R f
  1159. (with no function body.)3 911 1 720 2662 t
  1160. 10 B f
  1161. ( execution)1 430(17. Command)1 625 2 720 2902 t
  1162. 10 R f
  1163. ( very little about what)4 897(Up to now we've said)4 892 2 720 3058 t
  1164. 10 I f
  1165. (rc)2539 3058 w
  1166. 10 R f
  1167. ( the command name)3 822( If)1 121(does to execute a simple command.)5 1445 3 2652 3058 t
  1168. (is the name of a function defined using)7 1570 1 720 3178 t
  1169. 10 CW f
  1170. (fn)2317 3178 w
  1171. 10 R f
  1172. ( if it is the name of a built-)8 1082( Otherwise,)1 487(, the function is executed.)4 1034 3 2437 3178 t
  1173. (in command, the built-in is executed directly by)7 1964 1 720 3298 t
  1174. 10 I f
  1175. (rc)2716 3298 w
  1176. 10 R f
  1177. ( if the name contains a)5 936(. Otherwise,)1 517 2 2799 3298 t
  1178. 10 CW f
  1179. (/)4284 3298 w
  1180. 10 R f
  1181. (, it is taken to be)5 696 1 4344 3298 t
  1182. (the name of a binary program and is executed using)9 2155 1 720 3418 t
  1183. 10 I f
  1184. (exec)2910 3418 w
  1185. 10 R f
  1186. ( the name contains no)4 907(\(2\). If)1 267 2 3086 3418 t
  1187. 10 CW f
  1188. (/)4294 3418 w
  1189. 10 R f
  1190. (, then directories)2 686 1 4354 3418 t
  1191. (mentioned in the variable)3 1018 1 720 3538 t
  1192. 10 CW f
  1193. ($path)1763 3538 w
  1194. 10 R f
  1195. (are searched until an executable file is found.)7 1806 1 2088 3538 t
  1196. 10 B f
  1197. ( commands)1 486(18. Built-in)1 504 2 720 3778 t
  1198. 10 R f
  1199. ( executed internally by)3 924(Several commands are)2 909 2 720 3934 t
  1200. 10 I f
  1201. (rc)2582 3934 w
  1202. 10 R f
  1203. (because they are difficult or impossible to implement oth-)8 2346 1 2694 3934 t
  1204. (erwise.)720 4054 w
  1205. 10 CW f
  1206. (. [-i])1 360 1 720 4210 t
  1207. 10 I f
  1208. (file ...)1 228 1 1140 4210 t
  1209. 10 R f
  1210. (Execute commands from)2 1008 1 970 4330 t
  1211. 10 I f
  1212. (file)2008 4330 w
  1213. 10 R f
  1214. (.)2136 4330 w
  1215. 10 CW f
  1216. ($*)2216 4330 w
  1217. 10 R f
  1218. ( reminder of the argument list follow-)6 1545(is set for the duration to the)6 1129 2 2366 4330 t
  1219. (ing)970 4450 w
  1220. 10 I f
  1221. (file)1125 4450 w
  1222. 10 R f
  1223. (.)1253 4450 w
  1224. 10 CW f
  1225. ($path)1330 4450 w
  1226. 10 R f
  1227. (is used to search for)4 806 1 1657 4450 t
  1228. 10 I f
  1229. (file)2490 4450 w
  1230. 10 R f
  1231. (. Option)1 354 1 2618 4450 t
  1232. 10 CW f
  1233. (-i)2998 4450 w
  1234. 10 R f
  1235. (indicates interactive input)2 1034 1 3144 4450 t
  1236. 10 S f
  1237. (-)4204 4450 w
  1238. 10 R f
  1239. (a prompt \(found in)3 755 1 4285 4450 t
  1240. 10 CW f
  1241. ($prompt)970 4570 w
  1242. 10 R f
  1243. (\) is printed before each command is read.)7 1651 1 1390 4570 t
  1244. 10 CW f
  1245. (builtin)720 4726 w
  1246. 10 I f
  1247. (command ...)1 488 1 1200 4726 t
  1248. 10 R f
  1249. (Execute)970 4846 w
  1250. 10 I f
  1251. (command)1316 4846 w
  1252. 10 R f
  1253. (as usual except that any function named)6 1597 1 1729 4846 t
  1254. 10 I f
  1255. (command)3351 4846 w
  1256. 10 R f
  1257. ( example,)1 388( For)1 189(is ignored.)1 422 3 3764 4846 t
  1258. 9 CW f
  1259. (fn cd{)1 324 1 1258 5016 t
  1260. (builtin cd $* && pwd)4 1080 1 1474 5126 t
  1261. (})1258 5236 w
  1262. 10 R f
  1263. (defines a replacement for the)4 1177 1 970 5416 t
  1264. 10 CW f
  1265. (cd)2177 5416 w
  1266. 10 R f
  1267. (built-in \(see below\) that announces the full name of the new direc-)11 2713 1 2327 5416 t
  1268. (tory.)970 5536 w
  1269. 10 CW f
  1270. (cd [)1 240 1 720 5692 t
  1271. 10 I f
  1272. (dir)960 5692 w
  1273. 10 CW f
  1274. (])1077 5692 w
  1275. 10 R f
  1276. (Change the current directory to)4 1255 1 970 5812 t
  1277. 10 I f
  1278. (dir)2252 5812 w
  1279. 10 R f
  1280. ( default argument is)3 802(. The)1 232 2 2369 5812 t
  1281. 10 CW f
  1282. ($home)3430 5812 w
  1283. 10 R f
  1284. (.)3730 5812 w
  1285. 10 CW f
  1286. ($cdpath)3808 5812 w
  1287. 10 R f
  1288. (is a list of places in)5 784 1 4256 5812 t
  1289. (which to search for)3 767 1 970 5932 t
  1290. 10 I f
  1291. (dir)1762 5932 w
  1292. 10 R f
  1293. (.)1879 5932 w
  1294. 10 CW f
  1295. (eval [)1 360 1 720 6088 t
  1296. 10 I f
  1297. (arg ...)1 239 1 1080 6088 t
  1298. 10 CW f
  1299. (])1319 6088 w
  1300. 10 R f
  1301. (The arguments are catenated separated by spaces into a string, read as input to)13 3159 1 970 6208 t
  1302. 10 I f
  1303. (rc)4158 6208 w
  1304. 10 R f
  1305. ( For)1 193(, and executed.)2 606 2 4241 6208 t
  1306. (example,)970 6328 w
  1307. 9 CW f
  1308. (x='$y')1258 6498 w
  1309. (y=Doody)1258 6608 w
  1310. (eval echo Howdy, $x)3 1026 1 1258 6718 t
  1311. 10 R f
  1312. (would echo)1 463 1 970 6898 t
  1313. 9 CW f
  1314. (Howdy, Doody)1 648 1 1258 7068 t
  1315. 10 R f
  1316. (since the arguments of)3 901 1 970 7248 t
  1317. 10 CW f
  1318. (eval)1896 7248 w
  1319. 10 R f
  1320. (would be)1 369 1 2161 7248 t
  1321. cleartomark
  1322. showpage
  1323. saveobj restore
  1324. %%EndPage: 6 6
  1325. %%Page: 7 7
  1326. /saveobj save def
  1327. mark
  1328. 7 pagesetup
  1329. 10 R f
  1330. (- 7 -)2 166 1 2797 480 t
  1331. 9 CW f
  1332. (echo Howdy, $y)2 756 1 1258 830 t
  1333. 10 R f
  1334. (after substituting for)2 816 1 970 1010 t
  1335. 10 CW f
  1336. ($x)1811 1010 w
  1337. 10 R f
  1338. (.)1931 1010 w
  1339. 10 CW f
  1340. (shift [)1 420 1 720 1166 t
  1341. 10 I f
  1342. (n)1140 1166 w
  1343. 10 CW f
  1344. (])1190 1166 w
  1345. 10 R f
  1346. (Delete the first)2 593 1 970 1286 t
  1347. 10 I f
  1348. (n)1588 1286 w
  1349. 10 R f
  1350. (\(default 1\) elements of)3 906 1 1663 1286 t
  1351. 10 CW f
  1352. ($*)2594 1286 w
  1353. 10 R f
  1354. (.)2714 1286 w
  1355. 10 CW f
  1356. (wait [)1 360 1 720 1442 t
  1357. 10 I f
  1358. (pid)1080 1442 w
  1359. 10 CW f
  1360. (])1208 1442 w
  1361. 10 R f
  1362. ( given)1 263(Wait for the process with the)5 1231 2 970 1562 t
  1363. 10 I f
  1364. (pid)2505 1562 w
  1365. 10 R f
  1366. ( no)1 141( If)1 132(to exit.)1 294 3 2674 1562 t
  1367. 10 I f
  1368. (pid)3282 1562 w
  1369. 10 R f
  1370. (is given, all outstanding processes are)5 1589 1 3451 1562 t
  1371. (waited for.)1 432 1 970 1682 t
  1372. 10 CW f
  1373. (whatis)720 1838 w
  1374. 10 I f
  1375. (name ...)1 316 1 1140 1838 t
  1376. 10 R f
  1377. ( each)1 209(Print the value of)3 694 2 970 1958 t
  1378. 10 I f
  1379. (name)1900 1958 w
  1380. 10 R f
  1381. (in a form suitable for input to)6 1189 1 2143 1958 t
  1382. 10 I f
  1383. (rc)3359 1958 w
  1384. 10 R f
  1385. ( output is an assignment to a vari-)7 1366(. The)1 232 2 3442 1958 t
  1386. (able, the definition of a function, a call to)8 1709 1 970 2078 t
  1387. 10 CW f
  1388. (builtin)2711 2078 w
  1389. 10 R f
  1390. ( the path name of a)5 792(for a built-in command, or)4 1085 2 3163 2078 t
  1391. ( example,)1 388( For)1 189(binary program.)1 643 3 970 2198 t
  1392. 9 CW f
  1393. (whatis path g cd who)4 1080 1 1258 2368 t
  1394. 10 R f
  1395. (might print)1 448 1 970 2548 t
  1396. 9 CW f
  1397. (path=\(. /bin /usr/bin\))2 1188 1 1258 2718 t
  1398. (fn g {gre -e $1 *.[hycl]})5 1350 1 1258 2828 t
  1399. (builtin cd)1 540 1 1258 2938 t
  1400. (/bin/who)1258 3048 w
  1401. 10 CW f
  1402. (\304)720 3264 w
  1403. 10 I f
  1404. (subject pattern ...)2 697 1 840 3264 t
  1405. 10 R f
  1406. (The)970 3384 w
  1407. 10 I f
  1408. (subject)1150 3384 w
  1409. 10 R f
  1410. (is matched against each)3 945 1 1458 3384 t
  1411. 10 I f
  1412. (pattern)2428 3384 w
  1413. 10 R f
  1414. ( a match,)2 365( On)1 172(in turn.)1 289 3 2742 3384 t
  1415. 10 CW f
  1416. ($status)3594 3384 w
  1417. 10 R f
  1418. ( Otherwise,)1 486(is set to true.)3 514 2 4040 3384 t
  1419. (it is set to)3 396 1 970 3504 t
  1420. 10 CW f
  1421. ('no match')1 602 1 1393 3504 t
  1422. 10 R f
  1423. ( The)1 207( are the same as for filename matching.)7 1582(. Patterns)1 399 3 1995 3504 t
  1424. 10 I f
  1425. (patterns)4210 3504 w
  1426. 10 R f
  1427. (are not sub-)2 475 1 4565 3504 t
  1428. (jected to filename replacement before the)5 1698 1 970 3624 t
  1429. 10 CW f
  1430. (\304)2702 3624 w
  1431. 10 R f
  1432. (command is executed, so they need not be enclosed in)9 2244 1 2796 3624 t
  1433. (quotation marks, unless of course, a literal match for)8 2102 1 970 3744 t
  1434. 10 CW f
  1435. (* [)1 145 1 3097 3744 t
  1436. 10 R f
  1437. (or)3267 3744 w
  1438. 10 CW f
  1439. (?)3375 3744 w
  1440. 10 R f
  1441. ( example)1 363( For)1 189(is required.)1 449 3 3485 3744 t
  1442. 9 CW f
  1443. (\304 $1 ?)2 324 1 1258 3914 t
  1444. 10 R f
  1445. (matches any single character, whereas)4 1525 1 970 4094 t
  1446. 9 CW f
  1447. (\304 $1 '?')2 432 1 1258 4264 t
  1448. 10 R f
  1449. (only matches a literal question mark.)5 1476 1 970 4444 t
  1450. 10 B f
  1451. ( I/O Redirection)2 694(19. Advanced)1 603 2 720 4684 t
  1452. 10 I f
  1453. (Rc)720 4840 w
  1454. 10 R f
  1455. ( of file descriptors other than 0 and 1 \(standard input and output\) by specifying the file)16 3472(allows redirection)1 718 2 850 4840 t
  1456. (descriptor in square brackets)3 1144 1 720 4960 t
  1457. 10 CW f
  1458. ([ ])1 180 1 1889 4960 t
  1459. 10 R f
  1460. (after the)1 329 1 2094 4960 t
  1461. 10 CW f
  1462. (<)2448 4960 w
  1463. 10 R f
  1464. (or)2533 4960 w
  1465. 10 CW f
  1466. (>)2641 4960 w
  1467. 10 R f
  1468. ( example,)1 388(. For)1 214 2 2701 4960 t
  1469. 9 CW f
  1470. (cc junk.c >[2]junk.diag)2 1242 1 1008 5130 t
  1471. 10 R f
  1472. (saves the compiler's diagnostics in)4 1393 1 720 5310 t
  1473. 10 CW f
  1474. (junk.diag)2138 5310 w
  1475. 10 R f
  1476. (.)2678 5310 w
  1477. ( replaced by a copy, in the sense of)8 1471(File descriptors may be)3 959 2 720 5466 t
  1478. 10 I f
  1479. (dup)3184 5466 w
  1480. 10 R f
  1481. (\(2\), of an already-open file by typing, for)7 1706 1 3334 5466 t
  1482. (example)720 5586 w
  1483. 9 CW f
  1484. (cc junk.c >[2=1])2 864 1 1008 5756 t
  1485. 10 R f
  1486. ( in conjunction with other)4 1061( is more useful)3 609( It)1 117(This replaces file descriptor 2 with a copy of file descriptor 1.)11 2533 4 720 5936 t
  1487. (redirections, like this)2 841 1 720 6056 t
  1488. 9 CW f
  1489. (cc junk.c >junk.out >[2=1])3 1404 1 1008 6226 t
  1490. 10 R f
  1491. ( descriptor 1 to)3 629(Redirections are evaluated from left to right, so this redirects file)10 2667 2 720 6406 t
  1492. 10 CW f
  1493. (junk.out)4050 6406 w
  1494. 10 R f
  1495. (, then points)2 510 1 4530 6406 t
  1496. ( contrast,)1 366( By)1 167(file descriptor 2 at the same file.)6 1289 3 720 6526 t
  1497. 9 CW f
  1498. (cc junk.c >[2=1] >junk.out)3 1404 1 1008 6696 t
  1499. 10 R f
  1500. ( \(presumably the terminal\), and then directs file)7 2000(Redirects file descriptor 2 to a copy of file descriptor 1)10 2320 2 720 6876 t
  1501. ( the first case, standard and diagnostic output will be intermixed in)11 2686( In)1 135( at a file.)3 355(descriptor 1)1 477 4 720 6996 t
  1502. 10 CW f
  1503. (junk.out)4400 6996 w
  1504. 10 R f
  1505. (. In)1 160 1 4880 6996 t
  1506. (the second, diagnostic output will appear on the terminal, and standard output will be sent to the file.)17 4024 1 720 7116 t
  1507. ( For)1 211( using the duplication notation with an empty right-hand side.)9 2664(File descriptors may be closed by)5 1445 3 720 7272 t
  1508. cleartomark
  1509. showpage
  1510. saveobj restore
  1511. %%EndPage: 7 7
  1512. %%Page: 8 8
  1513. /saveobj save def
  1514. mark
  1515. 8 pagesetup
  1516. 10 R f
  1517. (- 8 -)2 166 1 2797 480 t
  1518. (example,)720 840 w
  1519. 9 CW f
  1520. (cc junk.c >[2=])2 810 1 1008 1010 t
  1521. 10 R f
  1522. (will discard diagnostics from the compilation.)5 1838 1 720 1190 t
  1523. (Arbitrary file descriptors may be sent through a pipe by typing, for example)12 3031 1 720 1346 t
  1524. 9 CW f
  1525. (cc junk.c |[2] grep -v '\303$')5 1458 1 1008 1516 t
  1526. 10 R f
  1527. ( that the output of)4 779( Note)1 261( the C compiler's output.)4 1065(This deletes those ever-so-annoying blank lines from)6 2215 4 720 1696 t
  1528. 10 CW f
  1529. (grep)720 1816 w
  1530. 10 R f
  1531. (still appears on file descriptor 1.)5 1287 1 985 1816 t
  1532. ( a pipe to some file descriptor other than zero.)9 1871(Very occasionally you may wish to connect the input side of)10 2449 2 720 1972 t
  1533. (The notation)1 508 1 720 2092 t
  1534. 9 CW f
  1535. (cmd1 |[5=19] cmd2)2 918 1 1008 2262 t
  1536. 10 R f
  1537. (creates a pipeline with)3 895 1 720 2442 t
  1538. 10 CW f
  1539. (cmd1)1640 2442 w
  1540. 10 R f
  1541. ('s file descriptor 5 connected through a pipe to)8 1863 1 1880 2442 t
  1542. 10 CW f
  1543. (cmd2)3768 2442 w
  1544. 10 R f
  1545. ('s file descriptor 19.)3 804 1 4008 2442 t
  1546. 10 B f
  1547. ( documents)1 486(20. Here)1 385 2 720 2682 t
  1548. 10 I f
  1549. (Rc)720 2838 w
  1550. 10 R f
  1551. ( to commands, as in this)5 982(procedures may include data, called ``here documents'', to be provided as input)11 3206 2 852 2838 t
  1552. (version of the)2 549 1 720 2958 t
  1553. 10 I f
  1554. (tel)1294 2958 w
  1555. 10 R f
  1556. (command)1419 2958 w
  1557. 9 CW f
  1558. (for\(i\) grep $i <<!)3 972 1 1008 3128 t
  1559. (...)1008 3238 w
  1560. (nls 2T-402 2912)2 810 1 1008 3348 t
  1561. (norman 2C-514 2842)2 972 1 1008 3458 t
  1562. (pjw 2T-502 7214)2 810 1 1008 3568 t
  1563. (...)1008 3678 w
  1564. (!)1008 3788 w
  1565. 10 R f
  1566. (A here document is introduced by the redirection symbol)8 2288 1 720 3968 t
  1567. 10 CW f
  1568. (<<)3034 3968 w
  1569. 10 R f
  1570. ( by an arbitrary eof marker \()6 1141(, followed)1 406 2 3154 3968 t
  1571. 10 CW f
  1572. (!)4701 3968 w
  1573. 10 R f
  1574. (in the)1 227 1 4813 3968 t
  1575. ( to a line containing only the eof marker are saved in a tempo-)13 2507( following the command, up)4 1142(example\). Lines)1 671 3 720 4088 t
  1576. (rary file that it connected to the command's standard input when it is run.)13 2935 1 720 4208 t
  1577. 10 I f
  1578. (Rc)720 4364 w
  1579. 10 R f
  1580. ( following)1 414( The)1 205(does variable substitution in here documents.)5 1804 3 850 4364 t
  1581. 10 I f
  1582. (subst)3298 4364 w
  1583. 10 R f
  1584. (command:)3529 4364 w
  1585. 9 CW f
  1586. (ed $3 <<EOF)2 594 1 1008 4534 t
  1587. (g/$1/s//$2/g)1008 4644 w
  1588. (w)1008 4754 w
  1589. (EOF)1008 4864 w
  1590. 10 R f
  1591. ( of)1 113(changes all occurrences)2 954 2 720 5044 t
  1592. 10 CW f
  1593. ($1)1817 5044 w
  1594. 10 R f
  1595. (to)1967 5044 w
  1596. 10 CW f
  1597. ($2)2075 5044 w
  1598. 10 R f
  1599. (in file)1 241 1 2225 5044 t
  1600. 10 CW f
  1601. ($3)2496 5044 w
  1602. 10 R f
  1603. ( include a literal)3 661(. To)1 191 2 2616 5044 t
  1604. 10 CW f
  1605. ($)3498 5044 w
  1606. 10 R f
  1607. (in a here document, type)4 1004 1 3588 5044 t
  1608. 10 CW f
  1609. ($$)4622 5044 w
  1610. 10 R f
  1611. ( the)1 152(. If)1 146 2 4742 5044 t
  1612. (name of a variable is followed immediately by)7 1861 1 720 5164 t
  1613. 10 CW f
  1614. (\303)2606 5164 w
  1615. 10 R f
  1616. (, the caret is deleted.)4 820 1 2666 5164 t
  1617. ( by enclosing the eof marker following)6 1643(Variable substitution can be entirely suppressed)5 1981 2 720 5320 t
  1618. 10 CW f
  1619. (<<)4384 5320 w
  1620. 10 R f
  1621. (in quotation)1 496 1 4544 5320 t
  1622. (marks.)720 5440 w
  1623. (Here documents may be provided on file descriptors other than 0 by typing, for example)14 3530 1 720 5596 t
  1624. 9 CW f
  1625. (cmd <<[4]End)1 648 1 1008 5766 t
  1626. (...)1008 5876 w
  1627. (End)1008 5986 w
  1628. 10 B f
  1629. (21. Signals)1 482 1 720 6286 t
  1630. 10 I f
  1631. (Rc)720 6442 w
  1632. 10 R f
  1633. ( function with the name of)5 1067( A)1 124( an interrupt is received from the terminal.)7 1705(scripts normally terminate when)3 1293 4 851 6442 t
  1634. ( the usual way, but called when)6 1268(a signal, in lower case, is defined in)7 1449 2 720 6562 t
  1635. 10 I f
  1636. (rc)3464 6562 w
  1637. 10 R f
  1638. ( of inter-)2 353( Signals)1 347(receives the signal.)2 766 3 3574 6562 t
  1639. (est are:)1 285 1 720 6682 t
  1640. 10 CW f
  1641. (sighup)720 6838 w
  1642. 10 R f
  1643. ( controlling teletype has disconnected from)5 1728(Hangup. The)1 546 2 970 6958 t
  1644. 10 I f
  1645. (rc)3269 6958 w
  1646. 10 R f
  1647. (.)3352 6958 w
  1648. 10 CW f
  1649. (sigint)720 7114 w
  1650. 10 R f
  1651. (The interrupt character \(usually ASCII del\) was typed on the controlling terminal.)11 3272 1 970 7234 t
  1652. cleartomark
  1653. showpage
  1654. saveobj restore
  1655. %%EndPage: 8 8
  1656. %%Page: 9 9
  1657. /saveobj save def
  1658. mark
  1659. 9 pagesetup
  1660. 10 R f
  1661. (- 9 -)2 166 1 2797 480 t
  1662. 10 CW f
  1663. (sigquit)720 840 w
  1664. 10 R f
  1665. (The quit character \(usually ASCII fs, ctrl-\\\) was typed on the controlling terminal.)12 3278 1 970 960 t
  1666. 10 CW f
  1667. (sigterm)720 1116 w
  1668. 10 R f
  1669. (This signal is normally sent by)5 1231 1 970 1236 t
  1670. 10 I f
  1671. (kill)2226 1236 w
  1672. 10 R f
  1673. (\(1\).)2354 1236 w
  1674. 10 CW f
  1675. (sigexit)720 1392 w
  1676. 10 R f
  1677. (An artificial signal sent when)4 1176 1 970 1512 t
  1678. 10 I f
  1679. (rc)2171 1512 w
  1680. 10 R f
  1681. (is about to exit.)3 617 1 2279 1512 t
  1682. (As an example,)2 618 1 720 1668 t
  1683. 9 CW f
  1684. (fn sigint{)1 540 1 1008 1838 t
  1685. (rm /tmp/junk)1 648 1 1224 1948 t
  1686. (exit)1224 2058 w
  1687. (})1008 2168 w
  1688. 10 R f
  1689. (sets a trap for the keyboard interrupt that removes a temporary file before exiting.)13 3259 1 720 2348 t
  1690. ( routine is set to)4 651(Signals will be ignored if the signal)6 1434 2 720 2504 t
  1691. 10 CW f
  1692. ({})2833 2504 w
  1693. 10 R f
  1694. ( revert to their default behavior when their)7 1714(. Signals)1 373 2 2953 2504 t
  1695. (handlers' definitions are deleted.)3 1308 1 720 2624 t
  1696. 10 B f
  1697. (22. Environment)1 742 1 720 2864 t
  1698. 10 R f
  1699. ( Plan 9, the environ-)4 817( On)1 173( is a list of name-value pairs made available to executing binaries.)11 2645(The environment)1 685 4 720 3020 t
  1700. ( in a file system named)5 929(ment is stored)2 565 2 720 3140 t
  1701. 10 CW f
  1702. (#e)2240 3140 w
  1703. 10 R f
  1704. (, normally mounted on)3 914 1 2360 3140 t
  1705. 10 CW f
  1706. (/env)3300 3140 w
  1707. 10 R f
  1708. ( value of each variable is stored)6 1269(. The)1 231 2 3540 3140 t
  1709. ( is not quite as horrendous as it sounds,)8 1577( \(This)1 262(in a separate file, with components terminated by ASCII nuls.)9 2481 3 720 3260 t
  1710. ( contents of)2 482( The)1 213( access is involved.\))3 828(the file system is maintained entirely in core, so no disk or network)12 2797 4 720 3380 t
  1711. 10 CW f
  1712. (/env)720 3500 w
  1713. 10 R f
  1714. (are shared on a per-process group basis)6 1579 1 987 3500 t
  1715. 10 S f
  1716. (-)2593 3500 w
  1717. 10 R f
  1718. ( process group is created it effectively attaches)7 1885(when a new)2 480 2 2675 3500 t
  1719. 10 CW f
  1720. (/env)720 3620 w
  1721. 10 R f
  1722. ( consequence of this organization is that)6 1603( A)1 122(to a new file system initialized with a copy of the old one.)12 2329 3 986 3620 t
  1723. (commands can change environment entries and see the changes reflected in)10 3014 1 720 3740 t
  1724. 10 I f
  1725. (rc)3759 3740 w
  1726. 10 R f
  1727. (.)3842 3740 w
  1728. ( in the environment, although this could easily)7 1939(There is not currently a way on Plan 9 to place functions)11 2381 2 720 3896 t
  1729. (done by mounting another instance of)5 1537 1 720 4016 t
  1730. 10 CW f
  1731. (#e)2287 4016 w
  1732. 10 R f
  1733. ( can be)2 290( problem is that currently there)5 1259( The)1 210(on another directory.)2 844 4 2437 4016 t
  1734. (only one instance of)3 807 1 720 4136 t
  1735. 10 CW f
  1736. (#e)1552 4136 w
  1737. 10 R f
  1738. (per process group.)2 734 1 1697 4136 t
  1739. 10 B f
  1740. ( Variables)1 436(23. Local)1 414 2 720 4376 t
  1741. 10 R f
  1742. ( assignment followed by a com-)5 1289( An)1 174( the duration of a single command.)6 1402(It is often useful to set a variable for)8 1455 4 720 4532 t
  1743. ( example)1 363( For)1 189(mand has this effect.)3 826 3 720 4652 t
  1744. 9 CW f
  1745. (a=global)1008 4822 w
  1746. (a=local echo $a)2 810 1 1008 4932 t
  1747. (echo $a)1 378 1 1008 5042 t
  1748. 10 R f
  1749. (will print)1 370 1 720 5222 t
  1750. 9 CW f
  1751. (local)1008 5392 w
  1752. (global)1008 5502 w
  1753. 10 R f
  1754. (This works even for compound commands, like)6 1906 1 720 5682 t
  1755. 9 CW f
  1756. (f=/fairly/long/file/name {)1 1404 1 1008 5852 t
  1757. ({ wc $f; spell $f; diff $f.old $f } |)9 1998 1 1224 5962 t
  1758. (pr -h 'Facts about '$f | lp -ddp)7 1728 1 1332 6072 t
  1759. (})1008 6182 w
  1760. 10 B f
  1761. ( \320)1 125(24. Examples)1 592 2 720 6482 t
  1762. 10 I f
  1763. (cd, pwd)1 311 1 1462 6482 t
  1764. 10 R f
  1765. (Here is a pair of functions that provide enhanced versions of the standard)12 2933 1 720 6638 t
  1766. 10 CW f
  1767. (cd)3679 6638 w
  1768. 10 R f
  1769. (and)3825 6638 w
  1770. 10 CW f
  1771. (pwd)3996 6638 w
  1772. 10 R f
  1773. (commands. \(Thanks)1 837 1 4203 6638 t
  1774. (to Rob Pike for these.\))4 902 1 720 6758 t
  1775. cleartomark
  1776. showpage
  1777. saveobj restore
  1778. %%EndPage: 9 9
  1779. %%Page: 10 10
  1780. /saveobj save def
  1781. mark
  1782. 10 pagesetup
  1783. 10 R f
  1784. (- 10 -)2 216 1 2772 480 t
  1785. 9 CW f
  1786. ( default prompt)2 810( #)1 486(ps1='% ')1 432 3 1008 830 t
  1787. ( a tab character)3 864( #)1 432(tab=' ')1 486 3 1008 940 t
  1788. (fn pbd{)1 378 1 1008 1050 t
  1789. (/bin/pwd|sed 's;.*/;;')1 1188 1 1116 1160 t
  1790. (})1008 1270 w
  1791. (fn cd{)1 324 1 1008 1380 t
  1792. (builtin cd $1 &&)3 864 1 1116 1490 t
  1793. (switch\($#*\){)1116 1600 w
  1794. (case 0)1 324 1 1116 1710 t
  1795. (dir=$home)1224 1820 w
  1796. (prompt=\($ps1 $tab\))1 972 1 1224 1930 t
  1797. (case *)1 324 1 1116 2040 t
  1798. (switch\($1\))1224 2150 w
  1799. (case /*)1 378 1 1224 2260 t
  1800. (dir=$1)1332 2370 w
  1801. (prompt=\(`{pbd}\303$ps1 $tab\))1 1350 1 1332 2480 t
  1802. (case */* ..*)2 648 1 1224 2590 t
  1803. (dir=\(\))1332 2700 w
  1804. (prompt=\(`{pbd}\303$ps1 $tab\))1 1350 1 1332 2810 t
  1805. (case *)1 324 1 1224 2920 t
  1806. (dir=\(\))1332 3030 w
  1807. (prompt=\($1\303$ps1 $tab\))1 1134 1 1332 3140 t
  1808. (})1224 3250 w
  1809. (})1116 3360 w
  1810. (})1008 3470 w
  1811. (fn pwd{)1 378 1 1008 3580 t
  1812. (if\(\304 $#dir 0\))2 702 1 1116 3690 t
  1813. (dir=`{/bin/pwd})1224 3800 w
  1814. (echo $dir)1 486 1 1116 3910 t
  1815. (})1008 4020 w
  1816. 10 R f
  1817. (Function)720 4200 w
  1818. 10 CW f
  1819. (pwd)1104 4200 w
  1820. 10 R f
  1821. (is a version of the standard)5 1088 1 1312 4200 t
  1822. 10 CW f
  1823. (pwd)2428 4200 w
  1824. 10 R f
  1825. (that caches its value in variable)5 1270 1 2636 4200 t
  1826. 10 CW f
  1827. ($dir)3935 4200 w
  1828. 10 R f
  1829. (, because the genuine)3 865 1 4175 4200 t
  1830. 10 CW f
  1831. (pwd)720 4320 w
  1832. 10 R f
  1833. (can be quite slow to execute.)5 1153 1 925 4320 t
  1834. (Function)720 4476 w
  1835. 10 CW f
  1836. (pbd)1114 4476 w
  1837. 10 R f
  1838. ( Function)1 419(is a helper that prints the last component of a directory name.)11 2589 2 1332 4476 t
  1839. 10 CW f
  1840. (cd)4378 4476 w
  1841. 10 R f
  1842. (calls the)1 344 1 4537 4476 t
  1843. 10 CW f
  1844. (cd)4920 4476 w
  1845. 10 R f
  1846. ( so, it sets)3 404( If)1 119( was successful.)2 646(built-in, and checks that it)4 1057 4 720 4596 t
  1847. 10 CW f
  1848. ($dir)2974 4596 w
  1849. 10 R f
  1850. (and)3242 4596 w
  1851. 10 CW f
  1852. ($prompt)3414 4596 w
  1853. 10 R f
  1854. ( prompt will include the)4 973(. The)1 233 2 3834 4596 t
  1855. (last component of the current directory \(except in the home directory, where it will be null\), and)16 3869 1 720 4716 t
  1856. 10 CW f
  1857. ($dir)4616 4716 w
  1858. 10 R f
  1859. (will)4884 4716 w
  1860. (be reset either to the correct value or to)8 1562 1 720 4836 t
  1861. 10 CW f
  1862. (\(\))2307 4836 w
  1863. 10 R f
  1864. (, so that the)3 461 1 2427 4836 t
  1865. 10 CW f
  1866. (pwd)2913 4836 w
  1867. 10 R f
  1868. (function will work correctly.)3 1148 1 3118 4836 t
  1869. 10 B f
  1870. ( \320)1 125(25. Examples)1 592 2 720 5076 t
  1871. 10 I f
  1872. (man)1462 5076 w
  1873. 10 R f
  1874. (The)720 5232 w
  1875. 10 I f
  1876. (man)900 5232 w
  1877. 10 R f
  1878. ( is called, for example, as)5 1017( It)1 111(command prints pages from of the Programmer's Manual.)7 2324 3 1097 5232 t
  1879. 9 CW f
  1880. (man 3 isatty)2 648 1 1008 5402 t
  1881. (man rc)1 324 1 1008 5512 t
  1882. (man -t cat)2 540 1 1008 5622 t
  1883. 10 R f
  1884. (In the first case, the page for)6 1192 1 720 5802 t
  1885. 10 I f
  1886. (isatty)1946 5802 w
  1887. 10 R f
  1888. ( second case, the manual page for)6 1403( the)1 156( In)1 142(in section 3 is printed.)4 922 4 2197 5802 t
  1889. 10 I f
  1890. (rc)4855 5802 w
  1891. 10 R f
  1892. (is)4973 5802 w
  1893. ( specified, all sections are searched for the page, and it is found in sec-)14 2871( no manual section is)4 864(printed. Since)1 585 3 720 5922 t
  1894. ( the third case, the page for)6 1083( In)1 133(tion 1.)1 256 3 720 6042 t
  1895. 10 I f
  1896. (cat)2217 6042 w
  1897. 10 R f
  1898. (is typeset \(the)2 555 1 2364 6042 t
  1899. 10 CW f
  1900. (-t)2944 6042 w
  1901. 10 R f
  1902. (option\).)3089 6042 w
  1903. cleartomark
  1904. showpage
  1905. saveobj restore
  1906. %%EndPage: 10 10
  1907. %%Page: 11 11
  1908. /saveobj save def
  1909. mark
  1910. 11 pagesetup
  1911. 10 R f
  1912. (- 11 -)2 216 1 2772 480 t
  1913. 9 CW f
  1914. (cd /n/bowell/usr/man || {)3 1350 1 1008 830 t
  1915. (echo $0: Manual not on line! >[1=2])6 1890 1 1116 940 t
  1916. (exit 1)1 324 1 1116 1050 t
  1917. (})1008 1160 w
  1918. ( default nroff)2 756(NT=n #)1 378 2 1008 1270 t
  1919. (s='*' # section, default try all)5 1728 1 1008 1380 t
  1920. (for\(i\) switch\($i\){)1 972 1 1008 1490 t
  1921. (case -t)1 378 1 1008 1600 t
  1922. (NT=t)1116 1710 w
  1923. (case -n)1 378 1 1008 1820 t
  1924. (NT=n)1116 1930 w
  1925. (case -*)1 378 1 1008 2040 t
  1926. (echo Usage: $0 '[-nt] [section] page ...' >[1=2])7 2592 1 1116 2150 t
  1927. (exit 1)1 324 1 1116 2260 t
  1928. (case [1-9] 10)2 702 1 1008 2370 t
  1929. (s=$i)1116 2480 w
  1930. (case *)1 324 1 1008 2590 t
  1931. (eval 'pages=man'$s/$i'.*')1 1350 1 1116 2700 t
  1932. (for\(page in $pages\){)2 1080 1 1116 2810 t
  1933. (if\(test -f $page\))2 918 1 1224 2920 t
  1934. ($NT\303roff -man $page)2 1026 1 1332 3030 t
  1935. (if not)1 324 1 1224 3140 t
  1936. (echo $0: $i not found >[1=2])5 1512 1 1332 3250 t
  1937. (})1116 3360 w
  1938. (})1008 3470 w
  1939. 10 R f
  1940. (Note the use of)3 619 1 720 3650 t
  1941. 10 CW f
  1942. (eval)1368 3650 w
  1943. 10 R f
  1944. ( Without)1 382(to make a list of candidate manual pages.)7 1675 2 1637 3650 t
  1945. 10 CW f
  1946. (eval)3723 3650 w
  1947. 10 R f
  1948. (, the)1 176 1 3963 3650 t
  1949. 10 CW f
  1950. (*)4168 3650 w
  1951. 10 R f
  1952. (stored in)1 352 1 4258 3650 t
  1953. 10 CW f
  1954. ($s)4640 3650 w
  1955. 10 R f
  1956. (would)4790 3650 w
  1957. ( if it weren't, it would be)6 1098(not trigger filename matching \320 it's enclosed in quotation marks, and even)11 3222 2 720 3770 t
  1958. (expanded when assigned to)3 1098 1 720 3890 t
  1959. 10 CW f
  1960. ($s)1844 3890 w
  1961. 10 R f
  1962. ( causes its arguments to be re-processed by)7 1728(. Eval)1 259 2 1964 3890 t
  1963. 10 I f
  1964. (rc)3977 3890 w
  1965. 10 R f
  1966. ('s parser and interpreter,)3 980 1 4060 3890 t
  1967. (effectively delaying evaluation of the)4 1491 1 720 4010 t
  1968. 10 CW f
  1969. (*)2236 4010 w
  1970. 10 R f
  1971. (until the assignment to)3 909 1 2321 4010 t
  1972. 10 CW f
  1973. ($pages)3255 4010 w
  1974. 10 R f
  1975. (.)3615 4010 w
  1976. 10 B f
  1977. ( \320)1 125(26. Examples)1 592 2 720 4250 t
  1978. 10 I f
  1979. (holmdel)1462 4250 w
  1980. 10 R f
  1981. (The following)1 575 1 720 4406 t
  1982. 10 I f
  1983. (rc)1327 4406 w
  1984. 10 R f
  1985. (script plays the deceptively simple game)5 1658 1 1442 4406 t
  1986. 10 I f
  1987. (holmdel)3132 4406 w
  1988. 10 R f
  1989. (, in which the players alternately name)6 1586 1 3454 4406 t
  1990. (Bell Labs locations, the winner being the first to mention Holmdel.)10 2682 1 720 4526 t
  1991. (This script is worth describing in detail \(rather, it would be if it weren't so silly.\))15 3222 1 720 4682 t
  1992. (Variable)720 4838 w
  1993. 10 CW f
  1994. ($t)1097 4838 w
  1995. 10 R f
  1996. ( Including)1 443(is an abbreviation for the name of a temporary file.)9 2115 2 1251 4838 t
  1997. 10 CW f
  1998. ($pid)3844 4838 w
  1999. 10 R f
  2000. (, initialized by)2 595 1 4084 4838 t
  2001. 10 I f
  2002. (rc)4714 4838 w
  2003. 10 R f
  2004. (to its)1 208 1 4832 4838 t
  2005. ( one)1 178(process-id, in the names of temporary files insures that their names won't collide, in case more than)16 4142 2 720 4958 t
  2006. (instance of the script is running at a time.)8 1651 1 720 5078 t
  2007. (Function)720 5234 w
  2008. 10 CW f
  2009. (read)1102 5234 w
  2010. 10 R f
  2011. ( is the name of a variable into which a line gathered from standard input is read.)16 3223('s argument)1 475 2 1342 5234 t
  2012. 10 CW f
  2013. ($ifs)720 5354 w
  2014. 10 R f
  2015. ( Thus)1 252(is set to just a newline.)5 921 2 987 5354 t
  2016. 10 CW f
  2017. (read)2187 5354 w
  2018. 10 R f
  2019. ( at spaces, but the terminating newline is)7 1633('s input is not split apart)5 980 2 2427 5354 t
  2020. (deleted.)720 5474 w
  2021. (A handler is set to catch)5 1012 1 720 5630 t
  2022. 10 CW f
  2023. (sigint)1767 5630 w
  2024. 10 R f
  2025. (,)2127 5630 w
  2026. 10 CW f
  2027. (sigquit)2188 5630 w
  2028. 10 R f
  2029. (, and)1 205 1 2608 5630 t
  2030. 10 CW f
  2031. (sighup,)2849 5630 w
  2032. 10 R f
  2033. (and the artificial)2 676 1 3305 5630 t
  2034. 10 CW f
  2035. (sigexit)4017 5630 w
  2036. 10 R f
  2037. ( just)1 181(signal. It)1 386 2 4473 5630 t
  2038. (removes the temporary file and exits.)5 1486 1 720 5750 t
  2039. ( file is initialized from a here document containing a list of Bell Labs locations, and the main)17 3730(The temporary)1 590 2 720 5906 t
  2040. (loop starts.)1 439 1 720 6026 t
  2041. ( \(in)1 144(First, the program guesses a location)5 1500 2 720 6182 t
  2042. 10 CW f
  2043. ($lab)2397 6182 w
  2044. 10 R f
  2045. (\) using the)2 438 1 2637 6182 t
  2046. 10 CW f
  2047. (fortune)3108 6182 w
  2048. 10 R f
  2049. SHAR_EOF
  2050. true || echo 'restore of plan9.ps failed'
  2051. fi
  2052. echo 'End of  part 4'
  2053. echo 'File plan9.ps is continued in part 5'
  2054. echo 5 > _shar_seq_.tmp
  2055. exit 0
  2056. exit 0 # Just in case...
  2057. -- 
  2058. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2059. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2060. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2061. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2062.