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

  1. Newsgroups: comp.sources.misc
  2. From: byron@archone.tamu.edu (Byron Rakitzis)
  3. Subject:  v23i065:  rc - A Plan 9 shell reimplementation, v1.2, Part05/06
  4. Message-ID: <1991Oct18.034451.2490@sparky.imd.sterling.com>
  5. X-Md4-Signature: 52bd4c6ef9a95805c71f329459ca9c28
  6. Date: Fri, 18 Oct 1991 03:44:51 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: byron@archone.tamu.edu (Byron Rakitzis)
  10. Posting-number: Volume 23, Issue 65
  11. Archive-name: rc/part05
  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 plan9.ps 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" != 5; 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 plan9.ps'
  33. else
  34. echo 'x - continuing file plan9.ps'
  35. sed 's/^X//' << 'SHAR_EOF' >> 'plan9.ps' &&
  36. (program to pick a random line from)6 1479 1 3561 6182 t
  37. ( prints the location, and if it guessed Holmdel, prints a message and exits.)13 2942( It)1 111(the location list.)2 642 3 720 6302 t
  38. ( the)1 149(Then it uses)2 485 2 720 6458 t
  39. 10 CW f
  40. (read)1381 6458 w
  41. 10 R f
  42. (function to get lines from standard input and validity-check them until it gets a legal)14 3392 1 1648 6458 t
  43. ( that the condition part of a)6 1118(name. Note)1 491 2 720 6578 t
  44. 10 CW f
  45. (while)2360 6578 w
  46. 10 R f
  47. ( the exit status of the)5 855( Only)1 255( compound command.)2 901(can be a)2 338 4 2691 6578 t
  48. (last command in the sequence is checked.)6 1666 1 720 6698 t
  49. ( it goes back to the top of the loop.)9 1388( Otherwise)1 460(Again, if the result is Holmdel, it prints a message and exits.)11 2415 3 720 6854 t
  50. cleartomark
  51. showpage
  52. saveobj restore
  53. %%EndPage: 11 11
  54. %%Page: 12 12
  55. /saveobj save def
  56. mark
  57. 12 pagesetup
  58. 10 R f
  59. (- 12 -)2 216 1 2772 480 t
  60. 9 CW f
  61. (t=/tmp/holmdel$pid)1008 890 w
  62. (fn read{)1 432 1 1008 1000 t
  63. ($1=`{awk '{print;exit}'})1 1296 1 1440 1110 t
  64. (})1008 1220 w
  65. (ifs=')1008 1330 w
  66. ( just a newline)3 810(' #)1 486 2 1008 1440 t
  67. (fn sigexit sigint sigquit sighup{)4 1782 1 1008 1550 t
  68. (rm -f $t)2 432 1 1440 1660 t
  69. (exit)1440 1770 w
  70. (})1008 1880 w
  71. (cat <<'!' >$t)2 702 1 1008 1990 t
  72. (Allentown)1008 2100 w
  73. (Atlanta)1008 2210 w
  74. (Cedar Crest)1 594 1 1008 2320 t
  75. (Chester)1008 2430 w
  76. (Columbus)1008 2540 w
  77. (Elmhurst)1008 2650 w
  78. (Fullerton)1008 2760 w
  79. (Holmdel)1008 2870 w
  80. (Indian Hill)1 594 1 1008 2980 t
  81. (Merrimack Valley)1 864 1 1008 3090 t
  82. (Morristown)1008 3200 w
  83. (Piscataway)1008 3310 w
  84. (Reading)1008 3420 w
  85. (Short Hills)1 594 1 1008 3530 t
  86. (South Plainfield)1 864 1 1008 3640 t
  87. (Summit)1008 3750 w
  88. (Whippany)1008 3860 w
  89. (West Long Branch)2 864 1 1008 3970 t
  90. (!)1008 4080 w
  91. (while\(true\){)1008 4190 w
  92. (lab=`{/usr/games/fortune $t})1 1512 1 1170 4300 t
  93. (echo $lab)1 486 1 1170 4410 t
  94. (if\(\304 $lab Holmdel\){)2 1026 1 1170 4520 t
  95. (echo You lose.)2 756 1 1332 4630 t
  96. (exit)1332 4740 w
  97. (})1170 4850 w
  98. (while\(read lab; ! grep -i -s $lab $t\) echo No such location.)11 3240 1 1170 4960 t
  99. (if\(\304 $lab [hH]olmdel\){)2 1188 1 1170 5070 t
  100. (echo You win.)2 702 1 1332 5180 t
  101. (exit)1332 5290 w
  102. (})1170 5400 w
  103. (})1008 5510 w
  104. 10 B f
  105. (27. Discussion)1 626 1 720 5690 t
  106. 10 R f
  107. (Steve Bourne's)1 622 1 720 5846 t
  108. 10 CW f
  109. (/bin/sh)1376 5846 w
  110. 10 R f
  111. ( I)1 93( comparison.)1 526(is extremely well-designed; any successor is bound to suffer in)9 2591 3 1830 5846 t
  112. ( things wherever possible, usually by)5 1512(have tried to fix its best-acknowledged shortcomings and to simplify)9 2808 2 720 5966 t
  113. ( I)1 67( Obviously)1 475( when irresistibly tempted have I introduced novel ideas.)8 2330( Only)1 258(omitting unessential features.)2 1190 5 720 6086 t
  114. (have tinkered extensively with Bourne's syntax, that being where his work was most open to criticism.)15 4109 1 720 6206 t
  115. (The most important principle in)4 1284 1 720 6362 t
  116. 10 I f
  117. (rc)2032 6362 w
  118. 10 R f
  119. ( is never scanned more)4 930( Input)1 265('s design is that it's not a macro processor.)8 1730 3 2115 6362 t
  120. ( by the lexical and syntactic analysis code \(except, of course, by the)12 2885(than once)1 401 2 720 6482 t
  121. 10 CW f
  122. (eval)4046 6482 w
  123. 10 R f
  124. (command, whose)1 714 1 4326 6482 t
  125. 10 I f
  126. (raison d'etre)1 519 1 720 6602 t
  127. 10 R f
  128. (is to break the rule\).)4 801 1 1264 6602 t
  129. ( These)1 298( arguments containing spaces.)3 1228(Bourne shell scripts can often be made to run wild by passing them)12 2794 3 720 6758 t
  130. (will be split into multiple arguments using)6 1780 1 720 6878 t
  131. 10 CW f
  132. (IFS)2539 6878 w
  133. 10 R f
  134. ( In)1 146( inopportune times.)2 801(, often as)2 391 3 2719 6878 t
  135. 10 I f
  136. (rc)4095 6878 w
  137. 10 R f
  138. (, values of variables,)3 862 1 4178 6878 t
  139. ( have)1 227( Arguments)1 508( when substituted into a command.)5 1464(including command line arguments, are not re-read)6 2121 4 720 6998 t
  140. (presumably been scanned in the parent process, and ought not to be re-read.)12 3026 1 720 7118 t
  141. ( store lists of)3 571( needs to be able to)5 858( He)1 184(Why does Bourne re-scan commands after variable substitution?)7 2707 4 720 7274 t
  142. cleartomark
  143. showpage
  144. saveobj restore
  145. %%EndPage: 12 12
  146. %%Page: 13 13
  147. /saveobj save def
  148. mark
  149. 13 pagesetup
  150. 10 R f
  151. (- 13 -)2 216 1 2772 480 t
  152. ( we eliminate re-scanning, we must change the)7 1875( If)1 117( character strings.)2 708(arguments in variables whose values are)5 1620 4 720 840 t
  153. (type of variables, so that they can explicitly carry lists of strings.)11 2583 1 720 960 t
  154. ( are two dif-)3 505( There)1 287( for lists of words.)4 750( need a notation)3 647( We)1 192(This introduces some conceptual complications.)4 1939 6 720 1116 t
  155. (ferent kinds of concatenation, for strings \320)6 1798 1 720 1236 t
  156. 10 CW f
  157. ($a\303$b)2552 1236 w
  158. 10 R f
  159. (, and lists \320)3 533 1 2852 1236 t
  160. 10 CW f
  161. (\($a $b\))1 429 1 3419 1236 t
  162. 10 R f
  163. ( difference between)2 801(. The)1 238 2 3848 1236 t
  164. 10 CW f
  165. (\(\))4920 1236 w
  166. 10 R f
  167. (and)720 1356 w
  168. 10 CW f
  169. ('')895 1356 w
  170. 10 R f
  171. ( not the)2 314(is confusing to novices, although the distinction is arguably sensible \320 a null argument is)14 3680 2 1046 1356 t
  172. (same as no argument.)3 865 1 720 1476 t
  173. ( the text enclosed in back-)5 1100( is because)2 452( This)1 238(Bourne also rescans input when doing command substitution.)7 2530 4 720 1632 t
  174. ( it ought to be parsed when the enclosing com-)9 1939( Properly,)1 427(quotes is not properly a string, but a command.)8 1954 3 720 1752 t
  175. (mand is, but this makes it difficult to handle nested command substitutions, like this:)13 3393 1 720 1872 t
  176. 9 CW f
  177. (size=`wc -l \\`ls -t|sed 1q\\``)4 1566 1 1008 2042 t
  178. 10 R f
  179. ( can get much worse)4 832( This)1 231( escaped to avoid terminating the outer command.)7 2018(The inner back-quotes must be)4 1239 4 720 2222 t
  180. (than the above example; the number of)6 1612 1 720 2342 t
  181. 10 CW f
  182. (\\)2366 2342 w
  183. 10 R f
  184. ('s required is exponential in the nesting depth.)7 1911 1 2426 2342 t
  185. 10 I f
  186. (Rc)4396 2342 w
  187. 10 R f
  188. (fixes this by)2 505 1 4535 2342 t
  189. (making the backquote a unary operator whose argument is a command, like this:)12 3220 1 720 2462 t
  190. 9 CW f
  191. (size=`{wc -l `{ls -t|sed 1q}})4 1566 1 1008 2632 t
  192. 10 R f
  193. (No escapes are ever required, and the whole thing is parsed in one pass.)13 2862 1 720 2812 t
  194. (For similar reasons)2 772 1 720 2968 t
  195. 10 I f
  196. (rc)1520 2968 w
  197. 10 R f
  198. ( associating a string)3 803(defines signal handlers as though they were functions, instead of)9 2606 2 1631 2968 t
  199. (with each signal, as Bourne does, with the attendant possibility of getting a syntax error message in)16 4320 1 720 3088 t
  200. ( Since)1 285(response to typing the interrupt character.)5 1723 2 720 3208 t
  201. 10 I f
  202. (rc)2766 3208 w
  203. 10 R f
  204. (parses input when typed, it reports errors when you)8 2153 1 2887 3208 t
  205. (make them.)1 466 1 720 3328 t
  206. ( need for the distinction)4 1029( is no)2 255( There)1 301(For all this trouble, we gain substantial semantic simplifications.)8 2735 4 720 3484 t
  207. (between)720 3604 w
  208. 10 CW f
  209. ($*)1080 3604 w
  210. 10 R f
  211. (and)1228 3604 w
  212. 10 CW f
  213. ($@)1400 3604 w
  214. 10 R f
  215. ( rules that)2 398( is no need for four types of quotation, nor the extremely complicated)12 2812(. There)1 310 3 1520 3604 t
  216. ( In)1 133(govern them.)1 527 2 720 3724 t
  217. 10 I f
  218. (rc)1405 3724 w
  219. 10 R f
  220. ( to appear in an argu-)5 855(you use quotation marks exactly when you want a syntax character)10 2672 2 1513 3724 t
  221. (ment.)720 3844 w
  222. 10 CW f
  223. (IFS)999 3844 w
  224. 10 R f
  225. (is no longer used, except in the one case where it was indispensable: converting command out-)15 3833 1 1207 3844 t
  226. (put into argument lists during command substitution.)6 2121 1 720 3964 t
  227. ( security hole [Ree88].)3 933(This also avoids an important)4 1211 2 720 4120 t
  228. 10 I f
  229. (System)2922 4120 w
  230. 10 R f
  231. (\(3\) and)1 293 1 3199 4120 t
  232. 10 I f
  233. (popen)3525 4120 w
  234. 10 R f
  235. (\(3\) call)1 293 1 3769 4120 t
  236. 10 CW f
  237. (/bin/sh)4095 4120 w
  238. 10 R f
  239. (to execute a)2 492 1 4548 4120 t
  240. ( to use either of these routines with any assurance that the specified command)13 3212( is impossible)2 569(command. It)1 539 3 720 4240 t
  241. (will be executed, even if the caller of)7 1479 1 720 4360 t
  242. 10 I f
  243. (system)2224 4360 w
  244. 10 R f
  245. (or)2515 4360 w
  246. 10 I f
  247. (popen)2623 4360 w
  248. 10 R f
  249. ( can)1 164( This)1 229( for the command.)3 735(specifies a full path name)4 1020 4 2892 4360 t
  250. ( problem is that)3 643( The)1 211( a set-userid program.)3 888(be devastating if it occurs in)5 1164 4 720 4480 t
  251. 10 CW f
  252. (IFS)3657 4480 w
  253. 10 R f
  254. (is used to split the command)5 1172 1 3868 4480 t
  255. (into words, so an attacker can just set)7 1534 1 720 4600 t
  256. 10 CW f
  257. (IFS=/)2285 4600 w
  258. 10 R f
  259. ( Trojan horse named)3 844(in his environment and leave a)5 1253 2 2616 4600 t
  260. 10 CW f
  261. (usr)4745 4600 w
  262. 10 R f
  263. (or)4957 4600 w
  264. 10 CW f
  265. (bin)720 4720 w
  266. 10 R f
  267. (in the current working directory before running the privileged program.)9 2891 1 929 4720 t
  268. 10 I f
  269. (Rc)3874 4720 w
  270. 10 R f
  271. (fixes this by not ever res-)5 1032 1 4008 4720 t
  272. (canning input for any reason.)4 1167 1 720 4840 t
  273. (Most of the other differences between)5 1565 1 720 4996 t
  274. 10 I f
  275. (rc)2320 4996 w
  276. 10 R f
  277. ( eliminated Bourne's)2 860( I)1 94(and the Bourne shell are not so serious.)7 1647 3 2439 4996 t
  278. (peculiar forms of variable substitution, like)5 1726 1 720 5116 t
  279. 9 CW f
  280. (echo ${a=b} ${c-d} ${e?error})3 1566 1 1008 5286 t
  281. 10 R f
  282. ( deleted the builtins)3 822( I)1 95(because they are little used, redundant and easily expressed in less abstruse terms.)12 3403 3 720 5466 t
  283. 10 CW f
  284. (export)720 5586 w
  285. 10 R f
  286. (,)1080 5586 w
  287. 10 CW f
  288. (readonly)1131 5586 w
  289. 10 R f
  290. (,)1611 5586 w
  291. 10 CW f
  292. (break)1662 5586 w
  293. 10 R f
  294. (,)1962 5586 w
  295. 10 CW f
  296. (continue)2013 5586 w
  297. 10 R f
  298. (,)2493 5586 w
  299. 10 CW f
  300. (read)2544 5586 w
  301. 10 R f
  302. (,)2784 5586 w
  303. 10 CW f
  304. (return)2835 5586 w
  305. 10 R f
  306. (,)3195 5586 w
  307. 10 CW f
  308. (set)3246 5586 w
  309. 10 R f
  310. (,)3426 5586 w
  311. 10 CW f
  312. (times)3477 5586 w
  313. 10 R f
  314. (and)3803 5586 w
  315. 10 CW f
  316. (unset)3973 5586 w
  317. 10 R f
  318. (because they seem)2 742 1 4298 5586 t
  319. (redundant or only marginally useful.)4 1462 1 720 5706 t
  320. (Where Bourne's syntax draws from Algol 68,)6 1917 1 720 5862 t
  321. 10 I f
  322. (rc)2677 5862 w
  323. 10 R f
  324. ( I)1 99( is harder to defend.)4 859( This)1 244( C or Awk.)3 492('s is based on)3 586 5 2760 5862 t
  325. (believe that, for example)3 992 1 720 5982 t
  326. 9 CW f
  327. (if\(test -f junk\) rm junk)4 1296 1 1008 6152 t
  328. 10 R f
  329. (is better syntax than)3 802 1 720 6332 t
  330. 9 CW f
  331. (if test -f junk; then rm junk; fi)7 1782 1 1008 6502 t
  332. 10 R f
  333. ( is less cluttered with keywords, it avoids the semicolons that Bourne requires in odd places, and)16 3921(because it)1 399 2 720 6682 t
  334. (the syntax characters better set off the active parts of the command.)11 2693 1 720 6802 t
  335. (The one bit of large-scale syntax that Bourne unquestionably does better than)11 3169 1 720 6958 t
  336. 10 I f
  337. (rc)3922 6958 w
  338. 10 R f
  339. (is the)1 222 1 4038 6958 t
  340. 10 CW f
  341. (if)4293 6958 w
  342. 10 R f
  343. (statement with)1 594 1 4446 6958 t
  344. 10 CW f
  345. (else)720 7078 w
  346. 10 R f
  347. (clause.)986 7078 w
  348. 10 I f
  349. (Rc)1310 7078 w
  350. 10 R f
  351. ('s)1415 7078 w
  352. 10 CW f
  353. (if)1512 7078 w
  354. 10 R f
  355. (has no terminating)2 744 1 1657 7078 t
  356. 10 CW f
  357. (fi)2426 7078 w
  358. 10 R f
  359. ( a result, the parser cannot tell whether or not)9 1807( As)1 161(-like bracket.)1 526 3 2546 7078 t
  360. (to expect an)2 482 1 720 7198 t
  361. 10 CW f
  362. (else)1227 7198 w
  363. 10 R f
  364. ( problem is that after reading, for example)7 1685( The)1 205(clause without looking ahead in its input.)6 1647 3 1492 7198 t
  365. cleartomark
  366. showpage
  367. saveobj restore
  368. %%EndPage: 13 13
  369. %%Page: 14 14
  370. /saveobj save def
  371. mark
  372. 14 pagesetup
  373. 10 R f
  374. (- 14 -)2 216 1 2772 480 t
  375. 9 CW f
  376. (if\(test -f junk\) echo junk found)5 1728 1 1008 830 t
  377. 10 R f
  378. (in interactive mode,)2 824 1 720 1010 t
  379. 10 I f
  380. (rc)1583 1010 w
  381. 10 R f
  382. (cannot decide whether to execute it immediately and print)8 2430 1 1705 1010 t
  383. 10 CW f
  384. ($prompt\(1\))4174 1010 w
  385. 10 R f
  386. (, or to)2 266 1 4774 1010 t
  387. (print)720 1130 w
  388. 10 CW f
  389. ($prompt\(2\))937 1130 w
  390. 10 R f
  391. (and wait for the)3 638 1 1565 1130 t
  392. 10 CW f
  393. (else)2231 1130 w
  394. 10 R f
  395. ( the Bourne shell, this is not a problem, because)9 1930( In)1 136(to be typed.)2 475 3 2499 1130 t
  396. (the)720 1250 w
  397. 10 CW f
  398. (if)867 1250 w
  399. 10 R f
  400. (command must end with)3 986 1 1012 1250 t
  401. 10 CW f
  402. (fi)2023 1250 w
  403. 10 R f
  404. (, regardless of whether it contains an)6 1466 1 2143 1250 t
  405. 10 CW f
  406. (else)3634 1250 w
  407. 10 R f
  408. (or not.)1 261 1 3899 1250 t
  409. 10 I f
  410. (Rc)720 1406 w
  411. 10 R f
  412. ( is to declare that the)5 839('s admittedly feeble solution)3 1144 2 825 1406 t
  413. 10 CW f
  414. (else)2835 1406 w
  415. 10 R f
  416. (clause is a separate statement, with the semantic)7 1938 1 3102 1406 t
  417. (proviso that it must immediately follow an)6 1724 1 720 1526 t
  418. 10 CW f
  419. (if)2472 1526 w
  420. 10 R f
  421. (, and to call it)4 559 1 2592 1526 t
  422. 10 CW f
  423. (if not)1 363 1 3179 1526 t
  424. 10 R f
  425. (rather than)1 432 1 3570 1526 t
  426. 10 CW f
  427. (else)4030 1526 w
  428. 10 R f
  429. (, as a reminder that)4 770 1 4270 1526 t
  430. ( the braces are required in the)6 1227( only noticeable consequence of this is that)7 1766( The)1 212(something odd is going on.)4 1115 4 720 1646 t
  431. (construction)720 1766 w
  432. 9 CW f
  433. (for\(i\){)1008 1936 w
  434. (if\(test -f $i\) echo $i found)5 1512 1 1224 2046 t
  435. (if not echo $i not found)5 1296 1 1224 2156 t
  436. (})1008 2266 w
  437. 10 R f
  438. (and that)1 319 1 720 2446 t
  439. 10 I f
  440. (rc)1064 2446 w
  441. 10 R f
  442. (resolves the ``dangling else'' ambiguity in opposition to most people's expectations.)10 3378 1 1172 2446 t
  443. ( the UNIX system programmer's manual the Bourne)7 2120(It is remarkable that in the four most recent editions of)10 2200 2 720 2602 t
  444. ( not admit the command)4 976(shell grammar described in the manual page does)7 1985 2 720 2722 t
  445. 10 CW f
  446. (who|wc)3707 2722 w
  447. 10 R f
  448. ( is surely an over-)4 719(. This)1 254 2 4067 2722 t
  449. ( Even)1 266( something darker: nobody really knows what the Bourne shell's grammar is.)11 3206(sight, but it suggests)3 848 3 720 2842 t
  450. ( the rou-)2 346( parser is implemented by recursive descent, but)7 1959( The)1 210(examination of the source code is little help.)7 1805 4 720 2962 t
  451. ( categories all have a flag argument that subtly changes their operation)11 2885(tines corresponding to the syntactic)4 1435 2 720 3082 t
  452. (depending on the context.)3 1041 1 720 3202 t
  453. 10 I f
  454. (Rc)1814 3202 w
  455. 10 R f
  456. ('s parser is implemented using)4 1233 1 1919 3202 t
  457. 10 I f
  458. (yacc)3180 3202 w
  459. 10 R f
  460. (, so I can say precisely what the grammar)8 1678 1 3362 3202 t
  461. (is.)720 3322 w
  462. ( is a)2 165( There)1 284( it considerably except for two things.)6 1524( would simplify)2 636( I)1 84(Its lexical structure is harder to describe.)6 1627 6 720 3478 t
  463. ( distinguish between parentheses that immediately follow a word with no intervening)11 3614(lexical kludge to)2 706 2 720 3598 t
  464. ( use for)2 319(spaces and those that don't that I would eliminate if there were a reasonable pair of characters to)17 4001 2 720 3718 t
  465. ( could also eliminate the insertion of free carets if users were not adamant about it.)15 3299( I)1 83(subscript brackets.)1 743 3 720 3838 t
  466. 10 B f
  467. (28. Acknowledgements)1 1002 1 720 4078 t
  468. 10 R f
  469. ( Plan 9 users have been insistent, incessant sources of good ideas and)12 2825(Rob Pike, Howard Trickey and other)5 1495 2 720 4234 t
  470. ( examples in this document are plagiarized from [Bou78], as are most of)12 2892(criticism. Some)1 653 2 720 4354 t
  471. 10 I f
  472. (rc)4290 4354 w
  473. 10 R f
  474. ('s good features.)2 662 1 4373 4354 t
  475. 10 B f
  476. (29. References)1 639 1 720 4594 t
  477. 10 R f
  478. ( R. Bourne, ``U)3 678(Bou78. S.)1 423 2 720 4822 t
  479. 8 R f
  480. (NIX)1821 4822 w
  481. 10 R f
  482. (Time-Sharing System: The U)3 1234 1 2006 4822 t
  483. 8 R f
  484. (NIX)3240 4822 w
  485. 10 R f
  486. (Shell,'')3425 4822 w
  487. 10 I f
  488. (Bell System Technical Journal)3 1275 1 3765 4822 t
  489. 10 B f
  490. (57)970 4942 w
  491. 10 R f
  492. (\(6\), pp. 1971-1990 \(July-August 1978\).)4 1579 1 1070 4942 t
  493. ( Reeds, ``)2 409(Ree88. J.)1 394 2 720 5098 t
  494. 10 CW f
  495. (/bin/sh)1523 5098 w
  496. 10 R f
  497. ( Bell)1 205( AT&T)1 334(: the biggest UNIX security loophole,'' 11217-840302-04TM,)6 2558 3 1943 5098 t
  498. (Laboratories \(1988\).)1 820 1 970 5218 t
  499. cleartomark
  500. showpage
  501. saveobj restore
  502. %%EndPage: 14 14
  503. %%Trailer
  504. done
  505. %%Pages: 14
  506. %%DocumentFonts: Courier Times-Bold Times-Italic Times-Roman Symbol
  507. SHAR_EOF
  508. echo 'File plan9.ps is complete' &&
  509. chmod 0644 plan9.ps ||
  510. echo 'restore of plan9.ps failed'
  511. Wc_c="`wc -c < 'plan9.ps'`"
  512. test 67056 -eq "$Wc_c" ||
  513.     echo 'plan9.ps: original size 67056, current size' "$Wc_c"
  514. rm -f _shar_wnt_.tmp
  515. fi
  516. # ============= rc.1 ==============
  517. if test -f 'rc.1' -a X"$1" != X"-c"; then
  518.     echo 'x - skipping rc.1 (File already exists)'
  519.     rm -f _shar_wnt_.tmp
  520. else
  521. > _shar_wnt_.tmp
  522. echo 'x - extracting rc.1 (Text)'
  523. sed 's/^X//' << 'SHAR_EOF' > 'rc.1' &&
  524. .\" rc.1
  525. .\"-------
  526. .\" Dd    distance to space vertically before a "display"
  527. .\" These are what n/troff use for interparagraph distance
  528. .\"-------
  529. .if t .nr Dd .4v
  530. .if n .nr Dd 1v
  531. .\"-------
  532. .\" Ds    begin a display
  533. .\"-------
  534. .de Ds
  535. .RS \\$1
  536. .sp \\n(Ddu
  537. .nf
  538. ..
  539. .\"-------
  540. .\" De    end a display (no trailing vertical spacing)
  541. .\"-------
  542. .de De
  543. .fi
  544. .RE
  545. ..
  546. .\"-------
  547. .\" I stole the Xf macro from the -man macros on my machine (originally
  548. .\" "}S", I renamed it so that it won't conflict).
  549. .\"-------
  550. .\" Set Cf to the name of the constant width font.
  551. .\" It will be "C" or "(CW", typically.
  552. .\" NOTEZ BIEN the lines defining Cf must have no trailing white space:
  553. .\"-------
  554. .if t .ds Cf C
  555. .if n .ds Cf R
  556. .\"-------
  557. .\" Rc - Alternate Roman and Courier
  558. .\"-------
  559. .de Rc
  560. .Xf 1 \\*(Cf \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
  561. ..
  562. .\"-------
  563. .\" Ic - Alternate Italic and Courier
  564. .\"-------
  565. .de Ic
  566. .Xf 2 \\*(Cf \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
  567. ..
  568. .\"-------
  569. .\" Bc - Alternate Bold and Courier
  570. .\"-------
  571. .de Bc
  572. .Xf 3 \\*(Cf \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
  573. ..
  574. .\"-------
  575. .\" Cr - Alternate Courier and Roman
  576. .\"-------
  577. .de Cr
  578. .Xf \\*(Cf 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
  579. ..
  580. .\"-------
  581. .\" Ci - Alternate Courier and Italic
  582. .\"-------
  583. .de Ci
  584. .Xf \\*(Cf 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
  585. ..
  586. .\"-------
  587. .\" Cb - Alternate Courier and Bold
  588. .\"-------
  589. .de Cb
  590. .Xf \\*(Cf 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
  591. ..
  592. .\"-------
  593. .\" Xf - Alternate fonts
  594. .\"
  595. .\" \$1 - first font
  596. .\" \$2 - second font
  597. .\" \$3 - desired word with embedded font changes, built up by recursion
  598. .\" \$4 - text for first font
  599. .\" \$5 - \$9 - remaining args
  600. .\"
  601. .\" Every time we are called:
  602. .\"
  603. .\" If        there is something in \$4
  604. .\" then    Call ourself with the fonts switched,
  605. .\"        with a new word made of the current word (\$3) and \$4
  606. .\"        rendered in the first font,
  607. .\"        and with the remaining args following \$4.
  608. .\" else    We are done recursing.  \$3 holds the desired output
  609. .\"        word.  We emit \$3, change to Roman font, and restore
  610. .\"        the point size to the default.
  611. .\" fi
  612. .\"
  613. .\" Use Xi to add a little bit of space after italic text.
  614. .\"-------
  615. .de Xf
  616. .ds Xi
  617. .if "\\$1"2" .if !"\\$5"" .ds Xi \^
  618. .if "\\$1"I" .if !"\\$5"" .ds Xi \^
  619. .ie !"\\$4"" \{\
  620. .    Xf \\$2 \\$1 "\\$3\\f\\$1\\$4\\*(Xi" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
  621. .\}
  622. .el \{\\$3
  623. .    ft R    \" Restore the default font, since we don't know
  624. .        \" what the last font change was.
  625. .    ps 10    \" Restore the default point size, since it might
  626. .        \" have been changed by an argument to this macro.
  627. .\}
  628. ..
  629. .TH RC 1 "28 April 1991"
  630. .SH NAME
  631. rc \- shell
  632. .SH SYNOPSIS
  633. .B rc
  634. .RB [ \-eixvldn ]
  635. .RB [ \-c
  636. .IR command ]
  637. .RI [ arguments ]
  638. .SH DESCRIPTION
  639. .I rc
  640. is a command interpreter and programming language similar to
  641. .IR sh (1).
  642. It is based on the AT&T Plan 9 shell of the same name.
  643. The shell offers a C-like syntax (much more so than the C shell),
  644. and a powerful mechanism for manipulating variables.
  645. It is reasonably small and reasonably fast,
  646. especially when compared to contemporary shells.
  647. Its use is intended to be interactive,
  648. but the language lends itself well to scripts.
  649. .SH OPTIONS
  650. .TP
  651. .Cr \-e
  652. If the
  653. .Cr \-e
  654. option is present, then
  655. .I rc
  656. will exit if the exit status of a command is false (nonzero).
  657. .I rc
  658. will not exit, however, if a conditional fails, e.g., an
  659. .Cr if()
  660. command.
  661. .TP
  662. .Cr \-i
  663. If the
  664. .Cr \-i
  665. option is present or if the input to
  666. .I rc
  667. is from a terminal (as determined by
  668. .IR isatty (3))
  669. then
  670. .I rc
  671. will be in
  672. .I interactive
  673. mode.
  674. That is, a prompt (from
  675. .Cr $prompt(1)\^ )
  676. will be printed before an
  677. input line is taken, and
  678. .I rc
  679. will ignore the signals
  680. .Cr SIGINT
  681. and
  682. .Cr SIGQUIT .
  683. .TP
  684. .Cr \-x
  685. This option will make
  686. .I rc
  687. print every command on standard error before it is executed.
  688. It can be useful for debugging
  689. .I rc
  690. scripts.
  691. .TP
  692. .Cr \-v
  693. This option will echo input to
  694. .I rc
  695. on standard error as it is read.
  696. .TP
  697. .Cr \-l
  698. If the
  699. .Cr \-l
  700. option is present, or if
  701. .IR rc 's
  702. .Cr argv[0][0]
  703. is a dash
  704. .Rc ( \- ),
  705. then
  706. .I rc
  707. will behave as a login shell.
  708. That is, it will try to run commands present in
  709. .Cr $home/.rcrc ,
  710. if this file exists, before reading any other input.
  711. .TP
  712. .Cr \-d
  713. This flag causes
  714. .I rc
  715. not to trap
  716. .Cr SIGQUIT ,
  717. and thus
  718. .I rc
  719. will dump core when it receives this signal.
  720. This option is only useful for debugging
  721. .IR rc .
  722. .TP
  723. .Cr \-n
  724. This flag causes
  725. .I rc
  726. to read its input and parse it, but not to execute any commands.
  727. This is useful for syntax checking on scripts. If used in combination
  728. with the
  729. .Cr \-x
  730. option,
  731. .I rc
  732. will print each command as it is parsed in a form similar to the one
  733. used for exporting functions into the environment.
  734. .TP
  735. .Cr \-c
  736. If
  737. .Cr \-c
  738. is present, commands are executed from the immediately following
  739. argument.
  740. Any further arguments to
  741. .I rc
  742. are placed in
  743. .Cr $* .
  744. .PP
  745. .SH COMMANDS
  746. A simple command is a sequence of words, separated by white space
  747. (space and tab) characters that ends with a newline, semicolon
  748. .Rc ( ; ),
  749. or ampersand
  750. .Rc ( & ).
  751. The first word of a command is the name of that command.
  752. If the name begins with
  753. .Cr / ,
  754. .Cr ./ ,
  755. or
  756. .Cr ../ ,
  757. then the name is used as an absolute path
  758. name referring to an executable file.
  759. Otherwise, the name of the command is looked up in a table
  760. of shell functions, builtin commands,
  761. or as a file in the directories named by
  762. .Cr $path .
  763. .SS "Background Tasks"
  764. A command ending with a
  765. .Cr &
  766. is run in the background; that is,
  767. the shell returns immediately rather than waiting for the command to
  768. complete.
  769. Background commands have
  770. .Cr /dev/null
  771. connected to their standard input unless an explicit redirection for
  772. standard input is used.
  773. .SS "Subshells"
  774. A command prefixed with an at-sign
  775. .Rc ( @ )
  776. is executed in a subshell.
  777. This insulates the parent shell from the effects
  778. of state changing operations such as a
  779. .B cd
  780. or a variable assignment.
  781. For example:
  782. .Ds
  783. .Cr "@ {cd ..; make}
  784. .De
  785. .PP
  786. will run
  787. .IR make (1)
  788. in the parent directory
  789. .Rc ( .. ),
  790. but leaves the shell running in the current directory.
  791. .SS "Line continuation"
  792. A long logical line may be continued over several physical lines by
  793. terminating each line (except the last) with a backslash
  794. .Rc ( \e ).
  795. The backslash-newline sequence is treated as a space.
  796. A backslash is not otherwise special to
  797. .IR rc .
  798. .SS Quoting
  799. .IR rc
  800. interprets several characters specially; special characters
  801. automatically terminate words.
  802. The following characters are special:
  803. .Ds
  804. .Cr "# ; & | ^ $ = \` ' { } ( ) < >
  805. .De
  806. .PP
  807. The single quote
  808. .Rc ( ' )
  809. prevents special treatment of any character other than itself.
  810. All characters, including control characters, newlines,
  811. and backslashes between two quote characters are treated as an
  812. uninterpreted string.
  813. A quote character itself may be quoted by placing two quotes in a row.
  814. The minimal sequence needed to enter the quote character is
  815. .Cr '''' .
  816. The empty string is represented by
  817. .Cr '' .
  818. Thus:
  819. .Ds
  820. .Cr "echo 'What''s the plan, Stan?'
  821. .De
  822. .PP
  823. prints out
  824. .Ds
  825. .Cr "What's the plan, Stan?
  826. .De
  827. .SS Grouping
  828. Zero or more commands may be grouped within braces
  829. .Rc (`` { ''
  830. and
  831. .Rc `` } ''),
  832. and are then treated as one command.
  833. Braces do not otherwise define scope;
  834. they are used only for command grouping.
  835. In particular, be wary of the command:
  836. .Ds
  837. .Cr "for (i) {
  838. .Cr "    command"
  839. .Cr "} | command
  840. .De
  841. .PP
  842. Since pipe binds tighter than
  843. .Cr for ,
  844. this command does not perform what the user expects it to.
  845. Instead, enclose the whole
  846. .Cr for
  847. statement in braces:
  848. .Ds
  849. .Cr "{for (i) command} | command
  850. .De
  851. .PP
  852. Fortunately,
  853. .IR rc 's
  854. grammar is simple enough that a (confident) user can
  855. understand it by examining the skeletal
  856. .IR yacc (1)
  857. grammar
  858. at the end of this man page (see the section entitled
  859. .BR GRAMMAR ).
  860. .SS "Input and output"
  861. .PP
  862. The standard output may be redirected to a file with
  863. .Ds
  864. .Cr "command > file"
  865. .De
  866. .PP
  867. and the standard input may be taken from a file with
  868. .Ds
  869. .Cr "command < file
  870. .De
  871. .PP
  872. File descriptors other than 0 and 1 may be specified also.
  873. For example, to redirect standard error to a file, use:
  874. .Ds
  875. .Cr "command >[2] file
  876. .De
  877. .PP
  878. In order to duplicate a file descriptor, use
  879. .Ci >[ n = m ]\fR.
  880. Thus to redirect both standard output and standard error
  881. to the same file, use
  882. .Ds
  883. .Cr "command > file >[2=1]
  884. .De
  885. .PP
  886. To close a file descriptor that may be open, use
  887. .Ci >[ n =]\fR.
  888. For example, to
  889. close file descriptor 7:
  890. .Ds
  891. .Cr "command >[7=]
  892. .De
  893. .PP
  894. In order to place the output of a command at the end of an already
  895. existing file, use:
  896. .Ds
  897. .Cr "command >> file
  898. .De
  899. .PP
  900. If the file does not exist, then it is created.
  901. .PP
  902. ``Here documents'' are supported as in
  903. .I sh
  904. with the use of
  905. .Ds
  906. .Cr "command << 'eof-marker'
  907. .De
  908. .PP
  909. If the end-of-file marker is enclosed in quotes,
  910. then no variable substitution occurs inside the here document.
  911. Otherwise, every variable is substituted
  912. by its space-separated-list value (see
  913. .BR "Flat Lists" ,
  914. below),
  915. and if a
  916. .Cr ^
  917. character follows a variable name, it is deleted.
  918. This allows the unambiguous use of variables adjacent to text, as in
  919. .Ds
  920. .Cr $variable^follow
  921. .De
  922. .PP
  923. Additionally,
  924. .I rc
  925. supports ``here strings'', which are like here documents,
  926. except that input is taken directly from a string on the command line.
  927. Its use is illustrated here:
  928. .Ds
  929. .Cr "cat <<< 'this is a here string' | wc
  930. .De
  931. .PP
  932. (This feature enables
  933. .I rc
  934. to export functions using here documents into the environment;
  935. the author does not expect users to find this feature useful.)
  936. .SS Pipes
  937. Two or more commands may be combined in a pipeline by placing the
  938. vertical bar
  939. .Rc ( \||\| )
  940. between them.
  941. The standard output (file descriptor 1)
  942. of the command on the left is tied to the standard input (file
  943. descriptor 0) of the command on the right.
  944. The notation
  945. .Ci |[ n = m ]
  946. indicates that file descriptor
  947. .I n
  948. of the left process is connected to
  949. file descriptor
  950. .I m
  951. of the right process.
  952. .Ci |[ n ]
  953. is a shorthand for
  954. .Ci |[ n =0]\fR.
  955. As an example, to pipe the standard error of a command to
  956. .IR wc (1),
  957. use:
  958. .Ds
  959. .Cr "command |[2] wc
  960. .De
  961. .PP
  962. The exit status of a pipeline is considered true if and only if every
  963. command in the pipeline exits true.
  964. .SS "Commands as Arguments"
  965. Some commands, like
  966. .IR cmp (1)
  967. or
  968. .IR diff (1),
  969. take their arguments on the command
  970. line, and do not read input from standard input.
  971. It is convenient
  972. sometimes to build nonlinear pipelines so that a command like
  973. .I cmp
  974. can read the output of two other commands at once.
  975. .I rc
  976. does it like this:
  977. .Ds
  978. .Cr "cmp <{command} <{command}
  979. .De
  980. .PP
  981. compares the output of the two commands in braces.
  982. A note: since this form of
  983. redirection is implemented with some kind of pipe, and since one cannot
  984. .IR lseek (2)
  985. on a pipe, commands that use
  986. .IR lseek (2)
  987. will hang.
  988. For example,
  989. most versions of
  990. .IR diff (1)
  991. use
  992. .IR lseek (2)
  993. on their inputs.
  994. .PP
  995. Data can be sent down a pipe to several commands using
  996. .IR tee (1)
  997. and the output version of this notation:
  998. .Ds
  999. .Cr "echo hi there | tee >{sed 's/^/p1 /'} >{sed 's/^/p2 /'}
  1000. .De
  1001. .SH "CONTROL STRUCTURES"
  1002. The following may be used for control flow in
  1003. .IR rc :
  1004. .SS "If-else Statements"
  1005. .PD 0
  1006. .sp
  1007. .Ci "if (" test ") {"
  1008. .br
  1009. .I  "    cmd
  1010. .br
  1011. .TP
  1012. .Ci "} else " cmd
  1013. The
  1014. .I test
  1015. is executed, and if its return status is zero, the first
  1016. command is executed, otherwise the second is.
  1017. Braces are not mandatory around the commands.
  1018. However, an
  1019. .Cr else
  1020. statement is valid only if it
  1021. follows a close-brace on the same line.
  1022. Otherwise, the
  1023. .Cr if
  1024. is taken to be a simple-if:
  1025. .Ds +1.0i
  1026. .Cr "if (test)
  1027. .Cr "    command
  1028. .De
  1029. .PD
  1030. .SS "While and For Loops"
  1031. .TP
  1032. .Ci "while (" test ) " cmd
  1033. .I rc
  1034. executes the
  1035. .I test
  1036. and performs the command as long as the
  1037. .I test
  1038. is true.
  1039. .TP
  1040. .Ci "for (" var " in" " list" ) " cmd
  1041. .I rc
  1042. sets
  1043. .I var
  1044. to each element of
  1045. .I list
  1046. (which may contain variables and backquote substitutions) and runs
  1047. .IR cmd .
  1048. If
  1049. .Rc `` in
  1050. .IR list ''
  1051. is omitted, then
  1052. .I rc
  1053. will set
  1054. .I var
  1055. to each element of
  1056. .Cr $*
  1057. (excluding
  1058. .Cr $0 ).
  1059. For example:
  1060. .Ds +1.0i
  1061. .Cr "for (i in \`{ls -F | grep '\e*$' | sed 's/\e*$//'}) { commands }
  1062. .De
  1063. .TP
  1064. \&
  1065. will set
  1066. .Cr $i
  1067. to the name of each file in the current directory that is
  1068. executable.
  1069. .SS "Switch"
  1070. .TP
  1071. .Ci "switch (" list ") { case" " ..." " }
  1072. .I rc
  1073. looks inside the braces after a
  1074. .Cr switch
  1075. statement for single lines beginning with the word
  1076. .Cr case .
  1077. If any of the patterns following
  1078. .Cr case
  1079. match the list supplied to
  1080. .Cr switch ,
  1081. then the commands up until the next
  1082. .Cr case
  1083. statement are executed.
  1084. Metacharacters should not be quoted;
  1085. matching is performed only against the strings in
  1086. .IR list ,
  1087. not against file names.
  1088. (Matching for case statements is the same as for the
  1089. .Cr ~
  1090. command.)
  1091. .SS "Logical Operators"
  1092. There are a number of operators in
  1093. .I rc
  1094. which depend on the exit status of a command.
  1095. .Ds
  1096. .Cr "command && command
  1097. .De
  1098. .PP
  1099. executes the first command and then executes the second command if and only if
  1100. the first command exits with a zero exit status (``true'' in Unix).
  1101. .Ds
  1102. .Cr "command || command
  1103. .De
  1104. .PP
  1105. executes the first command executing the second command if and only if
  1106. the second command exits with a nonzero exit status (``false'' in Unix).
  1107. .Ds
  1108. .Cr "! command
  1109. .De
  1110. .PP
  1111. negates the exit status of a command.
  1112. .SH "PATTERN MATCHING"
  1113. There are two forms of pattern matching in
  1114. .IR rc .
  1115. One is traditional shell globbing.
  1116. This occurs in matching for file names in argument lists:
  1117. .Ds
  1118. .Cr "command argument argument ...
  1119. .De
  1120. .PP
  1121. When the characters
  1122. .Cr "*" ,
  1123. .Cr [
  1124. or
  1125. .Cr ?
  1126. occur in an argument,
  1127. .I rc
  1128. looks at the
  1129. argument as a pattern for matching against files. (Contrary to the behavior
  1130. other shells exhibit,
  1131. .I rc
  1132. will only perform pattern matching if a metacharacter occurs unquoted and
  1133. literally in the input. Thus,
  1134. .Ds
  1135. .Cr "foo='*'
  1136. .Cr "echo $foo
  1137. .De
  1138. .PP
  1139. will always echo just a star. In order for non-literal metacharacters to be
  1140. expanded, an
  1141. .Cr eval
  1142. statement must be used in order to rescan the input.)
  1143. Pattern matching occurs according to the following rules: a
  1144. .Cr *
  1145. matches any number (including zero) of
  1146. characters.
  1147. A
  1148. .Cr ?
  1149. matches any single character, and a
  1150. .Cr [
  1151. followed by a
  1152. number of characters followed by a
  1153. .Cr ]
  1154. matches a single character in that
  1155. class.
  1156. The rules for character class matching are the same as those for
  1157. .IR ed (1),
  1158. with the exception that character class negation is achieved
  1159. with the tilde
  1160. .Rc ( ~ ),
  1161. not the caret
  1162. .Rc ( ^ ),
  1163. since the caret already means
  1164. something else in
  1165. .IR rc .
  1166. .PP
  1167. .I rc
  1168. also matches patterns against strings with the
  1169. .Cr ~
  1170. command:
  1171. .Ds
  1172. .Cr "~ subject pattern pattern ...
  1173. .De
  1174. .PP
  1175. .Cr ~
  1176. sets
  1177. .Cr $status
  1178. to zero if and only if a supplied pattern matches any
  1179. single element of the subject list.
  1180. Thus
  1181. .Ds
  1182. .Cr "~ foo f*
  1183. .De
  1184. .PP
  1185. sets status to zero, while
  1186. .Ds
  1187. .Cr "~ (bar baz) f*
  1188. .De
  1189. .PP
  1190. sets status to one.
  1191. The null list is matched by the null list, so
  1192. .Ds
  1193. .Cr "~ $foo ()
  1194. .De
  1195. .PP
  1196. checks to see whether
  1197. .Cr $foo
  1198. is empty or not.
  1199. This may also be achieved
  1200. by the test
  1201. .Ds
  1202. .Cr "~ $#foo 0
  1203. .De
  1204. .PP
  1205. Note that inside a
  1206. .Cr ~
  1207. command
  1208. .I rc
  1209. does not match patterns against file
  1210. names, so it is not necessary to quote the characters
  1211. .Cr "*" ,
  1212. .Cr [
  1213. and
  1214. .Cr "?" .
  1215. However,
  1216. .I rc
  1217. does expand the glob the subject against filenames if it contains
  1218. metacharacters. Thus, the command
  1219. .Ds
  1220. .Cr "~ * ?
  1221. .De
  1222. .PP
  1223. returns true if any of the files in the current directory have a
  1224. single-character name.
  1225. (Note that if the
  1226. .Cr ~
  1227. command is given a list as its first
  1228. argument, then a successful match against any of the elements of that
  1229. list will cause
  1230. .Cr ~
  1231. to return true.
  1232. For example:
  1233. .Ds
  1234. .Cr "~ (foo goo zoo) z*
  1235. .De
  1236. .PP
  1237. is true.)
  1238. .SH "LISTS AND VARIABLES"
  1239. The primary data structure in
  1240. .IR rc
  1241. is the list, which is a sequence of words.
  1242. Parentheses are used to group lists.
  1243. The empty list is represented by
  1244. .Cr "()" .
  1245. Lists have no hierarchical structure;
  1246. a list inside another list is expanded so the
  1247. outer list contains all the elements of the inner list.
  1248. Thus, the following are all equivalent
  1249. .Ds
  1250. .Cr "one two three
  1251. X
  1252. .Cr "(one two three)
  1253. X
  1254. .Cr "((one) () ((two three)))
  1255. .De
  1256. .PP
  1257. Note that the null string,
  1258. .Cr "''" ,
  1259. and the null list,
  1260. .Cr "()" ,
  1261. are two very
  1262. different things.
  1263. Assigning the null string to variable is a valid
  1264. operation, but it does not remove its definition.
  1265. For example,
  1266. if
  1267. .Cr $a
  1268. is set to
  1269. .Cr "''" ,
  1270. then
  1271. .Cr "$#a" ,
  1272. returns a 1.
  1273. .SS "List Concatenation"
  1274. Two lists may be joined by the concatenation operator
  1275. .Rc ( ^ ).
  1276. A single word is treated as a list of length one, so
  1277. .Ds
  1278. .Cr "echo foo^bar
  1279. .De
  1280. .PP
  1281. produces the output
  1282. .Ds
  1283. .Cr foobar
  1284. .De
  1285. .PP
  1286. For lists of more than one element,
  1287. concatenation works according to the following rules:
  1288. if the two lists have the same number of elements,
  1289. then concatenation is pairwise:
  1290. .Ds
  1291. .Cr "echo (a\- b\- c\-)^(1 2 3)
  1292. .De
  1293. .PP
  1294. produces the output
  1295. .Ds
  1296. .Cr "a\-1 b\-2 c\-3
  1297. .De
  1298. .PP
  1299. Otherwise, one of the lists must have a single element,
  1300. and then the concatenation is distributive:
  1301. .Ds
  1302. .Cr "cc \-^(O g c) (malloc alloca)^.c
  1303. .De
  1304. .PP
  1305. has the effect of performing the command
  1306. .Ds
  1307. .Cr "cc \-O \-g \-c malloc.c alloca.c
  1308. .De
  1309. .SS "Free Carets"
  1310. .I rc
  1311. inserts carets (concatenation operators) for free in certain situations,
  1312. in order to save some typing on the user's behalf.
  1313. For
  1314. example, the above example could also be typed in as:
  1315. .Ds
  1316. .Cr "opts=(O g c) files=(malloc alloca) cc \-$opts $files.c
  1317. .De
  1318. .PP
  1319. .I rc
  1320. takes care to insert a free-caret between the
  1321. .Rc `` \- ''
  1322. and
  1323. .Cr "$opts" ,
  1324. as well
  1325. as between
  1326. .Cr $files
  1327. and
  1328. .Cr ".c" .
  1329. The rule for free carets is as follows:  if
  1330. a word or keyword is immediately
  1331. followed by another word, keyword, dollar-sign or
  1332. backquote, then
  1333. .I rc
  1334. inserts a caret between them.
  1335. .SS "Variables"
  1336. A list may be assigned to a variable, using the notation:
  1337. .Ds
  1338. .Ic var " = " list
  1339. .De
  1340. .PP
  1341. Any sequence of non-special characters, except a sequence including
  1342. only digits, may be used as a variable name.
  1343. All user-defined variables are exported into the environment.
  1344. .PP
  1345. The value of a variable is referenced with the notation:
  1346. .Ds
  1347. .Ci $ var
  1348. .De
  1349. .PP
  1350. Any variable which has not been assigned a value returns the null list,
  1351. .Cr "()" ,
  1352. when referenced.
  1353. In addition, multiple references are allowed:
  1354. .Ds
  1355. .Cr a=foo
  1356. .Cr b=a
  1357. .Cr "echo $$b
  1358. .De
  1359. .PP
  1360. prints
  1361. .Ds
  1362. .Cr foo
  1363. .De
  1364. .PP
  1365. A variable's definition may also be removed by
  1366. assigning the null list to a variable:
  1367. .Ds
  1368. .Ic var =()
  1369. .De
  1370. .PP
  1371. For ``free careting'' to work correctly,
  1372. .I rc
  1373. must make certain assumptions
  1374. about what characters may appear in a variable name.
  1375. .I rc
  1376. assumes that a variable name consists only of alphanumeric characters,
  1377. underscore
  1378. .Rc ( \|_\| )
  1379. and star
  1380. .Rc ( * ).
  1381. To reference a variable with other
  1382. characters in its name, quote the variable name.
  1383. Thus:
  1384. .Ds
  1385. .Cr "echo $'we$Ird\Variab!le'
  1386. .De
  1387. .SS "Local Variables"
  1388. Any number of variable assignments may be made local to a single
  1389. command by typing:
  1390. .Ds
  1391. .Cr "a=foo b=bar ... command
  1392. .De
  1393. .PP
  1394. The command may be a compound command, so for example:
  1395. .Ds
  1396. .Cr "path=. ifs=() {
  1397. .Cr "    " ...
  1398. .Cr }
  1399. .De
  1400. .PP
  1401. sets
  1402. .Cr path
  1403. to
  1404. .Cr .
  1405. and removes
  1406. .Cr ifs
  1407. for the duration of one long compound command.
  1408. .SS "Variable Subscripts"
  1409. Variables may be subscripted with the notation
  1410. .Ds
  1411. .Ci $var( n )
  1412. .De
  1413. .PP
  1414. where
  1415. .I n
  1416. is a list of integers (origin 1).
  1417. The list of subscripts need
  1418. not be in order or even unique.
  1419. Thus, if
  1420. .Ds
  1421. .Cr "a=(one two three)
  1422. .De
  1423. .PP
  1424. then
  1425. .Ds
  1426. .Cr "echo $a(3 3 3)
  1427. .De
  1428. .PP
  1429. prints
  1430. .Ds
  1431. .Cr "three three three
  1432. .De
  1433. .PP
  1434. If
  1435. .I n
  1436. references a nonexistent element, then
  1437. .Ci $var( n )
  1438. returns the null list.
  1439. The notation
  1440. .Ci "$" n\fR,
  1441. where
  1442. .I n
  1443. is an integer, is a shorthand for
  1444. .Ci $*( n )\fR.
  1445. Thus,
  1446. .IR rc 's
  1447. arguments may be referred to as
  1448. .Cr "$1" ,
  1449. .Cr "$2" ,
  1450. and so on.
  1451. .PP
  1452. Note also that the list of subscripts may be given by any of
  1453. .IR rc 's
  1454. list operations:
  1455. .Ds
  1456. .Cr "$var(\`{awk 'BEGIN{for(i=1;i<=10;i++)print i;exit; }'})
  1457. .De
  1458. .PP
  1459. returns the first 10 elements of
  1460. .Cr $var .
  1461. .PP
  1462. To count the number of elements in a variable, use
  1463. .Ds
  1464. .Cr $#var
  1465. .De
  1466. .PP
  1467. This returns a single-element list, with the number of elements in
  1468. .Cr $var .
  1469. .SS "Flat Lists"
  1470. In order to create a single-element list from a multi-element list,
  1471. with the components space-separated, use
  1472. .Ds
  1473. .Cr $^var
  1474. .De
  1475. .PP
  1476. This is useful when the normal list concatenation rules need to be
  1477. bypassed.
  1478. For example, to append a single period at the end of
  1479. .Cr $path ,
  1480. use:
  1481. .Ds
  1482. .Cr "echo $^path.
  1483. .De
  1484. .SS "Backquote Substitution"
  1485. A list may be formed from the output of a command by using backquote
  1486. substitution:
  1487. .Ds
  1488. .Cr "\`{ command }
  1489. .De
  1490. .PP
  1491. returns a list formed from the standard output of the command in braces.
  1492. .Cr $ifs
  1493. is used to split the output into list elements.
  1494. By default,
  1495. .Cr $ifs
  1496. has the value space-tab-newline.
  1497. The braces may be omitted if the command is a single word.
  1498. Thus
  1499. .Cr \`ls
  1500. may be used instead of
  1501. .Cr "\`{ls}" .
  1502. This last feature is useful when defining functions that expand
  1503. to useful argument lists.
  1504. A frequent use is:
  1505. .Ds
  1506. .Cr "fn src { echo *.[chy] }
  1507. .De
  1508. .PP
  1509. followed by
  1510. .Ds
  1511. .Cr "wc \`src
  1512. .De
  1513. .PP
  1514. (This will print out a word-count of all C source files in the current
  1515. directory.)
  1516. .PP
  1517. In order to override the value of
  1518. .Cr $ifs
  1519. for a single backquote
  1520. substitution, use:
  1521. .Ds
  1522. .Cr "\`\` (ifs-list) { command }
  1523. .De
  1524. .PP
  1525. .Cr $ifs
  1526. will be temporarily ignored and the command's output will be split as specified by
  1527. the list following the double backquote.
  1528. For example:
  1529. .Ds
  1530. .Cr "\`\` ($nl :) {cat /etc/passwd}
  1531. .De
  1532. .PP
  1533. splits up
  1534. .Cr /etc/passwd
  1535. into fields, assuming that
  1536. .Cr $nl
  1537. contains a newline
  1538. as its value.
  1539. .SH "SPECIAL VARIABLES"
  1540. Several variables are known to
  1541. .I rc
  1542. and are treated specially.
  1543. .TP
  1544. .Cr *
  1545. The argument list of
  1546. .IR rc .
  1547. .Cr "$1, $2,
  1548. etc. are the same as
  1549. .Cr $*(1) ,
  1550. .Cr $*(2) ,
  1551. etc.
  1552. The variable
  1553. .Cr $0
  1554. holds the value of
  1555. .Cr argv[0]
  1556. with which
  1557. .I rc
  1558. was invoked.
  1559. Additionally,
  1560. .Cr $0
  1561. is set to the name of a function for the duration of
  1562. the execution of that function, and
  1563. .Cr $0
  1564. is also set to the name of the
  1565. file being interpreted for the duration of a
  1566. .Cr .
  1567. command.
  1568. .TP
  1569. .Cr apid
  1570. The process ID of the last process started in the background.
  1571. .TP
  1572. .Cr cdpath
  1573. A list of directories to search for the target of a
  1574. .B cd
  1575. command.
  1576. The empty string stands for the current directory.
  1577. Note that if the
  1578. .Cr $cdpath
  1579. variable does not contain the current directory, then the current
  1580. directory will not be searched; this allows directory searching to
  1581. begin in a directory other than the current directory.
  1582. Note also that an assignment to
  1583. .Cr $cdpath
  1584. causes an automatic assignment to
  1585. .Cr $CDPATH ,
  1586. and vice-versa.
  1587. .TP
  1588. .Cr history
  1589. .Cr $history
  1590. contains the name of a file to which commands are appended as
  1591. .I rc
  1592. reads them.
  1593. This facilitates the use of a stand-alone history program
  1594. (such as
  1595. .IR history (1))
  1596. which parses the contents of the history file and presents them to
  1597. .I rc
  1598. for reinterpretation.
  1599. If
  1600. .Cr $history
  1601. is not set, then
  1602. .I rc
  1603. does not append commands to any file.
  1604. .TP
  1605. .Cr home
  1606. The default directory for the builtin
  1607. .B cd
  1608. command and is the directory
  1609. in which
  1610. .I rc
  1611. looks to find its initialization file,
  1612. .Cr .rcrc ,
  1613. if
  1614. .I rc
  1615. has been started up as a login shell.
  1616. Like
  1617. .Cr $cdpath
  1618. and
  1619. .Cr $CDPATH ,
  1620. .Cr $home
  1621. and
  1622. .Cr $HOME
  1623. are aliased to each other.
  1624. .TP
  1625. .Cr ifs
  1626. The internal field separator, used for splitting up the output of
  1627. backquote commands for digestion as a list.
  1628. .TP
  1629. .Cr path
  1630. This is a list of directories to search in for commands.
  1631. The empty string stands for the current directory.
  1632. Note that like
  1633. .Cr $cdpath
  1634. and
  1635. .Cr $CDPATH ,
  1636. .Cr $path
  1637. and
  1638. .Cr $PATH
  1639. are aliased to each other.
  1640. .TP
  1641. .Cr pid
  1642. The process ID of the currently running
  1643. .IR rc .
  1644. .TP
  1645. .Cr prompt
  1646. This variable holds the two prompts (in list form, of course) that
  1647. .I rc
  1648. prints.
  1649. .Cr $prompt(1)
  1650. is printed before each command is read, and
  1651. .Cr $prompt(2)
  1652. is printed when input is expected to continue on the next
  1653. line.
  1654. .I rc
  1655. sets
  1656. .Cr $prompt
  1657. to
  1658. .Cr "('; ' '')
  1659. by default.
  1660. The reason for this is that it enables an
  1661. .I rc
  1662. user to grab commands from previous lines using a
  1663. mouse, and to present them to
  1664. .I rc
  1665. for re-interpretation; the semicolon
  1666. prompt is simply ignored by
  1667. .IR rc .
  1668. The null
  1669. .Cr $prompt(2)
  1670. also has its
  1671. justification:  an
  1672. .I rc
  1673. script, when typed interactively, will not leave
  1674. .Cr $prompt(2) 's
  1675. on the screen,
  1676. and can therefore be grabbed by a mouse and placed
  1677. directly into a file for use as a shell script, without further editing
  1678. being necessary.
  1679. .TP
  1680. .Cr prompt " (function)
  1681. If this function is set, then it gets executed every time
  1682. .I rc
  1683. is about to print
  1684. .Cr "$prompt(1)" .
  1685. .TP
  1686. .Cr status
  1687. The exit status of the last command.
  1688. If the command exited with a numeric value,
  1689. that number is the status.
  1690. If the died with a signal,
  1691. the status is the name of that signal; if a core file
  1692. was created, the string
  1693. .Rc `` +core ''
  1694. is appended.
  1695. The value of
  1696. .Cr $status
  1697. for a pipeline is a list, with one entry,
  1698. as above, for each process in the pipeline.
  1699. For example, the command
  1700. .Ds 1i
  1701. .Cr "ls | wc
  1702. .De
  1703. .TP
  1704. \&
  1705. usually sets
  1706. .Cr $status
  1707. to
  1708. .Cr "(0 0)" .
  1709. .PP
  1710. The values of
  1711. .Cr "$path" ,
  1712. .Cr "$cdpath" ,
  1713. and
  1714. .Cr $home
  1715. are derived from the environment
  1716. values of
  1717. .Cr "$PATH" ,
  1718. .Cr "$CDPATH" ,
  1719. and
  1720. .Cr "$HOME" .
  1721. Otherwise, they are derived from
  1722. the environment values of
  1723. .Cr $path ,
  1724. .Cr $cdpath
  1725. and
  1726. .Cr $home .
  1727. This is for compatibility with other Unix programs, like
  1728. .IR sh (1).
  1729. .Cr $PATH
  1730. and
  1731. .Cr $CDPATH
  1732. are assumed to be colon-separated lists.
  1733. .SH FUNCTIONS
  1734. .I rc
  1735. functions are identical to
  1736. .I rc
  1737. scripts, except that they are stored
  1738. in memory and are automatically exported into the environment.
  1739. A shell function is declared as:
  1740. .Ds
  1741. .Cr "fn name { commands }
  1742. .De
  1743. .PP
  1744. .I rc
  1745. scans the definition until the close-brace, so the function can
  1746. span more than one line.
  1747. The function definition may be removed by typing
  1748. .Ds
  1749. .Cr "fn name
  1750. .De
  1751. .PP
  1752. (One or more names may be specified. With an accompanying definition,
  1753. all names receive the same definition. This is sometimes useful
  1754. for assigning the same signal handler to many signals. Without a
  1755. definition, all named functions are deleted.) 
  1756. When a function is executed,
  1757. .Cr $*
  1758. is set to the arguments to that
  1759. function for the duration of the command.
  1760. Thus a reasonable definition for
  1761. .Cr "l" ,
  1762. a shorthand for
  1763. .IR ls (1),
  1764. could be:
  1765. .Ds
  1766. .Cr "fn l { ls -FC $* }
  1767. .De
  1768. .PP
  1769. but not
  1770. .Ds
  1771. .Cr "fn l { ls -FC }
  1772. .De
  1773. .SH "INTERRUPTS AND SIGNALS"
  1774. .I rc
  1775. recognizes a number of signals, and allows the user to define shell
  1776. functions which act as signal handlers.
  1777. .I rc
  1778. by default traps
  1779. .Cr SIGINT
  1780. and
  1781. .Cr SIGQUIT
  1782. when it is in interactive mode.
  1783. .Cr SIGQUIT
  1784. is ignored, unless
  1785. .I rc
  1786. has been invoked with the
  1787. .Cr \-d
  1788. flag.
  1789. However, user-defined signal handlers may be written for these and
  1790. all other signals.
  1791. The way to define a signal handler is to
  1792. write a function by the name of the signal in lower case.
  1793. Thus:
  1794. .Ds
  1795. .Cr "fn sighup { echo hangup; rm /tmp/rc$pid.*; exit }
  1796. .De
  1797. .PP
  1798. In addition to Unix signals,
  1799. .I rc
  1800. recognizes the artificial signal
  1801. .Cr SIGEXIT
  1802. which occurs as
  1803. .I rc
  1804. is about to exit.
  1805. .PP
  1806. In order to remove a signal handler's definition,
  1807. remove it as though it were a regular function.
  1808. For example:
  1809. .Ds
  1810. .Cr "fn sigint
  1811. .De
  1812. .PP
  1813. returns the handler of
  1814. .Cr SIGINT
  1815. to the default value.
  1816. In order to ignore a signal, set the signal handler's value to
  1817. .Cr "{}" .
  1818. Thus:
  1819. .Ds
  1820. .Cr "fn sigint {}
  1821. .De
  1822. .PP
  1823. causes SIGINT to be ignored by the shell.
  1824. .PP
  1825. On System V-based Unix systems,
  1826. .I rc
  1827. will not allow you to trap
  1828. .Cr SIGCLD .
  1829. .SH "BUILTIN COMMANDS"
  1830. Builtin commands execute in the context of the shell, but otherwise
  1831. behave exactly like other commands.
  1832. .TP
  1833. \&\fB.\fR [\fB\-i\fR] \fIfile \fR[\fIarg ...\fR]
  1834. Reads
  1835. .I file
  1836. as input to
  1837. .IR rc
  1838. and executes its contents.
  1839. With a
  1840. .Cr \-i
  1841. flag, input is interactive.
  1842. Thus from within a shell script,
  1843. .Ds 1i
  1844. .Cr ". \-i /dev/tty
  1845. .De
  1846. .TP
  1847. \&
  1848. does the ``right'' thing.
  1849. .TP
  1850. .B break
  1851. Breaks from the innermost
  1852. .Cr for
  1853. or
  1854. .Cr while ,
  1855. as in C.
  1856. It is an error to invoke
  1857. .B break
  1858. outside of a loop.
  1859. (Note that there is no
  1860. .B break
  1861. keyword between commands in
  1862. .Cr switch
  1863. statements, unlike C.)
  1864. .TP
  1865. \fBbuiltin \fIcommand \fR[\fIarg ...\fR]
  1866. Executes the command ignoring any function definition of the
  1867. same name.
  1868. This command is present to allow functions with the
  1869. same names as builtins to use the underlying builtin or binary.
  1870. .TP
  1871. \fBcd \fR[\fIdirectory\fR]
  1872. Changes the current directory to
  1873. .IR directory .
  1874. The variable
  1875. .Cr $cdpath
  1876. is searched for possible locations of
  1877. .IR directory ,
  1878. analogous to the searching of
  1879. .Cr $path
  1880. for executable files.
  1881. With no argument,
  1882. .B cd
  1883. changes the current directory to
  1884. .Cr "$home" .
  1885. .TP
  1886. \fBecho \fR[\fIarg ...\fR]
  1887. Prints its arguments to standard output, terminated by a newline.
  1888. Arguments are separated by spaces.
  1889. If the first argument is
  1890. .Cr "\-n" ,
  1891. no final newline is printed.
  1892. If the first argument is
  1893. .\" The \| puts in a little space to separate the dashes in troff.
  1894. .Cr "\-\|\-" ,
  1895. then any subsequent arguments will not be interpreted as options to
  1896. .IR echo .
  1897. .TP
  1898. \fBeval \fR[\fIlist\fR]
  1899. Concatenates the elements of
  1900. .I list
  1901. with spaces and feeds the resulting string to
  1902. .I rc
  1903. for re-scanning.
  1904. This is the only time input is rescanned in
  1905. .IR rc .
  1906. .TP
  1907. \fBexec \fR[\fIarg ...\fR]
  1908. Replaces
  1909. .I rc
  1910. with the given command.
  1911. If the exec contains only redirections,
  1912. then these redirections apply to the current shell
  1913. and the shell does not exit.
  1914. For example,
  1915. .Ds 1i
  1916. .Cr "exec >[2] err.out
  1917. .De
  1918. .TP
  1919. \&
  1920. places further output to standard error in the file
  1921. .IR err.out .
  1922. .TP
  1923. \fBexit \fR[\fIstatus\fR]
  1924. Cause the current shell to exit with the given exit
  1925. .IR status .
  1926. If no argument is given, the current value of
  1927. .Cr $status
  1928. is used.
  1929. .TP
  1930. \fBlimit \fR[\fB\-h\fR] [\fIresource \fR[\fIvalue\fR]]
  1931. Similar to the
  1932. .IR csh (1)
  1933. .B limit
  1934. builtin, this command operates upon the
  1935. BSD-style limits of a process.
  1936. The
  1937. .Cr \-h
  1938. flag displays/alters the hard
  1939. limits.
  1940. The resources which can be shown or altered are
  1941. .BR cputime ,
  1942. .BR filesize ,
  1943. .BR datasize ,
  1944. .BR stacksize ,
  1945. .B coredumpsize
  1946. and
  1947. .BR memoryuse .
  1948. For
  1949. example:
  1950. .Ds 1i
  1951. .Cr "limit coredumpsize 0
  1952. .De
  1953. .TP
  1954. \&
  1955. disables core dumps.
  1956. .TP
  1957. \fBreturn \fR[\fIn\fR]
  1958. Returns from the current function, with status
  1959. .IR n ,
  1960. where
  1961. .IR n
  1962. is a single value or a list of possible exit statuses. Thus it is
  1963. legal to have
  1964. .Ds
  1965. .Cr "return (sigpipe 1 2 3)
  1966. .De
  1967. .PP
  1968. (This is commonly used to allow a function to return with the exit status
  1969. of a previously executed pipeline of commands.)
  1970. If
  1971. .IR n
  1972. is omitted, then
  1973. .Cr $status
  1974. is left unchanged.
  1975. It is an error to invoke
  1976. .B return
  1977. when not inside a function.
  1978. .TP
  1979. \fBshift \fR[\fIn\fR]
  1980. Deletes
  1981. .I n
  1982. elements from the beginning of
  1983. .Cr $*
  1984. and shifts the other
  1985. elements down by
  1986. .IR n .
  1987. .I n
  1988. defaults to 1.
  1989. (Note that
  1990. .Cr $0
  1991. is not affected by
  1992. .BR shift .)
  1993. .TP
  1994. \fBumask \fR[\fImask\fR]
  1995. Sets the current umask (see
  1996. .IR umask (2))
  1997. to the octal
  1998. .IR mask .
  1999. If no argument is present, the current mask value is printed.
  2000. .TP
  2001. \fBwait \fR[\fIpid\fR]
  2002. Waits for the specified
  2003. .IR pid ,
  2004. which must have been started by
  2005. .IR rc .
  2006. If no
  2007. .I pid
  2008. is specified,
  2009. .I rc
  2010. waits for any child process to exit.
  2011. .TP
  2012. \fBwhatis \fR[\fB\-s\fR] \fR[\fIname ...\fR]
  2013. Prints a definition of the named objects.
  2014. For variables, their values
  2015. are printed; for functions, their definitions are; and for executable
  2016. files, path names are printed.
  2017. Without arguments,
  2018. .B whatis
  2019. prints the values of all shell variables and functions.
  2020. With a
  2021. .Cr \-s
  2022. argument,
  2023. .B whatis
  2024. also prints out a list of available signals and their handlers (if any).
  2025. Note that
  2026. .B whatis
  2027. output is suitable for input to
  2028. .IR rc ;
  2029. by saving the output of
  2030. .B whatis
  2031. in a file, it should be possible to recreate the state of
  2032. .I rc
  2033. by sourcing this file with a
  2034. .Cr .
  2035. command.
  2036. Another note:
  2037. .Cr "whatis -s > file
  2038. cannot be used to store the state of
  2039. .IR rc 's
  2040. signal handlers in a file, because builtins with redirections
  2041. are run in a subshell, and
  2042. .I rc
  2043. always restores signal handlers to their default value after a
  2044. .Cr fork() .
  2045. .SH GRAMMAR
  2046. Here is
  2047. .IR rc 's
  2048. grammar, edited to remove semantic actions.
  2049. .Ds
  2050. .ft \*(Cf
  2051. %term ANDAND BACKBACK BANG CASE COUNT DUP ELSE END FLAT FN FOR IF IN
  2052. %term OROR PIPE REDIR SUB SUBSHELL SWITCH TWIDDLE WHILE WORD HUH
  2053. X
  2054. %left WHILE ')' ELSE
  2055. %left ANDAND OROR '\n'
  2056. %left BANG SUBSHELL
  2057. %left PIPE
  2058. %right '$' 
  2059. %left SUB
  2060. X
  2061. %start rc
  2062. X
  2063. %%
  2064. X
  2065. rc: line end
  2066. X    | error end
  2067. X
  2068. end: END /* EOF */ | '\n'
  2069. X
  2070. cmdsa: cmd ';' | cmd '&'
  2071. X
  2072. line: cmd | cmdsa line
  2073. X
  2074. body: cmd | cmdsan body
  2075. X
  2076. cmdsan: cmdsa | cmd '\n'
  2077. X
  2078. brace: '{' body '}'
  2079. X
  2080. paren: '(' body ')'
  2081. X
  2082. assign: first '=' word
  2083. X
  2084. epilog: /* empty */ | redir epilog
  2085. X
  2086. redir: DUP | REDIR word
  2087. X
  2088. case: CASE words ';' | CASE words '\n'
  2089. X
  2090. cbody: cmd | case cbody | cmdsan cbody
  2091. X
  2092. iftail: cmd    %prec ELSE
  2093. X    | brace ELSE optnl cmd
  2094. X
  2095. cmd    : /* empty */    %prec WHILE
  2096. X    | simple
  2097. X    | brace epilog
  2098. X    | IF paren optnl iftail
  2099. X    | FOR '(' word IN words ')' optnl cmd
  2100. X    | FOR '(' word ')' optnl cmd
  2101. X    | WHILE paren optnl cmd    
  2102. X    | SWITCH '(' word ')' optnl '{' cbody '}'
  2103. X    | TWIDDLE optcaret word words
  2104. X    | cmd ANDAND optnl cmd
  2105. X    | cmd OROR optnl cmd
  2106. X     | cmd PIPE optnl cmd
  2107. X    | redir cmd    %prec BANG
  2108. X    | assign cmd    %prec BANG
  2109. X    | BANG optcaret cmd
  2110. X    | SUBSHELL optcaret cmd
  2111. X    | FN words brace
  2112. X    | FN words
  2113. X
  2114. optcaret: /* empty */ | '^'
  2115. X
  2116. simple: first | simple word | simple redir
  2117. X
  2118. first: comword | first '^' sword
  2119. X
  2120. sword: comword | keyword
  2121. X
  2122. word: sword | word '^' sword
  2123. X
  2124. comword: '$' sword
  2125. X    | '$' sword SUB words ')'
  2126. X    | COUNT sword
  2127. X    | FLAT sword
  2128. X    | '`' sword
  2129. X    | '`' brace
  2130. X    | BACKBACK word    brace | BACKBACK word sword
  2131. X    | '(' words ')'
  2132. X    | REDIR brace
  2133. X    | WORD
  2134. X
  2135. keyword: FOR | IN | WHILE | IF | SWITCH
  2136. X    | FN | ELSE | CASE | TWIDDLE | BANG | SUBSHELL
  2137. X
  2138. words: /* empty */ | words word
  2139. X
  2140. optnl: /* empty */ | optnl '\n'
  2141. .ft R
  2142. .De
  2143. .SH FILES
  2144. .Cr $HOME/.rcrc ,
  2145. .Cr /tmp/rc* ,
  2146. .Cr /dev/null
  2147. .SH CREDITS
  2148. .I rc
  2149. was written by Byron Rakitzis, with valuable help
  2150. from Paul Haahr, Hugh Redelmeier and David Sanderson.
  2151. The design of this shell has been copied from the
  2152. .I rc
  2153. that Tom Duff wrote at Bell Labs.
  2154. .SH BUGS
  2155. On systems that support
  2156. .Cr /dev/fd ,
  2157. .Cr <{foo}
  2158. style redirection is implemented that way.
  2159. However, on other systems it is implemented with named pipes,
  2160. and it is sometimes
  2161. possible to foil
  2162. .I rc
  2163. into removing the FIFO it places in
  2164. .Cr /tmp
  2165. prematurely, or it is even possible to cause
  2166. .I rc
  2167. to hang.
  2168. .PP
  2169. The functionality of
  2170. .B shift
  2171. should be available for variables other than
  2172. .Cr "$*" .
  2173. .PP
  2174. .B echo
  2175. is built in only for performance reasons, which is a bad idea.
  2176. .PP
  2177. There should be a way to avoid exporting a variable.
  2178. .PP
  2179. The
  2180. .Cr $^var
  2181. notation for flattening should allow for using an arbitrary
  2182. separating character, not just space.
  2183. .PP
  2184. Bug reports should be mailed to
  2185. .Cr "byron@archone.tamu.edu" .
  2186. .SH INCOMPATIBILITIES
  2187. Here is a list of features which distinguish this incarnation of
  2188. .I rc
  2189. from the one described in the Bell Labs manual pages:
  2190. .PP
  2191. The treatment of 
  2192. .Cr if - else
  2193. is different in the v10
  2194. .IR rc :
  2195. that version uses an
  2196. .Cr "if not
  2197. clause which gets executed
  2198. if the preceding
  2199. .Cr if
  2200. test does not succeed.
  2201. .PP
  2202. Backquotes are slightly different in v10
  2203. .IR rc :
  2204. a backquote must always be followed by a left-brace.
  2205. This restriction is not present for single-word commands in this
  2206. .IR rc .
  2207. .PP
  2208. The following are all new with this version of
  2209. .IR rc :
  2210. The
  2211. .Cr \-n
  2212. option,
  2213. the list flattening operator,
  2214. here strings (they facilitate exporting of functions
  2215. with here documents into the environment),
  2216. the
  2217. .B return
  2218. and
  2219. .B break
  2220. keywords,
  2221. the
  2222. .B echo
  2223. builtin,
  2224. the support for the GNU
  2225. .IR readline (3)
  2226. library and
  2227. the support for the
  2228. .Cr prompt
  2229. function.
  2230. This
  2231. .I rc
  2232. also sets
  2233. .Cr $0
  2234. to the name of a function being executed/file
  2235. being sourced.
  2236. .SH "SEE ALSO"
  2237. ``rc \(em A Shell for Plan 9 and UNIX'',
  2238. Unix Research System,
  2239. 10th Edition,
  2240. vol. 2. (Saunders College Publishing)
  2241. (This paper is also distributed with this rc
  2242. in PostScript form.)
  2243. .PP
  2244. .IR history (1)
  2245. SHAR_EOF
  2246. chmod 0644 rc.1 ||
  2247. echo 'restore of rc.1 failed'
  2248. Wc_c="`wc -c < 'rc.1'`"
  2249. test 35457 -eq "$Wc_c" ||
  2250.     echo 'rc.1: original size 35457, current size' "$Wc_c"
  2251. rm -f _shar_wnt_.tmp
  2252. fi
  2253. # ============= rc.h ==============
  2254. if test -f 'rc.h' -a X"$1" != X"-c"; then
  2255.     echo 'x - skipping rc.h (File already exists)'
  2256.     rm -f _shar_wnt_.tmp
  2257. else
  2258. > _shar_wnt_.tmp
  2259. echo 'x - extracting rc.h (Text)'
  2260. sed 's/^X//' << 'SHAR_EOF' > 'rc.h' &&
  2261. #include "config.h"
  2262. #include "stddef.h"
  2263. #include "stdlib.h"
  2264. #include "string.h"
  2265. #include "unistd.h"
  2266. X
  2267. X
  2268. /* braindamaged IBM header files #define true and false */
  2269. #undef FALSE
  2270. #undef TRUE
  2271. X
  2272. enum bool { FALSE, TRUE };
  2273. X
  2274. typedef enum bool boolean;
  2275. typedef struct Rq Rq;
  2276. typedef struct Block Block;
  2277. typedef struct List List;
  2278. typedef struct Fq Fq;
  2279. X
  2280. struct List {
  2281. X    char *w;
  2282. X    char *m;
  2283. X    List *n;
  2284. };
  2285. X
  2286. #include "node.h"
  2287. X
  2288. extern char *prompt, *prompt2;
  2289. extern Rq *redirq;
  2290. extern boolean dashdee, dashee, dashvee, dashex, dashell, dasheye, dashen, interactive;
  2291. extern int rc_pid;
  2292. extern int lineno;
  2293. extern Fq *fifoq;
  2294. X
  2295. #define arraysize(a) ((int)(sizeof(a)/sizeof(*a)))
  2296. SHAR_EOF
  2297. chmod 0644 rc.h ||
  2298. echo 'restore of rc.h failed'
  2299. Wc_c="`wc -c < 'rc.h'`"
  2300. test 654 -eq "$Wc_c" ||
  2301.     echo 'rc.h: original size 654, current size' "$Wc_c"
  2302. rm -f _shar_wnt_.tmp
  2303. fi
  2304. # ============= redir.c ==============
  2305. if test -f 'redir.c' -a X"$1" != X"-c"; then
  2306.     echo 'x - skipping redir.c (File already exists)'
  2307.     rm -f _shar_wnt_.tmp
  2308. else
  2309. > _shar_wnt_.tmp
  2310. echo 'x - extracting redir.c (Text)'
  2311. sed 's/^X//' << 'SHAR_EOF' > 'redir.c' &&
  2312. /* redir.c: code for opening files and piping heredocs after fork but before exec. */
  2313. X
  2314. #include "rc.h"
  2315. #include "lex.h"
  2316. #include "glom.h"
  2317. #include "glob.h"
  2318. #include "open.h"
  2319. #include "exec.h"
  2320. #include "utils.h"
  2321. #include "redir.h"
  2322. #include "hash.h"
  2323. X
  2324. /*
  2325. X   Walk the redirection queue, and open files and dup2 to them. Also, here-documents are treated
  2326. X   here by dumping them down a pipe. (this should make here-documents fast on systems with lots
  2327. X   of memory which do pipes right. Under sh, a file is copied to /tmp, and then read out of /tmp
  2328. X   again. I'm interested in knowing how much faster, say, shar runs when unpacking when invoked
  2329. X   with rc instead of sh. On my sun4/280, it runs in about 60-75% of the time of sh for unpacking
  2330. X   the rc source distribution.)
  2331. */
  2332. X
  2333. void doredirs() {
  2334. X    List *fname;
  2335. X    int fd, p[2];
  2336. X    Rq *r;
  2337. X
  2338. X    for (r = redirq; r != NULL; r = r->n) {
  2339. X        switch(r->r->type) {
  2340. X        default:
  2341. X            fprint(2,"%d: bad node in doredirs\n", r->r->type);
  2342. X            exit(1);
  2343. X            /* NOTREACHED */
  2344. X        case rREDIR:
  2345. X            if (r->r->u[0].i == HERESTRING) {
  2346. X                fname = flatten(glom(r->r->u[2].p)); /* fname is really a string */
  2347. X                if (fname == NULL) {
  2348. X                    close(r->r->u[1].i); /* feature? */
  2349. X                    break;
  2350. X                }
  2351. X                if (pipe(p) < 0) {
  2352. X                    uerror("pipe");
  2353. X                    exit(1);
  2354. X                }
  2355. X                switch (fork()) {
  2356. X                case -1:
  2357. X                    uerror("fork");
  2358. X                    exit(1);
  2359. X                    /* NOTREACHED */
  2360. X                case 0:    /* child writes to pipe */
  2361. X                    setsigdefaults();
  2362. X                    close(p[0]);
  2363. X                    writeall(p[1], fname->w, strlen(fname->w));
  2364. X                    exit(0);
  2365. X                    /* NOTREACHED */
  2366. X                default:
  2367. X                    close(p[1]);
  2368. X                    if (dup2(p[0], r->r->u[1].i) < 0) {
  2369. X                        uerror("dup");
  2370. SHAR_EOF
  2371. true || echo 'restore of redir.c failed'
  2372. fi
  2373. echo 'End of  part 5'
  2374. echo 'File redir.c is continued in part 6'
  2375. echo 6 > _shar_seq_.tmp
  2376. exit 0
  2377. exit 0 # Just in case...
  2378. -- 
  2379. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2380. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2381. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2382. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2383.