ASH.1
资源名称:os_source.zip [点击查看]
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:36k
源码类别:
操作系统开发
开发平台:
C/C++
- ." Copyright (c) 1991 The Regents of the University of California.
- ." All rights reserved.
- ."
- ." This code is derived from software contributed to Berkeley by
- ." Kenneth Almquist.
- ."
- ." Redistribution and use in source and binary forms, with or without
- ." modification, are permitted provided that the following conditions
- ." are met:
- ." 1. Redistributions of source code must retain the above copyright
- ." notice, this list of conditions and the following disclaimer.
- ." 2. Redistributions in binary form must reproduce the above copyright
- ." notice, this list of conditions and the following disclaimer in the
- ." documentation and/or other materials provided with the distribution.
- ." 3. All advertising materials mentioning features or use of this software
- ." must display the following acknowledgement:
- ." This product includes software developed by the University of
- ." California, Berkeley and its contributors.
- ." 4. Neither the name of the University nor the names of its contributors
- ." may be used to endorse or promote products derived from this software
- ." without specific prior written permission.
- ."
- ." THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- ." ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- ." IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ." ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- ." FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- ." DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- ." OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- ." HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- ." LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- ." OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- ." SUCH DAMAGE.
- ."
- ." @(#)sh.1 5.1 (Berkeley) 3/7/91
- ."
- .TH SH 1 "March 7, 1991"
- .UC 7
- .de h " subheading
- .sp
- .ti -0.3i
- .B "\$1"
- .PP
- ..
- .de d " begin display
- .sp
- .in +4
- .nf
- ..
- .de e " end display
- .in -4
- .fi
- .sp
- ..
- .de c " command, etc.
- .br
- .HP 3
- fB\$1fR
- .br
- ..
- .de b " begin builtin command
- .HP 3
- .B \$1
- ..
- .SH NAME
- ash, command, getopts, hash, jobs, local, return, setvar, unset - a shell
- .SH SYNOPSIS
- .B ash
- [
- .B -efIijnsxz
- ] [
- .B +efIijnsxz
- ] [
- .B -c
- .I command
- ] [
- .I arg
- ] ...
- .SH COPYRIGHT
- Copyright 1989 by Kenneth Almquist.
- .SH DESCRIPTION
- .I Ash
- is a version of
- .I sh
- with features similar to those of the System V shell.
- This manual page lists all the features of
- .I ash
- but concentrates on the ones not in other shells.
- .h "Invocation"
- If the
- .B -c
- options is given, then the shell executes the specified shell command.
- The
- .B -s
- flag cause the shell to read commands from the standard input (after
- executing any command specified with the
- .B -c
- option.
- If neither the
- .B -s
- or
- .B -c
- options are set, then the first
- .I arg
- is taken as the name of a file to read commands from.
- If this is impossible because there are no arguments following
- the options, then
- .I ash
- will set the
- .B -s
- flag and will read commands from the standard input.
- .PP
- The shell sets the initial value of the positional parameters from the
- .IR arg s
- remaining after any
- .I arg
- used as the name of a file of commands is deleted.
- .PP
- The flags (other than
- .BR -c )
- are set by preceding them with ``-'' and cleared by preceding them
- with ``+''; see the
- .I set
- builtin command for a list of flags.
- If no value is specified for the
- .B -i
- flag, the
- .B -s
- flag is set, and the standard input and output of the shell
- are connected to terminals, then the
- .B -i
- flag will be set.
- If no value is specified for the
- .B -j
- flag, then the
- .B -j
- flag will be set if the
- .B -i
- flag is set.
- .PP
- When the shell is invoked with the
- .B -c
- option, it is good practice to include the
- .I -i
- flag if the command was entered interactively by a user.
- For compatibility with the System V shell, the
- .I -i
- option should come after the
- .B -c
- option.
- .PP
- If the first character of argument zero to the shell is ``-'',
- the shell is assumed to be a login shell, and the files
- .B /etc/profile
- and
- .B .profile
- are read if they exist.
- If the environment variable SHINIT is set on entry to the shell,
- the commands in SHINIT are normally parsed and executed. SHINIT is
- not examined if the shell is a login shell, or if it the shell is running a
- shell procedure. (A shell is considered to be running a shell
- procedure if neither the
- .B -s
- nor the
- .B -c
- options are set.)
- .h "Control Structures"
- A
- .I list
- is a sequence of zero or more commands separated by newlines,
- semicolons, or ampersands, and optionally terminated by one of these
- three characters. (This differs from the System V shell, which
- requires a list to contain at least one command in most cases.) The
- commands in a list are executed in the order they are written.
- If command is followed by an ampersand, the shell starts the command
- and immediately proceed onto the next command; otherwise it waits
- for the command to terminate before proceeding to the next one.
- .PP
- ``&&'' and ``||'' are binary operators.
- ``&&'' executes the first command, and then executes the second command
- iff the exit status of the first command is zero. ``||'' is similar,
- but executes the second command iff the exit status of the first command
- is nonzero. ``&&'' and ``||'' both have the same priority.
- .PP
- The ``|'' operator is a binary operator which feeds the standard output
- of the first command into the standard input of the second command.
- The exit status of the ``|'' operator is the exit status of the second
- command. ``|'' has a higher priority than ``||'' or ``&&''.
- .PP
- An
- .I if
- command looks like
- .d
- fBiffR list
- fBthenfR list
- .ti -w'[ 'u
- [ fBeliffR list
- fBthenfR list ] ...
- .ti -w'[ 'u
- [ fBelsefR list ]
- fBfifR
- .e
- .PP
- A
- .I while
- command looks like
- .d
- fBwhilefR list
- fBdofR list
- fBdonefR
- .e
- The two lists are executed repeatedly while the exit status of the first
- list is zero. The
- .I until
- command is similar, but has the word
- .B until
- in place of
- .B while
- repeats until the exit status of the first list
- is zero.
- .PP
- The
- .I for
- command looks like
- .d
- fBforfR variable fBinfR word...
- fBdofR list
- fBdonefR
- .e
- The words are expanded, and then the list is executed repeatedly with
- the variable set to each word in turn.
- .B do
- and
- .B done
- may be replaced with
- ``{'' and ``}''.
- .PP
- The
- .I break
- and
- .I continue
- commands look like
- .d
- fBbreakfR [ num ]
- fBcontinuefR [ num ]
- .e
- .I Break
- terminates the
- .I num
- innermost
- .I for
- or
- .I while
- loops.
- .I Continue
- continues with the next iteration of the
- .IRnum'th
- innermost loop.
- These are implemented as builtin commands.
- .PP
- The
- .I case
- command looks like
- .d
- fBcasefR word fBinfR
- patternfB)fR list fB;;fR
- &...
- fBesacfR
- .e
- The pattern can actually be one or more patterns (see
- .I Patterns
- below), separated by ``|'' characters.
- .PP
- Commands may be grouped by writing either
- .d
- fB(fRlistfB)fR
- .e
- or
- .d
- fB{fR list; fB}fR
- .e
- The first of these executes the commands in a subshell.
- .PP
- A function definition looks like
- .d
- name fB( )fR command
- .e
- A function definition is an executable statement; when executed it installs
- a function named
- .B name
- and returns an exit status of zero.
- The command is normally a list enclosed between ``{'' and ``}''.
- .PP
- Variables may be declared to be local to a function by using a
- .I local
- command. This should appear as the first staement of a function,
- and looks like
- .d
- fBlocalfR [ variable | fB-fR ] ...
- .e
- .I Local
- is implemented as a builtin command.
- .PP
- When a variable is made local, it inherits the initial value and
- exported and readonly flags from the variable with the same name in the
- surrounding scope, if there is one. Otherwise, the variable is
- initially unset.
- .I Ash
- uses dynamic scoping, so that if you make the variable
- .B x
- local to function
- .IR f ,
- which then calls function
- .IR g ,
- references to the variable
- .B x
- made inside
- .I g
- will refer to the variable
- .B x
- declared inside
- .IR f ,
- not to the global variable named
- .BR x .
- .PP
- The only special parameter than can be made local is ``fB-fR''.
- Making ``fB-fR'' local any shell options that are changed via the
- .I set
- command inside the function to be restored to their original values
- when the function returns.
- .PP
- The
- .I return
- command looks like
- .d
- fBreturnfR [ exitstatus ]
- .e
- It terminates the currently executing function.
- .I Return
- is implemented as a builtin command.
- .h "Simple Commands"
- A simple command is a sequence of words. The execution of a simple
- command proceeds as follows. First, the leading words of the form
- ``name=value'' are stripped off and assigned to the environment of
- the command. Second, the words are expanded. Third, the first
- remaining word is taken as the command name that command is located.
- Fourth, any redirections are performed. Fifth, the command is
- executed. We look at these operations in reverse order.
- .PP
- The execution of the command varies with the type of command.
- There are three types of commands: shell functions, builtin commands,
- and normal programs.
- .PP
- When a shell function is executed, all of the shell positional parameters
- (except $0, which remains unchanged) are set to the parameters to the shell
- function. The variables which are explicitly placed in the environment
- of the command (by placing assignments to them before the function name)
- are made local to the function and are set to values given.
- Then the command given in the function definition is executed.
- The positional parameters are restored to their original values when
- the command completes.
- .PP
- Shell builtins are executed internally to the shell, without spawning
- a new process.
- .PP
- When a normal program is executed, the shell runs the program, passing
- the parameters and the environment to the program. If the program is
- a shell procedure, the shell will interpret the program in a subshell.
- The shell will reinitialize itself in this case, so that the effect
- will be as if a new shell had been invoked to handle the shell procedure,
- except that the location of commands located in the parent shell will
- be remembered by the child. If the program is a file beginning with
- ``#!'', the remainder of the first line specifies an interpreter for
- the program. The shell (or the operating system, under Berkeley UNIX)
- will run the interpreter in this case. The arguments to the interpreter
- will consist of any arguments given on the first line of the program,
- followed by the name of the program, followed by the arguments passed
- to the program.
- .h "Redirection"
- Input/output redirections can be intermixed with the words in a simple
- command and can be placed following any of the other commands. When
- redirection occurs, the shell saves the old values of the file descriptors
- and restores them when the command completes. The ``<'', ``>'', and ``>>''
- redirections open a file for input, output, and appending, respectively.
- The ``<&digit'' and ``>&digit'' makes the input or output a duplicate
- of the file descriptor numbered by the digit. If a minus sign is used
- in place of a digit, the standard input or standard output are closed.
- .PP
- The ``<< word'' redirection
- takes input from a
- .I here
- document.
- As the shell encounters ``<<'' redirections, it collects them. The
- next time it encounters an unescaped newline, it reads the documents
- in turn. The word following the ``<<'' specifies the contents of the
- line that terminates the document. If none of the quoting methods
- ('', "", or e) are used to enter the word, then the document is treated
- like a word inside double quotes: ``$'' and backquote are expanded
- and backslash can be used to escape these and to continue long lines.
- The word cannot contain any variable or command substitutions, and
- its length (after quoting) must be in the range of 1 to 79 characters.
- If ``<<-'' is used in place of ``<<'', then leading tabs are deleted
- from the lines of the document. (This is to allow you do indent shell
- procedures containing here documents in a natural fashion.)
- .PP
- Any of the preceding redirection operators may be preceded by a single
- digit specifying the file descriptor to be redirected. There cannot
- be any white space between the digit and the redirection operator.
- .h "Path Search"
- When locating a command, the shell first looks to see if it has a
- shell function by that name. Then, if PATH does not contain an
- entry for "%builtin", it looks for a builtin command by that name.
- Finally, it searches each entry in PATH in turn for the command.
- .PP
- The value of the PATH variable should be a series of entries separated
- by colons.
- Each entry consists of a directory name, or a directory name followed
- by a flag beginning with a percent sign.
- The current directory should be indicated by an empty directory name.
- .PP
- If no percent sign is present, then the entry causes the shell to
- search for the command in the specified directory. If the flag is
- ``%builtin'' then the list of shell builtin commands is searched.
- If the flag is ``%func'' then the directory is searched for a file which
- is read as input to the shell. This file should define a function
- whose name is the name of the command being searched for.
- .PP
- Command names containing a slash are simply executed without performing
- any of the above searches.
- .h "The Environment"
- The environment of a command is a set of name/value pairs. When the
- shell is invoked, it reads these names and values, sets the shell
- variables with these names to the corresponding values, and marks
- the variables as exported. The
- .I export
- command can be used to mark additional variables as exported.
- .PP
- The environment of a command is constructed by constructing name/value
- pairs from all the exported shell variables, and then modifying this
- set by the assignments which precede the command, if any.
- .h "Expansion"
- The process of evaluating words when a shell procedure is executed is
- called
- .IR expansion .
- Expansion consists of four steps: variable substitution, command
- substitution, word splitting, and file name generation. If a word
- is the expression following the word
- .B case
- in a case statement, the file name
- which follows a redirection symbol, or an assignment to the environment
- of a command, then the word cannot be split into multiple words. In
- these cases, the last two steps of the expansion process are omitted.
- .h "Variable Substitution"
- To be written.
- .h "Command Substitution"
- .I Ash
- accepts two syntaxes for command substitution:
- .d
- `fIlistfR`
- .e
- and
- .d
- $(fIlistfR)
- .e
- Either of these may be included in a word.
- During the command substitution process, the command (syntactly a
- .IR list )
- will be executed and anything that the command writes to the standard
- output will be captured by the shell. The final newline (if any) of
- the output will be deleted; the rest of the output will be substituted
- for the command in the word.
- .h "Word Splitting"
- When the value of a variable or the output of a command is substituted,
- the resulting text is subject to word splitting, unless the dollar sign
- introducing the variable or backquotes containing the text were enclosed
- in double quotes. In addition, ``$@'' is subject to a special type of
- splitting, even in the presence of double quotes.
- .PP
- Ash uses two different splitting algorithms. The normal approach, which
- is intended for splitting text separated by which space, is used if the
- first character of the shell variable IFS is a space. Otherwise an alternative
- experimental algorithm, which is useful for splitting (possibly empty)
- fields separated by a separator character, is used.
- .PP
- When performing splitting, the shell scans the replacement text looking
- for a character (when IFS does not begin with a space) or a sequence of
- characters (when IFS does begin with a space), deletes the character or
- sequence of characters, and spits the word into two strings at that
- point. When IFS begins with a space, the shell deletes either of the
- strings if they are null. As a special case, if the word containing
- the replacement text is the null string, the word is deleted.
- .PP
- The variable ``$@'' is special in two ways. First, splitting takes
- place between the positional parameters, even if the text is enclosed
- in double quotes. Second, if the word containing the replacement
- text is the null string and there are no positional parameters, then
- the word is deleted. The result of these rules is that "$@" is
- equivalent to "$1" "$2" ... "$fInfR", where fInfR is the number of
- positional parameters. (Note that this differs from the System V shell.
- The System V documentation claims that "$@" behaves this way; in fact
- on the System V shell "$@" is equivalent to "" when there are no
- positional paramteters.)
- .h "File Name Generation"
- Unless the
- .B -f
- flag is set, file name generation is performed after word splitting is
- complete. Each word is viewed as a series of patterns, separated by
- slashes. The process of expansion replaces the word with the names of
- all existing files whose names can be formed by replacing each pattern
- with a string that matches the specified pattern. There are two
- restrictions on this: first, a pattern cannot match a string containing
- a slash, and second, a pattern cannot match a string starting with a
- period unless the first character of the pattern is a period.
- .PP
- If a word fails to match any files and the
- .B -z
- flag is not set, then the word will be left unchanged (except that the
- meta-characters will be converted to normal characters). If the
- .B -z
- flag is set, then the word is only left unchanged if none
- of the patterns contain a character that can match anything besides
- itself. Otherwise the
- .B -z
- flag forces the word to be replaced with the names of the files that it
- matches, even if there are zero names.
- .h "Patterns"
- A
- .I pattern
- consists of normal characters, which match themselves, and meta-characters.
- The meta-characters are ``!'', ``*'', ``?'', and ``[''. These characters lose
- there special meanings if they are quoted. When command or variable
- substitution is performed and the dollar sign or back quotes are not
- double quoted, the value of the variable or the output of the command
- is scanned for these characters and they are turned into meta-characters.
- .PP
- Two exclamation points at the beginning of a pattern function as a ``not''
- operator, causing the pattern to match any string that the remainder of
- the pattern does
- .I not
- match. Other occurances of exclamation points in a pattern match
- exclamation points. Two exclamation points are required rather than one
- to decrease the incompatibility with the System V shell (which does not
- treat exclamation points specially).
- .PP
- An asterisk (``*'') matches any string of characters.
- A question mark matches any single character.
- A left bracket (``['') introduces a character class. The end of the
- character class is indicated by a ``]''; if the ``]'' is missing then
- the ``['' matches a ``['' rather than introducing a character class.
- A character class matches any of the characters between the square
- brackets. A range of characters may be specified using a minus sign.
- The character class may be complemented by making an exclamation point
- the first character of the character class.
- .PP
- To include a ``]'' in a character class, make it the first character listed
- (after the ``!'', if any).
- To include a minus sign, make it the first or last character listed.
- .h "The /u Directory"
- By convention, the name ``/u/user'' refers to the home directory of the
- specified user. There are good reasons why this feature should be supported
- by the file system (using a feature such as symbolic links) rather than
- by the shell, but
- .I ash
- is capable of performing this mapping if the file system doesn't.
- If the mapping is done by
- .IR ash ,
- setting the
- .B -f
- flag will turn it off.
- .h "Character Set"
- .I Ash
- silently discards nul characters. Any other character will be handled
- correctly by
- .IR ash ,
- including characters with the high order bit set.
- .h "Job Names and Job Control"
- The term
- .I job
- refers to a process created by a shell command, or in the case of a
- pipeline, to the set of processes in the pipeline. The ways to refer
- to a job are:
- .d
- %fInumberfR
- %fIstringfR
- %%
- fIprocess_idfR
- .e
- The first form identifies a job by job number.
- When a command is run,
- .I ash
- assigns it a job number
- (the lowest unused number is assigned).
- The second form identifies a job by giving a prefix of the command used
- to create the job. The prefix must be unique. If there is only one job,
- then the null prefix will identify the job, so you can refer to the job
- by writing ``%''. The third form refers to the fIcurrent jobfR. The
- current job is the last job to be stopped while it was in the foreground.
- (See the next paragraph.) The last form identifies a job by giving the
- process id of the last process in the job.
- .PP
- If the operating system that
- .I ash
- is running on supports job control,
- .I ash
- will allow you to use it.
- In this case, typing the suspend character (typically ^Z) while running
- a command will return you to
- .I ash
- and will make the suspended command the current job. You can then continue
- the job in the background by typing
- .IR bg ,
- or you can continue it in the foreground by typing
- .IR fg .
- .h "Atty"
- If the shell variable ATTY is set, and the shell variable TERM is not
- set to ``emacs'', then fIashfR generates appropriate escape sequences
- to talk to
- .IR atty (1).
- .h "Exit Statuses"
- By tradition, an exit status of zero means that a command has succeeded
- and a nonzero exit status indicates that the command failed. This is
- better than no convention at all, but in practice it is extremely useful
- to allow commands that succeed to use the exit status to return information
- to the caller. A variety of better conventions have been proposed, but
- none of them has met with universal approval. The convention used by
- fIashfR and all the programs included in the fIashfR distribution is
- as follows:
- .ta 1i 2i
- .nf
- 0 Success.
- 1 Alternate success.
- 2 Failure.
- 129-... Command terminated by a signal.
- .fi
- The fIalternate successfR return is used by commands to indicate various
- conditions which are not errors but which can, with a little imagination,
- be conceived of as less successful than plain success. For example,
- .I test
- returns 1 when the tested condition is false and
- .I getopts
- returns 1 when there are no more options.
- Because this convention is not used universally, the
- .B -e
- option of
- .I ash
- causes the shell to exit when a command returns 1 even though that
- contradicts the convention described here.
- .PP
- When a command is terminated by a signal, the uses 128 plus the signal
- number as the exit code for the command.
- .h "Builtin Commands"
- This concluding section lists the builtin commands which are builtin
- because they need to perform some operation that can't be performed by a
- separate process. In addition to these, there are several other commands
- .RI ( catf ,
- .IR echo ,
- .IR expr ,
- .IR line ,
- .IR nlecho ,
- .IR test ,
- .RI `` : '',
- and
- .IR true )
- which can optionally be compiled into the shell. The builtin
- commands described below that accept options use the System V Release 2
- .IR getopt (3)
- syntax.
- .sp
- .b bg
- [
- .I job
- ] ...
- .br
- Continue the specified jobs (or the current job if no jobs are given)
- in the background.
- This command is only available on systems with Bekeley job control.
- .b command
- .IR "command arg" ...
- .br
- Execute the specified builtin command. (This is useful when you have a
- shell function with the same name as a builtin command.)
- .b cd
- [
- .I directory
- ]
- .br
- Switch to the specified directory (default $HOME).
- If the an entry for CDPATH appears in the environment of the cd command
- or the shell variable CDPATH is set and the directory name does not
- begin with a slash, then the directories listed in CDPATH will be
- searched for the specified directory. The format of CDPATH is the
- same as that of PATH.
- In an interactive shell, the cd command will print out the name of the
- directory that it actually switched to if this is different from the
- name that the user gave. These may be different either because
- the CDPATH mechanism was used or because a symbolic link was crossed.
- ." .b ".fIh'0.1i'file"
- ." Cawf can't do h'0.1i'
- .b .
- .I file
- .br
- The commands in the specified file are read and executed by the shell.
- A path search is not done to find the file because the directories in
- PATH generally contain files that are intended to be executed, not read.
- .b eval
- .IR string ...
- .br
- The strings are parsed as shell commands and executed.
- (This differs from the System V shell, which concatenates the arguments
- (separated by spaces) and parses the result as a single command.)
- .b exec
- [
- .IR "command arg" ...
- ]
- .br
- Unless
- .I command
- is omitted,
- the shell process is replaced with the specified program (which must be a real
- program, not a shell builtin or function).
- Any redirections on the exec command are marked as permanent, so that they
- are not undone when the exec command finishes.
- If the command is not found, the exec command causes the shell to exit.
- .b exit
- [
- .I exitstatus
- ]
- .br
- Terminate the shell process. If
- .I exitstatus
- is given it is used as the
- exit status of the shell; otherwise the exit status of the preceding
- command is used.
- .b export
- .IR name ...
- .br
- The specified names are exported so that they will appear in the environment
- of subsequent commands. The only way to un-export a variable is to unset it.
- .I Ash
- allows the value of a variable to be set at the same time it is exported
- by writing
- .d
- fBexportfR name=value
- .e
- With no arguments the export command lists the names of all exported variables.
- .b fg
- [
- .I job
- ]
- .br
- Move the specified job or the current job to the foreground.
- This command is only available on systems with Bekeley job control.
- .b getopts
- .I optstring
- .I var
- .br
- The System V
- .I getopts
- command.
- .b hash
- .B -rv
- .IR command ...
- .br
- The shell maintains a hash table which remembers the locations of
- commands. With no arguments whatsoever, the hash command prints
- out the contents of this table. Entries which have not been looked
- at since the last
- .I cd
- command are marked with an asterisk; it is possible for these entries
- to be invalid.
- .sp
- With arguments, the hash command removes the specified commands from
- the hash table (unless they are functions) and then locates them.
- With the
- .B -v
- option,
- .I hash
- prints the locations of the commands as it finds them.
- The
- .B -r
- option causes the
- .I hash
- command to delete all the entries in the hash table except for
- functions.
- .b jobid
- [
- .I job
- ]
- .br
- Print the process id's of the processes in the job. If the job argument
- is omitted, use the current job.
- .b jobs
- .br
- This command lists out all the background processes which are children
- of the current shell process.
- .b pwd
- .br
- Print the current directory. The builtin command may differ from the
- program of the same name because the builtin command remembers what
- the current directory is rather than recomputing it each time. This
- makes it faster. However, if the current directory is renamed, the
- builtin version of pwd will continue to print the old name for the
- directory.
- .b read
- [
- .B -p
- .I prompt
- ]
- [
- .B -e
- ]
- .IR variable ...
- .br
- The prompt is printed if the
- .B -p
- option is specified and the standard input is a terminal. Then a
- line is read from the standard input. The trailing newline is deleted
- from the line and the line is split as described
- in the section on word splitting above, and the pieces are assigned to
- the variables in order. If there are more pieces than variables, the
- remaining pieces (along with the characters in IFS that separated them)
- are assigned to the last variable. If there are more variables than
- pieces, the remaining variables are assigned the null string.
- .sp
- The
- .B -e
- option causes any backslashes in the input to be treated specially.
- If a backslash is followed by a newline, the backslash and the newline
- will be deleted. If a backslash is followed by any other character,
- the backslash will be deleted and the following character will be treated
- as though it were not in IFS, even if it is.
- .b readonly
- .IR name ...
- .br
- The specified names are marked as read only, so that they cannot be
- subsequently modified or unset.
- .I Ash
- allows the value of a variable to be set at the same time it is marked
- read only by writing
- .d
- fBreadonlyfR name=value
- .e
- With no arguments the readonly command lists the names of all
- read only variables.
- .b set
- [
- {
- .BI - options
- |
- .BI + options
- |
- .B --
- }
- ]
- .IR arg ...
- .br
- The
- .I set
- command performs three different functions.
- .sp
- With no arguments, it lists the values of all shell variables.
- .sp
- If options are given, it sets the specified option flags, or clears
- them if the option flags are introduced with a
- .B +
- rather than a
- .BR - .
- Only the first argument to
- .I set
- can contain options.
- The possible options are:
- .sp
- .ta 0.4i
- .in +0.4i
- .ti -0.4i
- fB-efR Causes the shell to exit when a command terminates with
- a nonzero exit status, except when the exit status of the command is
- explicitly tested. The exit status of a command is considered to be
- explicitly tested if the command is used to control an
- .IR if ,
- .IR elif ,
- .IR while ,
- or
- .IR until ;
- or if the command is the left hand operand of an ``&&'' or ``||''
- operator.
- .sp
- .ti -0.4i
- fB-ffR Turn off file name generation.
- .sp
- .ti -0.4i
- fB-IfR Cause the shell to ignore end of file conditions.
- (This doesn't apply when the shell a script sourced using the ``.''
- command.) The shell will in fact exit if it gets 50 eof's in a
- row.
- .sp
- .ti -0.4i
- fB-ifR Make the shell interactive. This causes the shell to
- prompt for input, to trap interrupts, to ignore quit and terminate signals,
- and to return to the main command loop rather than exiting on error.
- .sp
- .ti -0.4i
- fB-jfR Turns on Berkeley job control, on systems that support it.
- When the shell starts up, the
- .B -j
- is set by default if the
- .B -i
- flag is set.
- .sp
- .ti -0.4i
- fB-nfR Causes the shell to read commands but not execute them.
- (This is marginally useful for checking the syntax of scripts.)
- .sp
- .ti -0.4i
- fB-sfR If this flag is set when the shell starts up, the shell
- reads commands from its standard input. The shell doesn't examine the
- value of this flag any other time.
- .sp
- .ti -0.4i
- fB-xfR If this flag is set, the shell will print out each
- command before executing it.
- .sp
- .ti -0.4i
- fB-zfR If this flag is set, the file name generation process
- may generate zero files. If it is not set, then a pattern which does
- not match any files will be replaced by a quoted version of the pattern.
- .in -0.4i
- .sp
- The third use of the set command is to set the values of the shell's
- positional parameters to the specified
- .IR args .
- To change the positional parameters without changing any options,
- use ``fB--fR'' as the first argument to
- .IR set .
- If no args are present, the set command will leave the value of the
- positional parameters unchanged, so to set the positional parameters
- to set of values that may be empty, execute the command
- .d
- shift $#
- .e
- first to clear out the old values of the positional parameters.
- .b setvar
- .I variable
- .I value
- .br
- Assigns
- .I value
- to
- .IR variable .
- (In general it is better to write
- .I variable=value
- rather than using
- .IR setvar .
- .I Setvar
- is intended to be used in functions that assign values to variables whose
- names are passed as parameters.)
- .b shift
- [
- .I n
- ]
- .br
- Shift the positional parameters
- .I n
- times.
- A shift sets the value of $1 to the value of $2, the value of $2 to
- the value of $3, and so on, decreasing the value of $# by one.
- If there are zero positional parameters, shifting doesn't do anything.
- .b trap
- [
- .I action
- ]
- .IR signal ...
- .br
- Cause the shell to parse and execute
- .I action
- when any of the specified signals are received.
- The signals are specified by signal number.
- .I Action
- may be null or omitted;
- the former causes the specified signal to be ignored and the latter
- causes the default action to be taken.
- When the shell forks off a subshell, it resets trapped (but not ignored)
- signals to the default action.
- The trap command has no effect on signals that were ignored on entry
- to the shell.
- .b umask
- [
- .I mask
- ]
- .br
- Set the value of umask (see
- .IR umask (2))
- to the specified octal value. If the argument is omitted, the umask
- value is printed.
- .b unset
- .IR name ...
- .br
- The specified variables and functions are unset and unexported.
- If a given name corresponds to both a variable and a function, both the
- variable and the function are unset.
- .b wait
- [
- .I job
- ]
- .br
- Wait for the specified job to complete and return the exit status of the
- last process in the job. If the argument is omitted, wait for all jobs
- to complete and the return an exit status of zero.
- .SH EXAMPLES
- The following function redefines the fIcdfR command:
- .d
- cd() {
- if command cd "$@"
- then if test -f .enter
- then . .enter
- else return 0
- fi
- fi
- }
- .e
- This function causes the file ``.enter'' to be read when you enter a
- directory, if it exists. The fIcommandfR command is used to access the
- real fIcdfR command. The ``return 0'' ensures that the function will
- return an exit status of zero if it successfully changes to a directory
- that does not contain a ``.enter'' file. Redefining existing commands
- is not always a good idea, but this example shows that you can do it if
- you want to.
- .PP
- The suspend function distributed with
- .I ash
- looks like
- .d
- # Copyright (C) 1989 by Kenneth Almquist. All rights reserved.
- # This file is part of ash, which is distributed under the terms
- # specified by the Ash General Public License.
- suspend() {
- local -
- set +j
- kill -TSTP 0
- }
- .e
- This turns off job control and then sends a stop signal to the current
- process group, which suspends the shell. (When job control is turned
- on, the shell ignores the TSTP signal.) Job control will be turned back
- on when the function returns because ``-'' is local to the function.
- As an example of what fInotfR to do, consider an earlier version of
- fIsuspendfR:
- .d
- suspend() {
- suspend_flag=$-
- set +j
- kill -TSTP 0
- set -$suspend_flag
- }
- .e
- There are two problems with this. First, fBsuspend_flagfR is a global
- variable rather than a local one, which will cause problems in the
- (unlikely) circumstance that the user is using that variable for some
- other purpose. Second, consider what happens if shell received an interrupt
- signal after it executes the first fIsetfR command but before it executes
- the second one. The interrupt signal will abort the shell function, so
- that the second fIsetfR command will never be executed and job control
- will be left off. The first version of fIsuspendfR avoids this problem
- by turning job control off only in a local copy of the shell options. The
- local copy of the shell options is discarded when the function is terminated,
- no matter how it is terminated.
- .SH HINTS
- Shell variables can be used to provide abbreviations for things which
- you type frequently. For example, I set
- .br
- ." h'1i'export h=$HOME
- ." Cawf can't do h'1i'
- .in +1i
- export h=$HOME
- .in -1i
- .br
- in my .profile so that I can type the name of my home directory simply
- by typing ``$h''.
- .PP
- When writing shell procedures, try not to make assumptions about what is
- imported from the environment. Explicitly unset or initialize all variables,
- rather than assuming they will be unset. If you use cd, it is a good idea
- to unset CDPATH.
- .PP
- People sometimes use ``<&-'' or ``>&-'' to provide no input to a command
- or to discard the output of a command. A better way to do this is
- to redirect the input or output of the command to
- .BR /dev/null .
- .PP
- Word splitting and file name generation are performed by default,
- and you have to explicitly use double quotes to suppress it. This is
- backwards, but you can learn to live with it. Just get in the habit of
- writing double quotes around variable and command substitutions, and
- omit them only when you really want word splitting and file name generation.
- If you want word splitting but not file name generation, use the
- .B -f
- option.
- .SH AUTHORS
- Kenneth Almquist
- .SH "SEE ALSO"
- echo(1), expr(1), line(1), pwd(1), true(1).
- .SH BUGS
- When command substitution occurs inside a here document, the commands inside
- the here document are run with their standard input closed. For example,
- the following will not word because the standard input of the
- .I line
- command will be closed when the command is run:
- .d
- cat <<-!
- Line 1: $(line)
- Line 2: $(line)
- !
- .e
- .PP
- Unsetting a function which is currently being executed may cause strange
- behavior.
- .PP
- The shell syntax allows a here document to be terminated by an end of file
- as well as by a line containing the terminator word which follows the ``<<''.
- What this means is that if you mistype the terminator line, the shell
- will silently swallow up the rest of your shell script and stick it
- in the here document.