|
|
1.1 root 1: .so ../ADM/mac
2: .XX 18 309 "\f2Rc\fP \(em A Shell for Plan 9 and UNIX"
3: .de TP \" An indented paragraph describing some command, tagged with the command name
4: .IP "\\f(CW\\$1\\fR" 8
5: .if \\w'\\$1'-7n .br
6: ..
7: .TL
8: .I Rc " \(em A Shell for Plan 9 and UNIX
9: .AU
10: Tom Duff
11: .AI
12: .MH
13: .AB
14: .I Rc
15: is a command interpreter for Plan 9.
16: It also runs on a variety of UNIX systems,
17: including SunOS and the Tenth Edition.
18: Its spirit is very close Bourne's
19: .I /bin/sh ,
20: but its notation is less abstruse.
21: .LP
22: .I Rc
23: tries to fix a number of problems with the Bourne shell.
24: There is no macro-substitution \(em commands are not re-scanned
25: after values of variables are substituted. This eliminates the
26: need for several types of quotation, all with different semantics,
27: and as a side-effect abolishes several important Bourne-shell security holes.
28: .LP
29: It's syntax is more regular and better suited to casual use,
30: resembling
31: .I C ,
32: or maybe
33: .I awk ,
34: rather than
35: .I "Algol 68" .
36: The grammar is described using
37: .I yacc ,
38: and so can be accurately documented and understood.
39: .LP
40: The design strives for simplicity without sacrificing
41: too much facility.
42: .AE
43: .NH 1
44: Introduction
45: .LP
46: Plan 9 needs a command-programming language. As porting the
47: Bourne shell to a non-UNIX environment seemed a daunting task,
48: I chose to write a new command interpreter called
49: .I rc
50: because it runs commands.
51: Although tinkering with perfection is a dangerous business,
52: I could hardly resist trying to `improve' on Bourne's design.
53: Its most identifiable shortcoming is its macro-processor view
54: of variable substitution, as evidenced by the peculiar semantic difference between
55: .CW $*
56: and
57: .CW $@ ,
58: the three different types of quotation and the odd interpretation of
59: .CW IFS ,
60: among other things. The order and manner in which parsing, parameter assignment,
61: breaking into words and parameter substitution occur is hard to learn,
62: and has subtle effects that are often not well-understood, especially by novices.
63: .LP
64: It is remarkable that in the four most recent editions of the UNIX
65: programmer's manual the Bourne shell grammar described in the manual page
66: does not admit the command
67: .CW who|wc .
68: This is surely an oversight, but it suggests something darker:
69: nobody really knows what the Bourne shell's grammar is. Even examination
70: of the source code is little help. The parser is implemented by recursive
71: descent, but the routines corresponding to the syntactic categories all
72: have a flag argument that subtly changes their operation depending on the
73: context.
74: .CW "LPLOG=$LPSPOOL/log/${LPDEST}.`set \`date\`;echo $1`
75: .LP
76: .I Rc 's
77: parser is implemented using
78: .I yacc ,
79: so I can say precisely what the grammar is \(em it's reproduced in the appendix.
80: Its lexical structure is harder to describe; I could not convince my users
81: to abandon some Bourne-isms that would have made lexical analysis as
82: straightforward as C's.
83: (Of course, having coerced me into muddying up the syntax, they complain
84: about its turbidity.)
85: .LP
86: .I Rc 's
87: semantics are not very different from Bourne's. It still has
88: command and pattern substitution, redirection, pipelines, conditional execution,
89: .I while
90: and
91: .I for
92: loops and almost everything else.
93: .LP
94: Syntax is another matter. The syntax of the simplest commands must be very simple.
95: I've taken it as given that the reflex cases, those situations in which the
96: commands roll off the fingertips, should be handled as Bourne did. Thus,
97: you still type
98: .P1
99: rm -fr *
100: ls|wc
101: cat *.c >c.files
102: cyntax *.c && cc -g *.c
103: .P2
104: there is a tension between on the one hand wanting a
105: very simple syntax with no punctuation for simple commands, and on the other
106: hand wanting a more complex syntax to write more complicated stuff in
107: reasonable ways. The Bourne shell is as good a compromise in this regard as
108: I've seen, but even it has a funny two-level syntax with one syntax for the
109: commands it executes (normal commands and flow of control stuff like if and
110: case) and another syntax for executing those commands (monstrosities like
111: ${foo:=`bar \`parp\``}.
112: no macros
113: security
114: C instead of Algol 68
115: yacc
116: .NH 1
117: References
118: .LP
119: .in+.5i
120: .ti-.5i
121: [1]
122: M. Beeler, W. Gosper et al,
123: \fIHakmem,\fP
124: MIT AI Lab memo #239,
125: 1973
126: .in -.5i
127: .BP
128: hi
129: .BP
130: there
131: .BP
132: there
133: .BP
134: hi
135: .BP
136: there
137: .BP
138: hi
139: .BP
140: there
141: .BP
142: there
143: .BP
144: hi
145: .BP
146: there
147: .BP
148: there
149: .BP
150: hi
151: .BP
152: there
153: .BP
154: there
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.