home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 May
/
W2KPRK.iso
/
apps
/
posix
/
source
/
MAN
/
SH.PRT
< prev
next >
Wrap
Text File
|
1999-11-17
|
34KB
|
661 lines
ash - a shell [ ] [ ] [ ] [ ] ... Copyright 1989 by Kenneth Alm-
quist. is a version of with features similar to those of the
System V shell. This manual page lists all the features of but
concentrates on the ones not in other shells.
If the options is given, then the shell executes the specified
shell command. The flag cause the shell to read commands from
the standard input (after executing any command specified with
the option. If neither the or options are set, then the first 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 will set the flag and will read commands from the standard
input. The shell sets the initial value of the positional param-
eters from the remaining after any used as the name of a file of
commands is deleted. The flags (other than are set by preceding
them with ``-'' and cleared by preceding them with ``+''; see the
builtin command for a list of flags. If no value is specified
for the flag, the flag is set, and the standard input and output
of the shell are connected to terminals, then the flag will be
set. If no value is specified for the flag, then the flag will
be set if the flag is set. When the shell is invoked with the
option, it is good practice to include the flag if the command
was entered interactively by a user. For compatibility with the
System V shell, the option should come after the option. If the
first character of argument zero to the shell is ``-'', the shell
is assumed to be a login shell, and the files and 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 exe-
cuted. SHINIT is not examined if the shell is a login shell, or
if it the shell is running a shell procedure. (A shell is con-
sidered to be running a shell procedure if neither the nor the
options are set.)
A 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. ``&&'' 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. 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 ``|'' opera-
tor is the exit status of the second command. ``|'' has a higher
priority than ``||'' or ``&&''. An command looks like
if list
then list
[ elif list
then list ] ...
[ else list ]
fi
A command looks like
while list
do list
done
The two lists are executed repeatedly while the exit status of
the first list is zero. The command is similar, but has the word
in place of
repeats until the exit status of the first list is zero. The
command looks like
for variable in word...
do list
done
The words are expanded, and then the list is executed repeatedly
with the variable set to each word in turn. and may be replaced
with ``{'' and ``}''. The and commands look like
break [ num ]
continue [ num ]
terminates the innermost or loops. continues with the next
iteration of the innermost loop. These are implemented as buil-
tin commands. The command looks like
case word in
pattern) list ;;
...
esac
The pattern can actually be one or more patterns (see below),
separated by ``|'' characters. Commands may be grouped by writ-
ing either
(list)
or
{ list; }
The first of these executes the commands in a subshell. A func-
tion definition looks like
name ( ) command
A function definition is an executable statement; when executed
it installs a function named and returns an exit status of zero.
The command is normally a list enclosed between ``{'' and ``}''.
Variables may be declared to be local to a function by using a
command. This should appear as the first staement of a function,
and looks like
local [ variable | - ] ...
is implemented as a builtin command. When a variable is made lo-
cal, 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 un-
set. uses dynamic scoping, so that if you make the variable lo-
cal to function which then calls function references to the vari-
able made inside will refer to the variable declared inside not
to the global variable named The only special parameter than can
be made local is ``-''. Making ``-'' local any shell options
that are changed via the command inside the function to be re-
stored to their original values when the function returns. The
command looks like
return [ exitstatus ]
It terminates the currently executing function. is implemented
as a builtin command.
A simple command is a sequence of words. The execution of a sim-
ple command proceeds as follows. First, the leading words of the
form ``name=value'' are stripped off and assigned to the environ-
ment 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 ord-
er. The execution of the command varies with the type of com-
mand. There are three types of commands: shell functions, buil-
tin commands, and normal programs. When a shell function is exe-
cuted, all of the shell positional parameters (except $0, which
remains unchanged) are set to the parameters to the shell func-
tion. The variables which are explicitly placed in the environ-
ment 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. Shell builtins are
executed internally to the shell, without spawning a new process.
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 pro-
gram. The shell (or the operating system, under Berkeley UNIX)
will run the interpreter in this case. The arguments to the in-
terpreter 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.
Input/output redirections can be intermixed with the words in a
simple command and can be placed following any of the other com-
mands. When redirection occurs, the shell saves the old values
of the file descriptors and restores them when the command com-
pletes. 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. The ``<< word'' redirection takes input from a 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 \) 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 es-
cape 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.) Any
of the preceding redirection operators may be preceded by a sin-
gle digit specifying the file descriptor to be redirected. There
cannot be any white space between the digit and the redirection
operator.
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. 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. 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. Command names containing a
slash are simply executed without performing any of the above
searches.
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 command can be used to mark
additional variables as exported. The environment of a command
is constructed by constructing name/value pairs from all the ex-
ported shell variables, and then modifying this set by the as-
signments which precede the command, if any.
The process of evaluating words when a shell procedure is execut-
ed is called Expansion consists of four steps: variable substi-
tution, command substitution, word splitting, and file name gen-
eration. If a word is the expression following the word 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.
To be written.
accepts two syntaxes for command substitution: `list`
and $(list)
Either of these may be included in a word. During the command
substitution process, the command (syntactly a 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 out-
put will be deleted; the rest of the output will be substituted
for the command in the word.
When the value of a variable or the output of a command is sub-
stituted, 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. 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 vari-
able IFS is a space. Otherwise an alternative experimental algo-
rithm, which is useful for splitting (possibly empty) fields
separated by a separator character, is used. 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 char-
acter 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. 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" ... "$n", where n is the number of positional parame-
ters. (Note that this differs from the System V shell. The Sys-
tem V documentation claims that "$@" behaves this way; in fact on
the System V shell "$@" is equivalent to "" when there are no po-
sitional paramteters.)
Unless the 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 re-
places 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. If
a word fails to match any files and the flag is not set, then the
word will be left unchanged (except that the meta-characters will
be converted to normal characters). If the 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
flag forces the word to be replaced with the names of the files
that it matches, even if there are zero names.
A 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. 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 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). An asterisk (``*'') matches any
string of characters. A question mark matches any single charac-
ter. 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 charac-
ters between the square brackets. A range of characters may be
specified using a minus sign. The character class may be comple-
mented by making an exclamation point the first character of the
character class. To include a ``]'' in a character class, make
it the first character listed (after the ``!'', if any). To in-
clude a minus sign, make it the first or last character listed.
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 is capable of per-
forming this mapping if the file system doesn't. If the mapping
is done by setting the flag will turn it off.
silently discards nul characters. Any other character will be
handled correctly by including characters with the high order bit
set.
The term 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: %number %string %% process_id
The first form identifies a job by job number. When a command is
run, assigns it a job number (the lowest unused number is as-
signed). 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 current job. 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. If the operating system that
is running on supports job control, will allow you to use it. In
this case, typing the suspend character (typically ^Z) while run-
ning a command will return you to and will make the suspended
command the current job. You can then continue the job in the
background by typing or you can continue it in the foreground by
typing
If the shell variable ATTY is set, and the shell variable TERM is
not set to ``emacs'', then ash generates appropriate escape se-
quences to talk to
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 prac-
tice 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 ash and all
the programs included in the ash distribution is as follows:
0 Success.
1 Alternate success.
2 Failure.
129-... Command terminated by a signal.
The alternate success 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, returns 1 when the tested condition is
false and returns 1 when there are no more options. Because this
convention is not used universally, the option of causes the
shell to exit when a command returns 1 even though that contrad-
icts the convention described here. When a command is terminated
by a signal, the uses 128 plus the signal number as the exit code
for the command.
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 and which can optionally be compiled into
the shell. The builtin commands described below that accept op-
tions use the System V Release 2 syntax.
[ ] ...
Continue the specified jobs (or the current job if no jobs are
given) in the background. This command is only available on sys-
tems with Bekeley job control.
Execute the specified builtin command. (This is useful when you
have a shell function with the same name as a builtin command.) [
]
Switch to the specified directory (default $HOME). If the an en-
try 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 com-
mand 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.
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.
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.)
[ ]
Unless is omitted, the shell process is replaced with the speci-
fied 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 fin-
ishes. If the command is not found, the exec command causes the
shell to exit. [ ]
Terminate the shell process. If is given it is used as the exit
status of the shell; otherwise the exit status of the preceding
command is used.
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. allows the value of a variable to be
set at the same time it is exported by writing
export name=value
With no arguments the export command lists the names of all ex-
ported variables. [ ]
Move the specified job or the current job to the foreground.
This command is only available on systems with Bekeley job con-
trol.
The System V command.
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 command are marked with an asterisk; it
is possible for these entries to be invalid.
With arguments, the hash command removes the specified commands
from the hash table (unless they are functions) and then locates
them. With the option, prints the locations of the commands as
it finds them. The option causes the command to delete all the
entries in the hash table except for functions. [ ]
Print the process id's of the processes in the job. If the job
argument is omitted, use the current job.
This command lists out all the background processes which are
children of the current shell process. [ ]
The function name is defined to execute the last command entered.
If the function name is omitted, the last command executed is ex-
ecuted again. This command only works if the flag is set.
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. [ ] [ ]
The prompt is printed if the option is specified and the standard
input is a terminal. Then a line is read from the standard in-
put. 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.
The option causes any backslashes in the input to be treated spe-
cially. 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 fol-
lowing character will be treated as though it were not in IFS,
even if it is.
The specified names are marked as read only, so that they cannot
be subsequently modified or unset. allows the value of a vari-
able to be set at the same time it is marked read only by writing
readonly name=value
With no arguments the readonly command lists the names of all
read only variables. [ { | | } ]
The command performs three different functions.
With no arguments, it lists the values of all shell variables.
If options are given, it sets the specified option flags, or
clears them if the option flags are introduced with a rather than
a Only the first argument to can contain options. The possible
options are:
-e Causes the shell to exit when a command terminates with a
nonzero exit status, except when the exit status of the com-
mand is explicitly tested. The exit status of a command is
considered to be explicitly tested if the command is used to
control an or or if the command is the left hand operand of
an ``&&'' or ``||'' operator.
-f Turn off file name generation.
-I 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.
-i 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.
-j Turns on Berkeley job control, on systems that support it.
When the shell starts up, the is set by default if the flag
is set.
-n Causes the shell to read commands but not execute them.
(This is marginally useful for checking the syntax of
scripts.)
-s 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.
-x If this flag is set, the shell will print out each command
before executing it.
-z 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.
The third use of the set command is to set the values of the
shell's positional parameters to the specified To change the po-
sitional parameters without changing any options, use ``--'' as
the first argument to 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
shift $#
first to clear out the old values of the positional parameters.
Assigns to (In general it is better to write rather than using is
intended to be used in functions that assign values to variables
whose names are passed as parameters.) [ ]
Shift the positional parameters 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 posi-
tional parameters, shifting doesn't do anything. [ ]
Cause the shell to parse and execute when any of the specified
signals are received. The signals are specified by signal
number. 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 com-
mand has no effect on signals that were ignored on entry to the
shell. [ ]
Set the value of umask (see to the specified octal value. If the
argument is omitted, the umask value is printed.
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. [ ]
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.
The following function redefines the cd command:
cd() {
if bltin cd "$@"
thenif test -f .enter
then. .enter
elsereturn 0
fi
fi
}
This function causes the file ``.enter'' to be read when you
enter a directory, if it exists. The bltin command is used to
access the real cd 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. The suspend
function distributed with looks like
# 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
}
This turns off job control and then sends a stop signal to the
current process group, which suspends the shell. (When job con-
trol is turned on, the shell ignores the TSTP signal.) Job con-
trol will be turned back on when the function returns because
``-'' is local to the function. As an example of what not to do,
consider an earlier version of suspend:
suspend() {
suspend_flag=$-
set +j
kill -TSTP 0
set -$suspend_flag
}
There are two problems with this. First, suspend_flag is a glo-
bal variable rather than a local one, which will cause problems
in the (unlikely) circumstance that the user is using that vari-
able for some other purpose. Second, consider what happens if
shell received an interrupt signal after it executes the first
set command but before it executes the second one. The interrupt
signal will abort the shell function, so that the second set com-
mand will never be executed and job control will be left off.
The first version of suspend 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 ter-
minated, no matter how it is terminated. Shell variables can be
used to provide abbreviations for things which you type frequent-
ly. For example, I set
export h=$HOME
in my .profile so that I can type the name of my home directory
simply by typing ``$h''. When writing shell procedures, try not
to make assumptions about what is imported from the environment.
Explicitly unset or initialize all variables, rather than assum-
ing they will be unset. If you use cd, it is a good idea to un-
set CDPATH. 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 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 vari-
able and command substitutions, and omit them only when you real-
ly want word splitting and file name generation. If you want
word splitting but not file name generation, use the option.
Kenneth Almquist echo(1), expr(1), line(1), pwd(1), true(1).
When command substitution occurs inside a here document, the com-
mands inside the here document are run with their standard input
closed. For example, the following will not word because the
standard input of the command will be closed when the command is
run:
cat <<-!
Line 1: $(line)
Line 2: $(line)
!
Unsetting a function which is currently being executed may cause
strange behavior. 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.