From sources-request@genrad.UUCP Mon Jun 10 07:13:31 1985 Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site seismo.UUCP Posting-Version: version B 2.10.2 9/3/84; site genrad.UUCP Path: seismo!cbosgd!ulysses!allegra!mit-eddie!genrad!sources-request From: sources-request@genrad.UUCP Newsgroups: mod.sources Subject: Bourne shell history + tilde + job control + more (Part 4 of 9) Message-ID: <882@genrad.UUCP> Date: 10 Jun 85 11:13:31 GMT Date-Received: 10 Jun 85 23:53:28 GMT Sender: john@genrad.UUCP Lines: 1861 Approved: john@genrad.UUCP From: Arnold Robbins This is part 4 of 9. It contains the diffs for the BSD Bourne shell's man page, sh.1. Arnold Robbins arnold@gatech.{UUCP, CSNET} ------------------- tear here -------------------- *** ../orig.u/sh.1 Wed May 15 17:25:17 1985 --- sh.1 Wed Jun 5 11:10:39 1985 *************** *** 1,4 ! .TH SH 1 "7 February 1983" .SH NAME sh, for, case, if, while, \fB:\fP, \fB.\fP, break, continue, cd, eval, exec, exit, export, login, read, readonly, set, shift, times, trap, umask, wait \- command language .SH SYNOPSIS --- 1,4 ----- ! .TH SH 1 "BRL + GT Modifications" .SH NAME sh \- shell, the standard command programming language .SH SYNOPSIS *************** *** 1,6 .TH SH 1 "7 February 1983" .SH NAME ! sh, for, case, if, while, \fB:\fP, \fB.\fP, break, continue, cd, eval, exec, exit, export, login, read, readonly, set, shift, times, trap, umask, wait \- command language .SH SYNOPSIS .B sh [ --- 1,6 ----- .TH SH 1 "BRL + GT Modifications" .SH NAME ! sh \- shell, the standard command programming language .SH SYNOPSIS .B sh [ *************** *** 4,10 .SH SYNOPSIS .B sh [ ! .B \-ceiknrstuvx ] [ arg ] ... .ds OK [\| .ds CK \|] --- 4,10 ----- .SH SYNOPSIS .B sh [ ! .B \-ceiknrqstuvxEHIJ ] [ arg ] ... .ds OK [\| .ds CK \|] *************** *** 16,22 .I Sh is a command programming language that executes commands read from a terminal or a file. See ! .B invocation for the meaning of arguments to the shell. .PP .B Commands. --- 16,23 ----- .I Sh is a command programming language that executes commands read from a terminal or a file. See ! .I Invocation ! below for the meaning of arguments to the shell. .SS Commands. A *************** *** 18,26 or a file. See .B invocation for the meaning of arguments to the shell. ! .PP ! .B Commands. ! .br A .I simple-command is a sequence of non blank --- 19,25 ----- .I Invocation below for the meaning of arguments to the shell. ! .SS Commands. A .I simple-command is a sequence of non blank *************** *** 37,43 The .I value of a simple-command is its exit status ! if it terminates normally or 200+\fIstatus\fP if it terminates abnormally (see .IR sigvec (2) for a list of status values). .LP --- 36,42 ----- The .I value of a simple-command is its exit status ! if it terminates normally or (octal) 200+\fIstatus\fP if it terminates abnormally (see .IR sigvec (2) for a list of status values). .PP *************** *** 40,46 if it terminates normally or 200+\fIstatus\fP if it terminates abnormally (see .IR sigvec (2) for a list of status values). ! .LP A .I pipeline is a sequence of one or more --- 39,45 ----- if it terminates normally or (octal) 200+\fIstatus\fP if it terminates abnormally (see .IR sigvec (2) for a list of status values). ! .PP A .I pipeline is a sequence of one or more *************** *** 46,52 is a sequence of one or more .I commands separated by ! .B \(or. The standard output of each command but the last is connected by a .IR pipe (2) to the standard input of the next command. --- 45,52 ----- is a sequence of one or more .I commands separated by ! .B \(or ! (or, for historical compatibility, by \fB^\fP). The standard output of each command but the last is connected by a .IR pipe (2) to the standard input of the next command. *************** *** 52,58 to the standard input of the next command. Each command is run as a separate process; the shell waits for the last command to terminate. ! .LP A .I list is a sequence of one or more --- 52,58 ----- to the standard input of the next command. Each command is run as a separate process; the shell waits for the last command to terminate. ! .PP A .I list is a sequence of one or more *************** *** 60,66 separated by .BR ; , .BR & , ! .B && or .B \(or\|\(or and optionally terminated by --- 60,66 ----- separated by .BR ; , .BR & , ! .B && , or .B \(or\|\(or and optionally terminated by *************** *** 67,72 .B ; or .BR & . .B ; and .B & --- 67,73 ----- .B ; or .BR & . + Of these four symbols, .B ; and .B & *************** *** 90,96 returns a zero (non zero) value. Newlines may appear in a .I list, instead of semicolons, to delimit commands. ! .LP A .I command is either a simple-command or one of the following. --- 91,97 ----- returns a zero (non zero) value. Newlines may appear in a .I list, instead of semicolons, to delimit commands. ! .PP A .I command is either a simple-command or one of the following. *************** *** 143,148 .B else .I list is executed. .TP \fBwhile \fIlist\fR \*(OK\fBdo \fIlist\fR\*(CK \fBdone\fR A --- 144,158 ----- .B else .I list is executed. + If no + .B else + .I list + or + .B then + .I list + is executed, then the + .B if + command returns a zero exit status. .TP \fBwhile \fIlist\fR \*(OK\fBdo \fIlist\fR\*(CK \fBdone\fR A *************** *** 171,177 .BI { " list " } .I list is simply executed. ! .LP The following words are only recognized as the first word of a command and when not quoted. .IP --- 181,187 ----- .BI { " list " } .I list is simply executed. ! .PP The following words are only recognized as the first word of a command and when not quoted. .IP *************** *** 177,185 .IP .B if then else elif fi case in esac for while until do done { } ! .PP ! .B Command substitution. ! .br The standard output from a command enclosed in a pair of back quotes .RB ( \`\|\` ) may be used as part or all of a word; trailing newlines are removed. --- 187,198 ----- .IP .B if then else elif fi case in esac for while until do done { } ! .SS Comments ! A word beginning with ! .B # ! causes that word and all the following characters up to a new-line ! to be ignored. ! .SS Command substitution. The standard output from a command enclosed in a pair of back quotes .RB ( \`\|\` ) may be used as part or all of a word; trailing newlines are removed. *************** *** 183,191 The standard output from a command enclosed in a pair of back quotes .RB ( \`\|\` ) may be used as part or all of a word; trailing newlines are removed. ! .PP ! .B Parameter substitution. ! .br The character .B $ is used to introduce substitutable parameters. --- 196,202 ----- The standard output from a command enclosed in a pair of back quotes .RB ( \`\|\` ) may be used as part or all of a word; trailing newlines are removed. ! .SS Parameter substitution. The character .B $ is used to introduce substitutable parameters. *************** *** 194,200 Variables may be set by writing .IP .IB name = value ! [ .IB name = value ] ... .TP --- 205,211 ----- Variables may be set by writing .IP .IB name = value ! \*(OK .IB name = value \*(CK ... .PP *************** *** 196,202 .IB name = value [ .IB name = value ! ] ... .TP $\fB\|{\fIparameter\fB\|}\fR A --- 207,216 ----- .IB name = value \*(OK .IB name = value ! \*(CK ... ! .PP ! Pattern matching is not performed on ! .IR value . .TP $\fB\|{\fIparameter\fB\|}\fR A *************** *** 205,211 .IR name ), a digit, or any of the characters .B ! * @ # ? \- $ !\|. The value, if any, of the parameter is substituted. The braces are required only when .I parameter --- 219,225 ----- .IR name ), a digit, or any of the characters .B ! * @ # ? \- $ + !\|. The value, if any, of the parameter is substituted. The braces are required only when .I parameter *************** *** 210,216 The braces are required only when .I parameter is followed by a letter, digit, or underscore ! that is not to be interpreted as part of its name. If .I parameter is a digit, it is a positional parameter. If .I parameter --- 224,234 ----- The braces are required only when .I parameter is followed by a letter, digit, or underscore ! that is not to be interpreted as part of its name. ! A ! .I name ! must begin with a letter or underscore. ! If .I parameter is a digit, it is a positional parameter. If .I parameter *************** *** 253,259 is set, substitute .I word; otherwise substitute nothing. ! .LP In the above .I word is not evaluated unless it is to be used as the substituted string. --- 271,277 ----- is set, substitute .I word; otherwise substitute nothing. ! .PP In the above .I word is not evaluated unless it is to be used as the substituted string. *************** *** 282,287 .B $ The process number of this shell. .TP .B ! The process number of the last background command invoked. .PD --- 300,317 ----- .B $ The process number of this shell. .TP + .B + + The process number of the partent of this shell. In particular, + the value of + .B $+ + will track the value of the + .IR getppid (2) + system call. I.e. if + .I init + should inherit this shell, + .B $+ + will become 1. + .TP .B ! The process number of the last background command invoked. .PD *************** *** 286,292 The process number of the last background command invoked. .PD .RE ! .LP The following .I parameters are used but not set by the shell. --- 316,322 ----- The process number of the last background command invoked. .PD .RE ! .PP The following .I parameters are used but not set by the shell. *************** *** 302,308 .B .SM PATH The search path for commands (see ! .BR execution ). .TP .B .SM MAIL --- 332,339 ----- .B .SM PATH The search path for commands (see ! .I Execution ! below). .TP .B .SM MAIL *************** *** 325,330 .BR tab , and .BR newline . .PD .RE .PP --- 356,366 ----- .BR tab , and .BR newline . + .TP + .B HISTFILE + The file where command history is saved across login sessions. + The default value is + .BR $HOME/.history . .PD .RE .SS Tilde Substitution *************** *** 327,332 .BR newline . .PD .RE .PP .B Blank interpretation. .br --- 363,375 ----- .BR $HOME/.history . .PD .RE + .SS Tilde Substitution + An unquoted tilde character + .RB ( ~ ) + will cause the shell to attempt a tilde substituion. Tilde substitutions + are used to automatically determine home directories. Both the current + user's home directory, and the home directory of any other user on + the system may be found. .PP A .B ~ *************** *** 328,336 .PD .RE .PP ! .B Blank interpretation. ! .br ! After parameter and command substitution, any results of substitution are scanned for internal field separator characters (those found in .SM --- 371,588 ----- user's home directory, and the home directory of any other user on the system may be found. .PP ! A ! .B ~ ! by itself is equivalent to using ! .BR \s-1$HOME\s+1 . ! E.g. ! .B ~/bin ! is the same as saying ! .BR \s-1$HOME\s+1/bin . ! The notation ! .B ~person ! will cause the shell to look up ! .BR person 's ! home directory in the ! .B /etc/passwd ! file, and substitute it in. For example, if user ! .BR arnold 's ! home directory is ! .BR /user/arnold , ! the shell would replace ! .BR ~arnold/bin ! with ! .BR /user/arnold/bin . ! .PP ! Tilde substitutions are recognized at the beginning of words, after ! equal signs (for shell variable assignment), in the middle of single letter ! flag arguments to commands (e.g. \fBecho \-t~arnold\fP), and after ! colons inside the ! .B ! .SM PATH ! shell parameter. ! .PP ! If ! .B /etc/passwd ! cannot be read, or if ! no user can be found to match the attempted tilde substitution, ! the text is left unmodified. ! .SS History Substitution ! When reading input from an interactive terminal, a ! .RB `` ! '' ! character, anywhere on the line, ! signals the shell that it should attempt ! to perform a history substitution. ! A history substitution is a shorthand method which allows the user ! to recall all or part of a previous command, possibly editing the ! recalled portion. ! The recalled (and possibly changed) command line is then placed into ! the current command line, ! to be passed on to the rest of the shell for normal processing. ! A history substitution takes the form: ! .PP ! .if t .RS ! \fB!\fP\^[ \fIstr\fP | \fB?\fIstr\fB?\fR | \fInum\fP ]\c ! [ \fB\(ga\fInum\fR [ \- [ \fInum\fP ] ]\c ! { \fB^\fIstr\fB^\fIstr\fB^\fR [\fBg\fP] } ! .if t .RE ! .PP ! A history substitution contains three parts; ! command selection, argument selection, and editing. ! .I Command selection ! chooses what command will be retrieved from the stored ! history. ! .I Argument selection ! chooses which arguments from that command will be extracted. ! .I Editing ! allows the user to change spelling or make a substitution. ! .PP ! The history substitution is triggered by the ! .RB `` ! '', ! and continues until another ! .RB `` ! '' ! is encountered, or until ! something that could not be part of a history substitution is seen. ! This is so that the ! history substitution will be properly concatenated with the following text. ! Whenever a history substitution is encountered and properly performed, ! the shell echoes the resulting line to the terminal and then executes the ! command. ! .PP ! History substitution occurs inside double quotes and grave accents, but will ! not occur inside single quotes. To get a literal ! .RB `` ! '' ! character, outside of single quotes, precede it with a ! .BR \e . ! The ! .BR ? , ! .BR \(ga , ! and ! .B ^ ! characters are treated specially by the history mechanism only when preceded ! by a ! .RB `` ! '', ! otherwise they have their normal meaning ! of ``match a single character'', ! ``enclose a command substitution'', ! and as a synonym for the \fB\(bv\fP ! character. ! .PP ! The full meaning of the history syntax is as follows: ! .RS ! .TP ! \fB!\fP\^[ \fIstr\fP | \fB?\fIstr\fB?\fR | \fInum\fP ] ! The first thing in a history substitution is ! .IR "command selection" . ! This is used to retrieve a given command line for use, or for further ! processing. In a history command selection, \fB!\fIstr\fR ! will find the most recent command line that started with the ! characters in ! .IR str . ! \fB!?\fIstr\fB?\fR will find the most recent command line that contained ! .I str ! anywhere on the line. It also allows ! .I str ! to contain blanks and tabs, whereas the first form does not. ! \fB!\fInum\fR allows the user to specify the number of a command, according ! to the output of the ! .B history ! command (see the section on special commands, below). ! .TP ! \fB\(ga\fInum\fR [ \- [ \fInum\fP ] ! The next portion of a history substitution is an optional ! .IR "argument selection" . ! This chooses which portions of the command are to be kept. ! History arguments are not exactly the same as the arguments the rest of ! the shell uses, since history expansion occurs before argument collection. ! Arguments in this context are blank or tab separated words on the command line. ! Single or double quoted strings, strings inside grave accents, shell regular ! expressions, commands in parentheses (which get executed in a subshell), ! and commands enclosed in braces, ! are all treated as single arguments for the history mechanism, even though ! they may have white space in them. ! .sp ! Arguments are numbered from zero, starting at the leftmost portion of the ! line. In an argument selection, \fB\(ga\fInum\fR specifies that only argument ! .I num ! is to be extracted and kept for further processing or use, and the rest ! of the command line is to be dropped. ! \fB\(ga\fInum\fB\-\fInum\fR ! specifies that the arguments from the first ! .I num ! to the last ! .I num ! are to be kept. In place of any ! .IR num , ! .B $ ! may be specified to obtain the last argument on the line. ! The form \fB\(ga\-\fInum\fR is a shorthand for \fB\(ga\fP1\fB\-\fInum\fR ! and ! \fB\(ga\fInum\fB\-\fR ! is a short form for ! \fB\(ga\fInum\fB\-$\fR. ! Finally, the notation ! \fB\(ga\-\fP ! indicates all the arguments. That is, \fB\(ga\-\fP implies ! \fB\(ga1\-$\fP. ! .TP ! \fB^\fIstr\fB^\fIstr\fB^\fR [\fBg\fP] ! The last portion of a history substitution is also optional, and is the ! .I editing ! phase. This allows the remaining portions of the retrieved ! command line to modified, like the substitute command in ! .IR ed (1), ! although in a much more limited fashion. ! In the history mechanism, ! .I str ! is not a regular expression, as in ! .IR ed, ! but just a simple string. ! The history mechanism does not recognize ! either the shell's pattern matching characters or the editor's ! regular expression characters. ! Each substitution happens only once on a line, unless a trailing ``g'' ! is appended to the substitution. In this case, the substitution occurs ! globally (everywhere) on the line. ! Substitutions may be strung together, ! so that more than one can be done at once. ! The trailing ``g'' may be in either upper or lower case. ! .RE ! .PP ! Some examples of history substitution are given below. ! Should a history substitution fail, the errant command will ! .I not ! be added to the history buffers. ! .PP ! The history mechanism recognizes lines that end with unbalanced quotes. ! When the quotes are balanced on the next line(s), ! It will join this line with the one that opened the quotes, keeping the ! embedded newline(s). So, e.g., ! .RS ! .sp ! .nf ! .RB "$ " "echo 'open" ! .RB "> " "close'" ! .fi ! .RE ! .sp ! will be saved as one history ``event.'' ! This does ! .I not ! extend to other shell constructs, like balancing parentheses across ! newlines. ! .PP ! The history mechanism keeps a maximum of ! 256 ! stored commands at any one time, and the total text of the ! stored history may occupy no more than ! 4096 ! characters. ! Experience indicates that it is not necessary to store more than this, ! and the extra history buffers should not make the shell too large for ! machines with small address spaces (e.g. PDP-11's). ! .SS Blank Interpretation ! After history, tilde, parameter and command substitution, any results of substitution are scanned for internal field separator characters (those found in .SM *************** *** 340,348 Implicit null arguments (those resulting from .I parameters that have no values) are removed. ! .PP ! .B File name generation. ! .br Following substitution, each command word is scanned for the characters .BR * , .B ? --- 592,598 ----- Implicit null arguments (those resulting from .I parameters that have no values) are removed. ! .SS File name generation. Following substitution, each command word is scanned for the characters .BR * , .B ? *************** *** 370,376 Matches any one of the characters enclosed. A pair of characters separated by .B \- ! matches any character lexically between the pair. .PD .PP .B Quoting. --- 620,636 ----- Matches any one of the characters enclosed. A pair of characters separated by .B \- ! matches any character lexically between the pair, inclusive. ! If the first character floolowing the opening ! .RB `` \*(OK '' ! is a ! .RB `` ! '' ! then any character not enclosed is matched. ! Note that when typing input from the terminal, the ! .RB `` ! '' ! should be preceded by a ! .BR \e , ! so that the shell does not attempt to perform a history substitution. .PD .SS Quoting. The following characters have a special meaning to the shell *************** *** 372,380 .B \- matches any character lexically between the pair. .PD ! .PP ! .B Quoting. ! .br The following characters have a special meaning to the shell and cause termination of a word unless quoted. .LP --- 632,638 ----- .BR \e , so that the shell does not attempt to perform a history substitution. .PD ! .SS Quoting. The following characters have a special meaning to the shell and cause termination of a word unless quoted. .LP *************** *** 389,395 is ignored. All characters enclosed between a pair of quote marks (\fB\'\|\'\fP), except a single quote, are quoted. Inside double quotes (\fB"\|"\fP) ! parameter and command substitution occurs and .B \\ quotes the characters --- 647,653 ----- is ignored. All characters enclosed between a pair of quote marks (\fB\'\|\'\fP), except a single quote, are quoted. Inside double quotes (\fB"\|"\fP) ! history, parameter, and command substitution occurs and .B \\ quotes the characters *************** *** 394,400 \\ quotes the characters .B ! \\ \' " and .BR $ \|. .LP --- 652,658 ----- \\ quotes the characters .B ! \\ \' " ! and .BR $ \|. .PP *************** *** 397,403 \\ \' " and .BR $ \|. ! .LP .B "$*" is equivalent to --- 655,661 ----- \\ \' " ! and .BR $ \|. ! .PP .B "$*" is equivalent to *************** *** 412,421 .SM .B "$1" "$2" ... . ! .PP ! .B Prompting. ! .br ! When used interactively, the shell prompts with the value of .SM PS1 before reading a command. --- 670,678 ----- .SM .B "$1" "$2" ... . ! .SS Prompting ! When used interactively, ! the shell prompts with the value of .SM .B PS1 before reading a command. *************** *** 417,423 .br When used interactively, the shell prompts with the value of .SM ! PS1 before reading a command. If at any time a newline is typed and further input is needed to complete a command, the secondary prompt --- 674,680 ----- When used interactively, the shell prompts with the value of .SM ! .B PS1 before reading a command. If the user is super-user and .SM *************** *** 419,425 .SM PS1 before reading a command. ! If at any time a newline is typed and further input is needed to complete a command, the secondary prompt .RB ( \s-2$PS2\s0 ) is issued. --- 676,693 ----- .SM .B PS1 before reading a command. ! If the user is super-user and ! .SM ! .B PS1 ! is not set to ! .RB `` "# \|" '' ! already, the ! .SM ! .B PS1 ! prompt is followed by ! .RB `` "# \|" '' ! as a BRL-supplied safety reminder. ! If at any time a new-line is typed and further input is needed to complete a command, the secondary prompt (i.e., the value of .BR \s-1PS2\s+1 ) *************** *** 421,427 before reading a command. If at any time a newline is typed and further input is needed to complete a command, the secondary prompt ! .RB ( \s-2$PS2\s0 ) is issued. .PP .B Input output. --- 689,696 ----- as a BRL-supplied safety reminder. If at any time a new-line is typed and further input is needed to complete a command, the secondary prompt ! (i.e., the value of ! .BR \s-1PS2\s+1 ) is issued. .PP Many people like to have the shell provide them with useful information *************** *** 424,431 .RB ( \s-2$PS2\s0 ) is issued. .PP ! .B Input output. ! .br Before a command is executed its input and output may be redirected using a special notation interpreted by the shell. The following may appear anywhere in a simple-command --- 693,752 ----- .BR \s-1PS2\s+1 ) is issued. .PP ! Many people like to have the shell provide them with useful information ! in their prompt. To accomadate this, the shell will recognize special ! sequences of characters in the value of ! .BR PS1 , ! and substitute the appropriate information for them. ! The special sequences and what they signify are: ! .RS ! .TP ! .B %e ! Place the current event number (as defined by the ! .B history ! command) into the prompt. ! If history evaluation has been turned off (via ! .BR "set -H" ), ! no number will be substituted in (i.e. the ! .B %e ! will be removed). ! .TP ! .B %h ! Place the machine's host name into the prompt. The host name is usually ! the name by which the machine is known to the outside world for electronic ! mail addressing. ! .TP ! .B %l ! Place the user's login name into the prompt. ! The login name selected is the first entry in the ! .B /etc/passwd ! file whose ! .I uid ! matches the value of the ! .IR getuid (2) ! system call. ! This will be a problem on systems where multiple users share the same ! user-id number. ! .TP ! .B %t ! Place the current time of day, in the form \s-1HH:MM\s+1 into the prompt. ! The time is on a 24 hour clock, i.e. 1:30 in the afternoon will be 13:30. ! .TP ! .BI % x ! Place the character ! .I x ! into the prompt. ! If the user wishes to put a literal ! .B % ! into the prompt, then ! .B PS1 ! should have ! .B %% ! in it. ! .RE ! .PP ! Some of these facilities are of more use than others. ! .SS Input/Output. Before a command is executed its input and output may be redirected using a special notation interpreted by the shell. The following may appear anywhere in a simple-command *************** *** 458,464 If the file exists, output is appended (by seeking to the end); otherwise the file is created. .TP ! \*(LT\*(LT\fI\|word\fP The shell input is read up to a line the same as .IR word , or end of file. --- 779,785 ----- If the file exists, output is appended (by seeking to the end); otherwise the file is created. .TP ! \*(LT\*(LT\*(OK\fB\-\fP\*(CK\fI\|word\fP The shell input is read up to a line the same as .IR word , or end of file. *************** *** 477,482 \\ $ \' and the first character of .I word. .TP \*(LT\|&\|\fIdigit\fP The standard input is duplicated from file descriptor --- 798,810 ----- \\ $ \' and the first character of .I word. + If + .B \- + is appended to \*(LT\|\*(LT, all leading tabs are stripped from + .I word + and from the document. + History substitution is turned off + while processing the document. .TP \*(LT\|&\|\fIdigit\fP The standard input is duplicated from file descriptor *************** *** 488,493 \*(LT\|&\|\- The standard input is closed. Similarly for the standard output using \*(GT\|. .PD .LP If one of the above is preceded by a digit, the --- 816,829 ----- \*(LT\|&\|\- The standard input is closed. Similarly for the standard output using \*(GT\|. + .TP + \*(LT\|\*(GTword + Use file + .I word + for standard input (file descriptor 0), + but open it for reading + .I and + writing. .PD .LP If one of the above is preceded by a digit, the *************** *** 498,504 .LP creates file descriptor 2 to be a duplicate of file descriptor 1. ! .LP If a command is followed by .B & then the default standard input for the command is the empty file --- 834,840 ----- .LP creates file descriptor 2 to be a duplicate of file descriptor 1. ! .PP If a command is followed by .B & then the default standard input for the command is the empty file *************** *** 506,514 Otherwise, the environment for the execution of a command contains the file descriptors of the invoking shell as modified by input output specifications. ! .PP ! .B Environment. ! .br The environment is a list of name-value pairs that is passed to an executed program in the same way as a normal argument list; see .IR execve (2) --- 842,848 ----- Otherwise, the environment for the execution of a command contains the file descriptors of the invoking shell as modified by input output specifications. ! .SS Environment. The environment is a list of name-value pairs that is passed to an executed program in the same way as a normal argument list; see .IR execve (2) *************** *** 531,537 plus any modifications or additions, all of which must be noted in .B export commands. ! .LP The environment for any .I simple-command may be augmented by prefixing it with one or more assignments to --- 865,871 ----- plus any modifications or additions, all of which must be noted in .B export commands. ! .PP The environment for any .I simple-command may be augmented by prefixing it with one or more assignments to *************** *** 554,562 set \-k echo a=b c .fi ! .PP ! .B Signals. ! .br The INTERRUPT and QUIT signals for an invoked command are ignored if the command is followed by .BR & ; --- 888,894 ----- set \-k echo a=b c .fi ! .SS Signals. The INTERRUPT and QUIT signals for an invoked command are ignored if the command is followed by .BR & ; *************** *** 562,571 .BR & ; otherwise signals have the values inherited by the shell from its parent. (But see also ! .BR trap. ) ! .PP ! .B Execution. ! .br Each time a command is executed the above substitutions are carried out. Except for the 'special commands' listed below a new process is created and an attempt is made to execute the command via an --- 894,904 ----- .BR & ; otherwise signals have the values inherited by the shell from its parent. (But see also ! .BR trap .) ! When job control is enabled, ! .SM SIGTSTP ! causes a foreground command to be stopped. ! .SS Execution. Each time a command is executed the above substitutions are carried out. Except for the 'special commands' listed below a new process is created and an attempt is made to execute the command via an *************** *** 570,576 Except for the 'special commands' listed below a new process is created and an attempt is made to execute the command via an .IR execve (2). ! .LP The shell parameter .B .SM $PATH --- 903,909 ----- Except for the 'special commands' listed below a new process is created and an attempt is made to execute the command via an .IR execve (2). ! .PP The shell parameter .B .SM $PATH *************** *** 586,594 file, it is assumed to be a file containing shell commands. A subshell (i.e., a separate process) is spawned to read it. A parenthesized command is also executed in a subshell. ! .PP ! .B Special commands. ! .br The following commands are executed in the shell process and except where specified no input output redirection is permitted for such commands. --- 919,925 ----- file, it is assumed to be a file containing shell commands. A subshell (i.e., a separate process) is spawned to read it. A parenthesized command is also executed in a subshell. ! .SS Special commands. The following commands are executed in the shell process and except where specified no input output redirection is permitted for such commands. *************** *** 595,600 .TP .B : No effect; the command does nothing. .PD 0 .TP .BI . \ file --- 926,932 ----- .TP .B : No effect; the command does nothing. + A zero exit code is returned. .PD 0 .TP .BI . \ file *************** *** 662,667 of subsequently-executed commands. If no arguments are given, a list of exportable names is printed. .TP \fBlogin\fR \*(OK\fIarg\fR ...\*(CK Equivalent to 'exec login arg ...'. .TP --- 994,1042 ----- of subsequently-executed commands. If no arguments are given, a list of exportable names is printed. .TP + \fBhistory\fP \*(OK \fB\-irs\fP \*(OK \fIfilename\fP \*(CK \*(CK + The \fBhistory\fP command, with no arguments, will print all the commands that + are currently saved in the shell's history buffers. As new commands are + executed, and space in the buffers runs out, old commands will be deleted. The + .B history + commands prints out the stored commands with sequence numbers. Negative + numbered commands, through command number zero, are commands that were + retrieved from the saved history file. Commands starting at one were + entered during the current login session. + If a saved command contains embedded newlines, these will be printed out + as the sequence + .BR \en , + so that individual command stay on one line. + .sp + The \fBhistory\fP command takes two optional arguments. If the first + argument is \fB\-s\fP, the shell will save its current history buffers + in the file named as the third argument. If no file is given, it will + use the value of + .BR \s-1HISTFILE\s+1 . + .sp + Similarly, if the first argument is \fB\-r\fP, the shell will reset its + history buffers from the saved history in the file given as the third argument. + Again, if no file name is given, + .B \s-1$HISTFILE\s+1 + will be used. + .sp + The command + .B history -i + will cause the shell to reinitialize its history buffers. In other words, + all the shell's saved history will be thrown away, and the shell will + start from scratch. + .sp + The \fBhistory\fP command will have absolutely no effect at all if input + is not coming from a terminal. I.e., inside shell files, the + .B history + command is effectively a null operation. + .sp + The + .B history + command will always have an exit status of 1 inside a shell file. + If input is coming from a terminal, then the exit status wil be 0 + if the command succeeds, 1 otherwise. + .TP \fBlogin\fR \*(OK\fIarg\fR ...\*(CK Equivalent to 'exec login arg ...'. .TP *************** *** 678,684 by subsequent assignment. If no arguments are given, a list of all readonly names is printed. .TP ! \fBset\fR \*(OK\fB\-eknptuvx\fR \*(OK\fIarg \fR...\*(CK\*(CK .RS .PD 0 .TP 3m --- 1053,1059 ----- by subsequent assignment. If no arguments are given, a list of all readonly names is printed. .TP ! \fBset\fR \*(OK\fB\-eknptuvxEHIJ\fR \*(OK\fIarg \fR...\*(CK\*(CK .RS .PD 0 .TP 3m *************** *** 704,709 .B \-x Print commands and their arguments as they are executed. .TP .B \- Turn off the .B \-x --- 1079,1128 ----- .B \-x Print commands and their arguments as they are executed. .TP + .B \-E + Prevents an EOT + .RI ( control-D\^ ) + from terminating an interactive shell. + Added by BRL mostly for use in + .IR .profile\^ s + to avoid accidental logout. + .TP + .B \-H + Disable history processing. If the shell is invoked with this option, + it will not bother trying to restore its saved history from the + contents of + .BR \s-1$HISTFILE\s+1 . + While this flag is in effect, the shell will not save any commands in + its history buffers. + The sequence + .B %e + in the value of + .B \s-1PS1\s+1 + will also have no effect on the generated prompt string. + If + .B set +H + is used to turn history processing back on, the shell will start saving + subsequent commands from that point on. + .TP + .B \-I + (BRL addition) + Prints a resource usage summary + (system plus user time, blocks input and output, page reclaims and faults) + for each command after it terminates. + .TP + .B \-J + (BRL addition) + Enables ``job control'' features (see below). + .TP + .B \-\- + Do not change any of the flags; useful in setting + .B $1 + to + .BR \- . + .PP + Using + .B \+ + rather than .B \- causes these flags to be turned off. .PP *************** *** 705,717 Print commands and their arguments as they are executed. .TP .B \- ! Turn off the ! .B \-x ! and ! .B \-v ! options. ! .PD ! .LP These flags can also be used upon invocation of the shell. The current set of flags may be found in .BR $\- . --- 1124,1131 ----- .B \+ rather than .B \- ! causes these flags to be turned off. ! .PP These flags can also be used upon invocation of the shell. The current set of flags may be found in .BR $\- . *************** *** 715,721 These flags can also be used upon invocation of the shell. The current set of flags may be found in .BR $\- . ! .LP Remaining arguments are positional parameters and are assigned, in order, to .SM --- 1129,1135 ----- These flags can also be used upon invocation of the shell. The current set of flags may be found in .BR $\- . ! .PP Remaining arguments are positional parameters and are assigned, in order, to .SM *************** *** 743,749 (Note that .I arg is scanned once when the trap is set and once when the trap is taken.) ! Trap commands are executed in order of signal number. If .I arg is absent, all trap(s) .I n --- 1157,1168 ----- (Note that .I arg is scanned once when the trap is set and once when the trap is taken.) ! Trap commands are executed in order of signal number. ! Any attempt to set a trap on a signal that ! was ignored on entry to the current shell ! is ineffective. ! An attempt to trap on signal 11 (memory fault) produces an error. ! If .I arg is absent, all trap(s) .I n *************** *** 778,788 is not given, all currently active child processes are waited for. The return code from this command is that of the process waited for. .PD ! .LP ! .PP ! .B Invocation. ! .br ! If the first character of argument zero is .BR \- , commands are read from .BR \s-2$HOME\s0/.\|profile , --- 1197,1207 ----- is not given, all currently active child processes are waited for. The return code from this command is that of the process waited for. .PD ! .SS Invocation ! If the shell is invoked through ! .IR execve (2) ! and the first character of argument zero ! is .BR \- , commands are initially read from .BR \s-1$HOME\s+1/.profile , *************** *** 784,791 .br If the first character of argument zero is .BR \- , ! commands are read from ! .BR \s-2$HOME\s0/.\|profile , if such a file exists. Commands are then read as described below. The following flags are interpreted by the shell when it is invoked. --- 1203,1210 ----- and the first character of argument zero is .BR \- , ! commands are initially read from ! .BR \s-1$HOME\s+1/.profile , if such a file exists. Next, whether or not the first character of argument zero was a .BR \- , *************** *** 787,793 commands are read from .BR \s-2$HOME\s0/.\|profile , if such a file exists. ! Commands are then read as described below. The following flags are interpreted by the shell when it is invoked. .PD 0 .TP 11n --- 1206,1231 ----- commands are initially read from .BR \s-1$HOME\s+1/.profile , if such a file exists. ! Next, whether or not the first character of argument zero was a ! .BR \- , ! and no matter how the shell was invoked, ! the shell will read commands from the file ! .BR \s-1$HOME\s+1/.shrc , ! if it exists. ! Then, if the shell is interactive, is not a forked subshell, ! and the ! .B \-H ! flag is not in effect, ! it will attempt to restore its saved history from ! .BR \s-1$HISTFILE\s+1 . ! Thereafter, commands are read as described below, which ! is also the case when the shell is invoked as ! .BR /bin/sh . ! If any character of argument zero past the last slash (if any) is ! .BR j , ! the ! .B \-J ! (job control) flag is automatically set. The following flags are interpreted by the shell when it is invoked. .PD 0 .TP 11n *************** *** 820,825 .B wait is interruptible). In all cases SIGQUIT is ignored by the shell. .PD .LP The remaining flags and arguments are described under the --- 1258,1279 ----- .B wait is interruptible). In all cases SIGQUIT is ignored by the shell. + .TP + .B \-r + If the + .B \-r + flag is present, the shell is a restricted shell. + .TP + .B \-q + If the + .B \-q + flag is present, the shell will do a ``quick'' startup. + This means that the shell will + .I not + read the contents of the + .B \s-1$HOME\s+1/.shrc + file. + The shell will also not try to read this file if it is a restricted shell. .PD .PP The remaining flags and arguments are described under the *************** *** 821,827 is interruptible). In all cases SIGQUIT is ignored by the shell. .PD ! .LP The remaining flags and arguments are described under the .B set command. --- 1275,1281 ----- file. The shell will also not try to read this file if it is a restricted shell. .PD ! .PP The remaining flags and arguments are described under the .B set command. *************** *** 825,830 The remaining flags and arguments are described under the .B set command. .SH FILES .RB $HOME/ . \^profile .br --- 1279,1366 ----- The remaining flags and arguments are described under the .B set command. + .SS Job Control. + Job control features are enabled by the + .B \-J + flag. + When job control is enabled, + background commands and foreground commands that have been stopped + (usually by a \s-1SIGTSTP\s0 signal generated by typing + .IR ^Z\^ ) + are placed into separate individual + .IR "process groups"\^ . + The following commands are used to manipulate these process groups: + .PP + .PD 0 + .TP + \f3jobs\fP + Display information about the controlled jobs. + The job number is given in brackets, + followed by a plus sign if it is the ``current job'', + then the process group number for the job, + then the command. + .TP + \f3fg\fP \*(OK \f2n\^\fP \*(CK + Resume the stopped foreground job in the foreground. + If the process group + .I n\^ + is not specified then the ``current job'' is resumed. + .TP + \f3bg\fP \*(OK \f2n\^\fP \*(CK + Resume the stopped foreground job in the background. + If the process group + .I n\^ + is not specified then the ``current job'' is resumed. + .TP + .B suspend + Suspend the shell process itself in the background. + The shell will complain + if it is a login shell, and will not suspend itself. + Otherwise, it does not matter whether or not job control is enabled. + .PD + .PP + With job control enabled, + there are the following additional substitutable parameters: + .PP + .PD 0 + .TP + .BR %% + If there is a ``current job'', + then this expression is replaced by + its process group number. + .TP + .BI % n\^ + If the specified job number is one of the known jobs, + then this expression is replaced by + the corresponding process group number. + .SS Saving and Restoring History + When an interactive shell starts up, if the + .B \-H + flag is not in effect, it will attempt to read the contents of + .B \s-1$HISTFILE\s+1 + into its history buffers. This allows the user to recall commands + executed during a previous login session. + When the shell exits or executes an + .B exec + (again, if + .B \-H + is not in effect), it will attempt to write its current history + buffers into + .BR \s-1$HISTFILE\s+1 , + for use in a future login session. + .PP + The + .B history + command allows the user to save the current history buffers into + a file of his or her own choosing, or to restore them from a given file. + If + .B \-H + has been set, the + .B history + command will give a warning that history processing is not + available, and will + .I not + save or restore the shell's history buffers. .SH FILES .RB $HOME/ . \^profile .br *************** *** 828,833 .SH FILES .RB $HOME/ . \^profile .br /tmp/sh* .br /dev/null --- 1364,1371 ----- .SH FILES .RB $HOME/ . \^profile .br + .RB $HOME/ . \^shrc + .br /tmp/sh* .br /dev/null *************** *** 833,838 /dev/null .SH SEE ALSO csh(1), test(1), execve(2), environ(7) --- 1371,1377 ----- /dev/null .SH SEE ALSO csh(1), + ed(1), test(1), execve(2), getppid(2), *************** *** 835,840 csh(1), test(1), execve(2), environ(7) .SH DIAGNOSTICS Errors detected by the shell, such as syntax errors cause the shell --- 1374,1380 ----- ed(1), test(1), execve(2), + getppid(2), environ(7) .SH DIAGNOSTICS Errors detected by the shell, such as syntax errors cause the shell *************** *** 849,851 process invoked by &, the shell gets mixed up about naming the input document. A garbage file /tmp/sh* is created, and the shell complains about not being able to find the file by another name. --- 1389,1505 ----- process invoked by &, the shell gets mixed up about naming the input document. A garbage file /tmp/sh* is created, and the shell complains about not being able to find the file by another name. + .SH PYRAMID SPECIFIC + .PP + On computers manufactured by the Pyramid Corporation, which support + both the University of California at Berkeley 4.2BSD version of \s-1UNIX\s+1, + and the AT&T System V version of \s-1UNIX\s+1, + the shell has several additional capabilities. + .SS Special Commands + .PP + There are three additional commands built in to the shell. They are: + .RS + .TP + \fBatt\fP \*(OK command \*(CK + Switch the current ``universe'' to be ATT System V. + If a command is specified, that command will be run in the ``att'' + universe, without affecting the shell's current universe. + The + .B \-t + option of + .B /bin/att + is not (yet) supported. + .TP + \fBucb\fP \*(OK command \*(CK + Switch the current ``universe'' to be University of California at + Berkeley 4.2BSD. + If a command is specified, that command will be run in the ``ucb'' + universe, without affecting the shell's current universe. + The + .B \-t + option of + .B /bin/ucb + is not (yet) supported. + .TP + \fBuniverse\fP \*(OK \fB\-l\fP \*(CK + Print the current universe, either ``att'' or ``ucb''. The + .B \-l + option will print a longer, more explanative name for the current universe. + .RE + .PP + If the shell cannot determine the current universe when it starts up, + it will default to + .BR ucb . + .SS Shell Variables + .PP + There is an additional pre-defined shell parameter, + .BR \s-1UNIVERSE\s+1 . + The value of + .B \s-1UNIVERSE\s+1 + .I always + tracks that of the current universe. Using it is equivalent to a + \*`universe\` command substitution, + except that a new process will not be created. + This variable cannot be set by the user (it is \fBreadonly\fP), + and any inherited value from the environment will be ignored. + .SS Special Sequences for \s-1PS1\s+1 + .PP + Finally, the sequence + .B %u + in the value of + .B \s-1PS1\s-1 + will cause the shell to subsitute in the name of the current universe, + either ``att'' or ``ucb''. + .SH HISTORY EXAMPLES + Command history provides a powerful method for easily redoing previous + commands, or for quicly fixing typing mistakes. + Here are some annotated examples. User input is in + .BR boldface . + .sp + .nf + # first, list some files + .RB "$ " lf + hello.c echo.c + # now, make a typing mistake + .RB "$ " "cat hello" + hello: No such file or directory + # fix it. The trailing ! ends the history substitution, + # in order to correctly concatenate it with the following .c + .RB "$ " "!!.c" + cat hello.c + main () { printf ("hello world\en"); } + # now look at echo.c instead + .RB "$ " "!^hello^echo" + cat echo.c + main () { printf ("echo: no arguments\en"); } + # do it again, just for fun + .RB "$ " "!" + cat echo.c + main () { printf ("echo: no arguments\en"); } + # now we'll rearrange some arguments + .RB "$ " "echo 1 2 3 4 5" + 1 2 3 4 5 + # print last argument, first and second arguments, then change 4 to four + .RB "$ " "echo !\(ga$ !\(ga1-2 !\(ga4^4^four" + echo 5 1 2 four + 5 1 2 four + # do something with all the previous arguments at once + .RB "$ " "echo the previous arguments were !\(ga\-" + echo the previous arguments were 5 1 2 four + the previous arguments were 5 1 2 four + # now do some substitutions. first get something to work with. + .RB "$ " "echo aa bb cc" + aa bb cc + # change the first 'a' to a 'b', and change all c's to d's + .RB "$ " "!^a^b^^c^d^g" + echo ba bb dd + ba bb dd + .fi + .PP + These few brief examples should provide a general feel for the + history mechanism. The quickest way to learn it is to experiment + with it for a while, using the + .B echo + command, which can do very little damage. + While it looks cryptic when being typed, it is very general and + orthogonal, and quickly becomes natural.