⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plan9.ps

📁 早期freebsd实现
💻 PS
📖 第 1 页 / 共 5 页
字号:
10 CW f($ifs)720 5354 w10 R f( Thus)1 252(is set to just a newline.)5 921 2 987 5354 t10 CW f(read)2187 5354 w10 R f( at spaces, but the terminating newline is)7 1633('s input is not split apart)5 980 2 2427 5354 t(deleted.)720 5474 w(A handler is set to catch)5 1012 1 720 5630 t10 CW f(sigint)1767 5630 w10 R f(,)2127 5630 w10 CW f(sigquit)2188 5630 w10 R f(, and)1 205 1 2608 5630 t10 CW f(sighup,)2849 5630 w10 R f(and the artificial)2 676 1 3305 5630 t10 CW f(sigexit)4017 5630 w10 R f( just)1 181(signal. It)1 386 2 4473 5630 t(removes the temporary file and exits.)5 1486 1 720 5750 t( 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(loop starts.)1 439 1 720 6026 t( \(in)1 144(First, the program guesses a location)5 1500 2 720 6182 t10 CW f($lab)2397 6182 w10 R f(\) using the)2 438 1 2637 6182 t10 CW f(fortune)3108 6182 w10 R f(program to pick a random line from)6 1479 1 3561 6182 t( 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( the)1 149(Then it uses)2 485 2 720 6458 t10 CW f(read)1381 6458 w10 R f(function to get lines from standard input and validity-check them until it gets a legal)14 3392 1 1648 6458 t( that the condition part of a)6 1118(name. Note)1 491 2 720 6578 t10 CW f(while)2360 6578 w10 R f( the exit status of the)5 855( Only)1 255( compound command.)2 901(can be a)2 338 4 2691 6578 t(last command in the sequence is checked.)6 1666 1 720 6698 t( 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 tcleartomarkshowpagesaveobj restore%%EndPage: 11 11%%Page: 12 12/saveobj save defmark12 pagesetup10 R f(- 12 -)2 216 1 2772 480 t9 CW f(t=/tmp/holmdel$pid)1008 890 w(fn read{)1 432 1 1008 1000 t($1=`{awk '{print;exit}'})1 1296 1 1440 1110 t(})1008 1220 w(ifs=')1008 1330 w( just a newline)3 810(' #)1 486 2 1008 1440 t(fn sigexit sigint sigquit sighup{)4 1782 1 1008 1550 t(rm -f $t)2 432 1 1440 1660 t(exit)1440 1770 w(})1008 1880 w(cat <<'!' >$t)2 702 1 1008 1990 t(Allentown)1008 2100 w(Atlanta)1008 2210 w(Cedar Crest)1 594 1 1008 2320 t(Chester)1008 2430 w(Columbus)1008 2540 w(Elmhurst)1008 2650 w(Fullerton)1008 2760 w(Holmdel)1008 2870 w(Indian Hill)1 594 1 1008 2980 t(Merrimack Valley)1 864 1 1008 3090 t(Morristown)1008 3200 w(Piscataway)1008 3310 w(Reading)1008 3420 w(Short Hills)1 594 1 1008 3530 t(South Plainfield)1 864 1 1008 3640 t(Summit)1008 3750 w(Whippany)1008 3860 w(West Long Branch)2 864 1 1008 3970 t(!)1008 4080 w(while\(true\){)1008 4190 w(lab=`{/usr/games/fortune $t})1 1512 1 1170 4300 t(echo $lab)1 486 1 1170 4410 t(if\(\304 $lab Holmdel\){)2 1026 1 1170 4520 t(echo You lose.)2 756 1 1332 4630 t(exit)1332 4740 w(})1170 4850 w(while\(read lab; ! grep -i -s $lab $t\) echo No such location.)11 3240 1 1170 4960 t(if\(\304 $lab [hH]olmdel\){)2 1188 1 1170 5070 t(echo You win.)2 702 1 1332 5180 t(exit)1332 5290 w(})1170 5400 w(})1008 5510 w10 B f(27. Discussion)1 626 1 720 5690 t10 R f(Steve Bourne's)1 622 1 720 5846 t10 CW f(/bin/sh)1376 5846 w10 R f( I)1 93( comparison.)1 526(is extremely well-designed; any successor is bound to suffer in)9 2591 3 1830 5846 t( things wherever possible, usually by)5 1512(have tried to fix its best-acknowledged shortcomings and to simplify)9 2808 2 720 5966 t( 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(have tinkered extensively with Bourne's syntax, that being where his work was most open to criticism.)15 4109 1 720 6206 t(The most important principle in)4 1284 1 720 6362 t10 I f(rc)2032 6362 w10 R f( 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( by the lexical and syntactic analysis code \(except, of course, by the)12 2885(than once)1 401 2 720 6482 t10 CW f(eval)4046 6482 w10 R f(command, whose)1 714 1 4326 6482 t10 I f(raison d'etre)1 519 1 720 6602 t10 R f(is to break the rule\).)4 801 1 1264 6602 t( 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(will be split into multiple arguments using)6 1780 1 720 6878 t10 CW f(IFS)2539 6878 w10 R f( In)1 146( inopportune times.)2 801(, often as)2 391 3 2719 6878 t10 I f(rc)4095 6878 w10 R f(, values of variables,)3 862 1 4178 6878 t( 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(presumably been scanned in the parent process, and ought not to be re-read.)12 3026 1 720 7118 t( 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 tcleartomarkshowpagesaveobj restore%%EndPage: 12 12%%Page: 13 13/saveobj save defmark13 pagesetup10 R f(- 13 -)2 216 1 2772 480 t( 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(type of variables, so that they can explicitly carry lists of strings.)11 2583 1 720 960 t( 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(ferent kinds of concatenation, for strings \320)6 1798 1 720 1236 t10 CW f($a\303$b)2552 1236 w10 R f(, and lists \320)3 533 1 2852 1236 t10 CW f(\($a $b\))1 429 1 3419 1236 t10 R f( difference between)2 801(. The)1 238 2 3848 1236 t10 CW f(\(\))4920 1236 w10 R f(and)720 1356 w10 CW f('')895 1356 w10 R f( 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(same as no argument.)3 865 1 720 1476 t( 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( 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(mand is, but this makes it difficult to handle nested command substitutions, like this:)13 3393 1 720 1872 t9 CW f(size=`wc -l \\`ls -t|sed 1q\\``)4 1566 1 1008 2042 t10 R f( 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(than the above example; the number of)6 1612 1 720 2342 t10 CW f(\\)2366 2342 w10 R f('s required is exponential in the nesting depth.)7 1911 1 2426 2342 t10 I f(Rc)4396 2342 w10 R f(fixes this by)2 505 1 4535 2342 t(making the backquote a unary operator whose argument is a command, like this:)12 3220 1 720 2462 t9 CW f(size=`{wc -l `{ls -t|sed 1q}})4 1566 1 1008 2632 t10 R f(No escapes are ever required, and the whole thing is parsed in one pass.)13 2862 1 720 2812 t(For similar reasons)2 772 1 720 2968 t10 I f(rc)1520 2968 w10 R f( associating a string)3 803(defines signal handlers as though they were functions, instead of)9 2606 2 1631 2968 t(with each signal, as Bourne does, with the attendant possibility of getting a syntax error message in)16 4320 1 720 3088 t( Since)1 285(response to typing the interrupt character.)5 1723 2 720 3208 t10 I f(rc)2766 3208 w10 R f(parses input when typed, it reports errors when you)8 2153 1 2887 3208 t(make them.)1 466 1 720 3328 t( 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(between)720 3604 w10 CW f($*)1080 3604 w10 R f(and)1228 3604 w10 CW f($@)1400 3604 w10 R f( 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( In)1 133(govern them.)1 527 2 720 3724 t10 I f(rc)1405 3724 w10 R f( to appear in an argu-)5 855(you use quotation marks exactly when you want a syntax character)10 2672 2 1513 3724 t(ment.)720 3844 w10 CW f(IFS)999 3844 w10 R f(is no longer used, except in the one case where it was indispensable: converting command out-)15 3833 1 1207 3844 t(put into argument lists during command substitution.)6 2121 1 720 3964 t( security hole [Ree88].)3 933(This also avoids an important)4 1211 2 720 4120 t10 I f(System)2922 4120 w10 R f(\(3\) and)1 293 1 3199 4120 t10 I f(popen)3525 4120 w10 R f(\(3\) call)1 293 1 3769 4120 t10 CW f(/bin/sh)4095 4120 w10 R f(to execute a)2 492 1 4548 4120 t( 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(will be executed, even if the caller of)7 1479 1 720 4360 t10 I f(system)2224 4360 w10 R f(or)2515 4360 w10 I f(popen)2623 4360 w10 R f( can)1 164( This)1 229( for the command.)3 735(specifies a full path name)4 1020 4 2892 4360 t( 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 t10 CW f(IFS)3657 4480 w10 R f(is used to split the command)5 1172 1 3868 4480 t(into words, so an attacker can just set)7 1534 1 720 4600 t10 CW f(IFS=/)2285 4600 w10 R f( Trojan horse named)3 844(in his environment and leave a)5 1253 2 2616 4600 t10 CW f(usr)4745 4600 w10 R f(or)4957 4600 w10 CW f(bin)720 4720 w10 R f(in the current working directory before running the privileged program.)9 2891 1 929 4720 t10 I f(Rc)3874 4720 w10 R f(fixes this by not ever res-)5 1032 1 4008 4720 t(canning input for any reason.)4 1167 1 720 4840 t(Most of the other differences between)5 1565 1 720 4996 t10 I f(rc)2320 4996 w10 R f( eliminated Bourne's)2 860( I)1 94(and the Bourne shell are not so serious.)7 1647 3 2439 4996 t(peculiar forms of variable substitution, like)5 1726 1 720 5116 t9 CW f(echo ${a=b} ${c-d} ${e?error})3 1566 1 1008 5286 t10 R f( 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 t10 CW f(export)720 5586 w10 R f(,)1080 5586 w10 CW f(readonly)1131 5586 w10 R f(,)1611 5586 w10 CW f(break)1662 5586 w10 R f(,)1962 5586 w10 CW f(continue)2013 5586 w10 R f(,)2493 5586 w10 CW f(read)2544 5586 w10 R f(,)2784 5586 w10 CW f(return)2835 5586 w10 R f(,)3195 5586 w10 CW f(set)3246 5586 w10 R f(,)3426 5586 w10 CW f(times)3477 5586 w10 R f(and)3803 5586 w10 CW f(unset)3973 5586 w10 R f(because they seem)2 742 1 4298 5586 t(redundant or only marginally useful.)4 1462 1 720 5706 t(Where Bourne's syntax draws from Algol 68,)6 1917 1 720 5862 t10 I f(rc)2677 5862 w10 R f( 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(believe that, for example)3 992 1 720 5982 t9 CW f(if\(test -f junk\) rm junk)4 1296 1 1008 6152 t10 R f(is better syntax than)3 802 1 720 6332 t9 CW f(if test -f junk; then rm junk; fi)7 1782 1 1008 6502 t10 R f( 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(the syntax characters better set off the active parts of the command.)11 2693 1 720 6802 t(The one bit of large-scale syntax that Bourne unquestionably does better than)11 3169 1 720 6958 t10 I f(rc)3922 6958 w10 R f(is the)1 222 1 4038 6958 t10 CW f(if)4293 6958 w10 R f(statement with)1 594 1 4446 6958 t10 CW f(else)720 7078 w10 R f(clause.)986 7078 w10 I f(Rc)1310 7078 w10 R f('s)1415 7078 w10 CW f(if)1512 7078 w10 R f(has no terminating)2 744 1 1657 7078 t10 CW f(fi)2426 7078 w10 R f( a result, the parser cannot tell whether or not)9 1807( As)1 161(-like bracket.)1 526 3 2546 7078 t(to expect an)2 482 1 720 7198 t10 CW f(else)1227 7198 w10 R f( problem is that after reading, for example)7 1685( The)1 205(clause without looking ahead in its input.)6 1647 3 1492 7198 tcleartomarkshowpagesaveobj restore%%EndPage: 13 13%%Page: 14 14/saveobj save defmark14 pagesetup10 R f(- 14 -)2 216 1 2772 480 t9 CW f(if\(test -f junk\) echo junk found)5 1728 1 1008 830 t10 R f(in interactive mode,)2 824 1 720 1010 t10 I f(rc)1583 1010 w10 R f(cannot decide whether to execute it immediately and print)8 2430 1 1705 1010 t10 CW f($prompt\(1\))4174 1010 w10 R f(, or to)2 266 1 4774 1010 t(print)720 1130 w10 CW f($prompt\(2\))937 1130 w10 R f(and wait for the)3 638 1 1565 1130 t10 CW f(else)2231 1130 w10 R f( the Bourne shell, this is not a problem, because)9 1930( In)1 136(to be typed.)2 475 3 2499 1130 t(the)720 1250 w10 CW f(if)867 1250 w10 R f(command must end with)3 986 1 1012 1250 t10 CW f(fi)2023 1250 w10 R f(, regardless of whether it contains an)6 1466 1 2143 1250 t10 CW f(else)3634 1250 w10 R f(or not.)1 261 1 3899 1250 t10 I f(Rc)720 1406 w10 R f( is to declare that the)5 839('s admittedly feeble solution)3 1144 2 825 1406 t10 CW f(else)2835 1406 w10 R f(clause is a separate statement, with the semantic)7 1938 1 3102 1406 t(proviso that it must immediately follow an)6 1724 1 720 1526 t10 CW f(if)2472 1526 w10 R f(, and to call it)4 559 1 2592 1526 t10 CW f(if not)1 363 1 3179 1526 t10 R f(rather than)1 432 1 3570 1526 t10 CW f(else)4030 1526 w10 R f(, as a reminder that)4 770 1 4270 1526 t( 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(construction)720 1766 w9 CW f(for\(i\){)1008 1936 w(if\(test -f $i\) echo $i found)5 1512 1 1224 2046 t(if not echo $i not found)5 1296 1 1224 2156 t(})1008 2266 w10 R f(and that)1 319 1 720 2446 t10 I f(rc)1064 2446 w10 R f(resolves the ``dangling else'' ambiguity in opposition to most people's expectations.)10 3378 1 1172 2446 t( 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( not admit the command)4 976(shell grammar described in the manual page does)7 1985 2 720 2722 t10 CW f(who|wc)3707 2722 w10 R f( is surely an over-)4 719(. This)1 254 2 4067 2722 t( 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( 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( categories all have a flag argument that subtly changes their operation)11 2885(tines corresponding to the syntactic)4 1435 2 720 3082 t(depending on the context.)3 1041 1 720 3202 t10 I f(Rc)1814 3202 w10 R f('s parser is implemented using)4 1233 1 1919 3202 t10 I f(yacc)3180 3202 w10 R f(, so I can say precisely what the grammar)8 1678 1 3362 3202 t(is.)720 3322 w( 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( distinguish between parenthe

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -