1126 lines
36 KiB
Groff
1126 lines
36 KiB
Groff
.\" 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.
|
|
.\"
|
|
.\" from: @(#)sh.1 5.1 (Berkeley) 3/7/91
|
|
.\" $Id: sh.1,v 1.8 1994/02/03 17:47:48 jtc Exp $
|
|
.\"
|
|
.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 5
|
|
\fB\\$1\fR
|
|
.br
|
|
..
|
|
.de b \" begin builtin command
|
|
.HP 5
|
|
.B \\$1
|
|
..
|
|
.SH NAME
|
|
ash \- 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
|
|
\fBif\fR list
|
|
\fBthen\fR list
|
|
.ti -\w'[ 'u
|
|
[ \fBelif\fR list
|
|
\fBthen\fR list ] ...
|
|
.ti -\w'[ 'u
|
|
[ \fBelse\fR list ]
|
|
\fBfi\fR
|
|
.e
|
|
.PP
|
|
A
|
|
.I while
|
|
command looks like
|
|
.d
|
|
\fBwhile\fR list
|
|
\fBdo\fR list
|
|
\fBdone\fR
|
|
.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
|
|
\fBfor\fR variable \fBin\fR word...
|
|
\fBdo\fR list
|
|
\fBdone\fR
|
|
.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
|
|
\fBbreak\fR [ num ]
|
|
\fBcontinue\fR [ num ]
|
|
.e
|
|
.I Break
|
|
terminates the
|
|
.I num
|
|
innermost
|
|
.I for
|
|
or
|
|
.I while
|
|
loops.
|
|
.I Continue
|
|
continues with the next iteration of the
|
|
.IR num'th
|
|
innermost loop.
|
|
These are implemented as builtin commands.
|
|
.PP
|
|
The
|
|
.I case
|
|
command looks like
|
|
.d
|
|
\fBcase\fR word \fBin\fR
|
|
pattern\fB)\fR list \fB;;\fR
|
|
\&...
|
|
\fBesac\fR
|
|
.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(\fRlist\fB)\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 statement of a function,
|
|
and looks like
|
|
.d
|
|
\fBlocal\fR [ 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
|
|
\fBreturn\fR [ 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:
|
|
.b
|
|
`\fIlist\fR`
|
|
.e
|
|
and
|
|
.b
|
|
$(\fIlist\fR)
|
|
.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" ... "$\fIn\fR", where \fIn\fR 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 parameters.)
|
|
.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 occurrences 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:
|
|
.b
|
|
%\fInumber\fR
|
|
%\fIstring\fR
|
|
%%
|
|
\fIprocess_id\fR
|
|
.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 job\fR. 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 \fIash\fR 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
|
|
\fIash\fR and all the programs included in the \fIash\fR distribution is
|
|
as follows:
|
|
.ta 1i 2i
|
|
.nf
|
|
0 Success.
|
|
1 Alternate success.
|
|
2 Failure.
|
|
129-... Command terminated by a signal.
|
|
.fi
|
|
The \fIalternate success\fR 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 Berkeley job control.
|
|
.b bltin
|
|
.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 ".\fI\h'0.1i'file"
|
|
.br
|
|
The commands in the specified file are read and executed by the shell.
|
|
.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
|
|
\fBexport\fR 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 Berkeley 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 lc
|
|
[
|
|
.I function-name
|
|
]
|
|
.br
|
|
The function name is defined to execute the last command entered.
|
|
If the function name is omitted, the last command executed is
|
|
executed again. This command only works if the
|
|
.B -i
|
|
flag is set.
|
|
.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
|
|
\fBreadonly\fR 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-e\fR 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-f\fR Turn off file name generation.
|
|
.sp
|
|
.ti -0.4i
|
|
\fB-I\fR 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-i\fR 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-j\fR 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-n\fR 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-s\fR 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-x\fR If this flag is set, the shell will print out each
|
|
command before executing it.
|
|
.sp
|
|
.ti -0.4i
|
|
\fB-z\fR 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 \fIcd\fR command:
|
|
.d
|
|
cd() {
|
|
if bltin 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 \fIbltin\fR command is used to access the
|
|
real \fIcd\fR 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 \fInot\fR to do, consider an earlier version of
|
|
\fIsuspend\fR:
|
|
.d
|
|
suspend() {
|
|
suspend_flag=$-
|
|
set +j
|
|
kill -TSTP 0
|
|
set -$suspend_flag
|
|
}
|
|
.e
|
|
There are two problems with this. First, \fBsuspend_flag\fR 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 \fIset\fR command but before it executes
|
|
the second one. The interrupt signal will abort the shell function, so
|
|
that the second \fIset\fR command will never be executed and job control
|
|
will be left off. The first version of \fIsuspend\fR 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
|
|
.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.
|