d90bee9749
/etc/profile enables by default tabcompletion, as well as emacs mode, in order to keep the old MINIX ash behavior. Note: The shell now refuses to source a script without a relative or absolute path. This means: - '. myscript.sh' fails, while - '. ./myscript.sh' succeeds Change-Id: I0be89b0747bd005e4c05cadb937af86883627dc6
2002 lines
58 KiB
Groff
2002 lines
58 KiB
Groff
.\" $NetBSD: sh.1,v 1.111 2013/10/02 20:42:56 christos Exp $
|
|
.\" Copyright (c) 1991, 1993
|
|
.\" 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. 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 8.6 (Berkeley) 5/4/95
|
|
.\"
|
|
.Dd October 2, 2013
|
|
.Dt SH 1
|
|
.Os
|
|
.Sh NAME
|
|
.Nm sh
|
|
.Nd command interpreter (shell)
|
|
.Sh SYNOPSIS
|
|
.Nm
|
|
.Bk -words
|
|
.Op Fl aCefnuvxIimqVEb
|
|
.Op Cm +aCefnuvxIimqVEb
|
|
.Ek
|
|
.Bk -words
|
|
.Op Fl o Ar option_name
|
|
.Op Cm +o Ar option_name
|
|
.Ek
|
|
.Bk -words
|
|
.Op Ar command_file Oo Ar argument ... Oc
|
|
.Ek
|
|
.Nm
|
|
.Fl c
|
|
.Bk -words
|
|
.Op Fl aCefnuvxIimqVEb
|
|
.Op Cm +aCefnuvxIimqVEb
|
|
.Ek
|
|
.Bk -words
|
|
.Op Fl o Ar option_name
|
|
.Op Cm +o Ar option_name
|
|
.Ek
|
|
.Bk -words
|
|
.Ar command_string
|
|
.Op Ar command_name Oo Ar argument ... Oc
|
|
.Ek
|
|
.Nm
|
|
.Fl s
|
|
.Bk -words
|
|
.Op Fl aCefnuvxIimqVEb
|
|
.Op Cm +aCefnuvxIimqVEb
|
|
.Ek
|
|
.Bk -words
|
|
.Op Fl o Ar option_name
|
|
.Op Cm +o Ar option_name
|
|
.Ek
|
|
.Bk -words
|
|
.Op Ar argument ...
|
|
.Ek
|
|
.Sh DESCRIPTION
|
|
.Nm
|
|
is the standard command interpreter for the system.
|
|
The current version of
|
|
.Nm
|
|
is in the process of being changed to conform with the
|
|
.Tn POSIX
|
|
1003.2 and 1003.2a specifications for the shell.
|
|
This version has many
|
|
features which make it appear similar in some respects to the Korn shell,
|
|
but it is not a Korn shell clone (see
|
|
.Xr ksh 1 ) .
|
|
Only features designated by
|
|
.Tn POSIX ,
|
|
plus a few Berkeley extensions, are being incorporated into this shell.
|
|
.\" We expect
|
|
.\" .Tn POSIX
|
|
.\" conformance by the time 4.4 BSD is released.
|
|
This man page is not intended
|
|
to be a tutorial or a complete specification of the shell.
|
|
.Ss Overview
|
|
The shell is a command that reads lines from either a file or the
|
|
terminal, interprets them, and generally executes other commands.
|
|
It is the program that is running when a user logs into the system
|
|
(although a user can select a different shell with the
|
|
.Xr chsh 1
|
|
command).
|
|
The shell implements a language that has flow control
|
|
constructs, a macro facility that provides a variety of features in
|
|
addition to data storage, along with built in history and line editing
|
|
capabilities.
|
|
It incorporates many features to aid interactive use and
|
|
has the advantage that the interpretative language is common to both
|
|
interactive and non-interactive use (shell scripts).
|
|
That is, commands
|
|
can be typed directly to the running shell or can be put into a file and
|
|
the file can be executed directly by the shell.
|
|
.Ss Invocation
|
|
If no arguments are present and if the standard input of the shell
|
|
is connected to a terminal (or if the
|
|
.Fl i
|
|
flag is set),
|
|
and the
|
|
.Fl c
|
|
option is not present, the shell is considered an interactive shell.
|
|
An interactive shell generally prompts before each command and handles
|
|
programming and command errors differently (as described below).
|
|
When first starting,
|
|
the shell inspects argument 0, and if it begins with a dash
|
|
.Sq - ,
|
|
the shell is also considered
|
|
a login shell.
|
|
This is normally done automatically by the system
|
|
when the user first logs in.
|
|
A login shell first reads commands
|
|
from the files
|
|
.Pa /etc/profile
|
|
and
|
|
.Pa .profile
|
|
if they exist.
|
|
If the environment variable
|
|
.Ev ENV
|
|
is set on entry to a shell, or is set in the
|
|
.Pa .profile
|
|
of a login shell, the shell next reads
|
|
commands from the file named in
|
|
.Ev ENV .
|
|
Therefore, a user should place commands that are to be executed only at
|
|
login time in the
|
|
.Pa .profile
|
|
file, and commands that are executed for every shell inside the
|
|
.Ev ENV
|
|
file.
|
|
To set the
|
|
.Ev ENV
|
|
variable to some file, place the following line in your
|
|
.Pa .profile
|
|
of your home directory
|
|
.Pp
|
|
.Dl ENV=$HOME/.shinit; export ENV
|
|
.Pp
|
|
substituting for
|
|
.Dq .shinit
|
|
any filename you wish.
|
|
Since the
|
|
.Ev ENV
|
|
file is read for every invocation of the shell, including shell scripts
|
|
and non-interactive shells, the following paradigm is useful for
|
|
restricting commands in the
|
|
.Ev ENV
|
|
file to interactive invocations.
|
|
Place commands within the
|
|
.Dq case
|
|
and
|
|
.Dq esac
|
|
below (these commands are described later):
|
|
.Pp
|
|
.Bl -item -compact -offset indent
|
|
.It
|
|
.Li case $- in *i*)
|
|
.Bl -item -compact -offset indent
|
|
.It
|
|
.Li # commands for interactive use only
|
|
.It
|
|
.Li ...
|
|
.El
|
|
.It
|
|
.Li esac
|
|
.El
|
|
.Pp
|
|
If command line arguments besides the options have been specified, then
|
|
the shell treats the first argument as the name of a file from which to
|
|
read commands (a shell script), and the remaining arguments are set as the
|
|
positional parameters of the shell ($1, $2, etc).
|
|
Otherwise, the shell
|
|
reads commands from its standard input.
|
|
.Ss Argument List Processing
|
|
All of the single letter options have a corresponding name that can be
|
|
used as an argument to the
|
|
.Fl o
|
|
option.
|
|
The set
|
|
.Fl o
|
|
name is provided next to the single letter option in
|
|
the description below.
|
|
Specifying a dash
|
|
.Dq -
|
|
turns the option on, while using a plus
|
|
.Dq +
|
|
disables the option.
|
|
The following options can be set from the command line or
|
|
with the
|
|
.Ic set
|
|
built-in (described later).
|
|
.Bl -tag -width aaaallexportfoo -offset indent
|
|
.It Fl a Em allexport
|
|
Export all variables assigned to.
|
|
.It Fl c
|
|
Read commands from the
|
|
.Ar command_string
|
|
operand instead of from the standard input.
|
|
Special parameter 0 will be set from the
|
|
.Ar command_name
|
|
operand and the positional parameters ($1, $2, etc.)
|
|
set from the remaining argument operands.
|
|
.It Fl C Em noclobber
|
|
Don't overwrite existing files with
|
|
.Dq \*[Gt] .
|
|
.It Fl e Em errexit
|
|
If not interactive, exit immediately if any untested command fails.
|
|
The exit status of a command is considered to be
|
|
explicitly tested if the command is used to control an
|
|
.Ic if ,
|
|
.Ic elif ,
|
|
.Ic while ,
|
|
or
|
|
.Ic until ,
|
|
or if the command is the left hand operand of an
|
|
.Dq \*[Am]\*[Am]
|
|
or
|
|
.Dq ||
|
|
operator.
|
|
.It Fl f Em noglob
|
|
Disable pathname expansion.
|
|
.It Fl n Em noexec
|
|
If not interactive, read commands but do not execute them.
|
|
This is useful for checking the syntax of shell scripts.
|
|
.It Fl u Em nounset
|
|
Write a message to standard error when attempting to expand a variable
|
|
that is not set, and if the shell is not interactive, exit immediately.
|
|
.It Fl v Em verbose
|
|
The shell writes its input to standard error as it is read.
|
|
Useful for debugging.
|
|
.It Fl x Em xtrace
|
|
Write each command to standard error (preceded by a
|
|
.Sq +\ )
|
|
before it is executed.
|
|
Useful for debugging.
|
|
.It Fl q Em quietprofile
|
|
If the
|
|
.Fl v
|
|
or
|
|
.Fl x
|
|
options have been set, do not apply them when reading
|
|
initialization files, these being
|
|
.Pa /etc/profile ,
|
|
.Pa .profile ,
|
|
and the file specified by the
|
|
.Ev ENV
|
|
environment variable.
|
|
.It Fl I Em ignoreeof
|
|
Ignore EOFs from input when interactive.
|
|
.It Fl i Em interactive
|
|
Force the shell to behave interactively.
|
|
.It Fl m Em monitor
|
|
Turn on job control (set automatically when interactive).
|
|
.It Fl s Em stdin
|
|
Read commands from standard input (set automatically if no file arguments
|
|
are present).
|
|
This option has no effect when set after the shell has
|
|
already started running (i.e. with
|
|
.Ic set ) .
|
|
.It Fl V Em vi
|
|
Enable the built-in
|
|
.Xr vi 1
|
|
command line editor (disables
|
|
.Fl E
|
|
if it has been set).
|
|
(See the
|
|
.Sx Command Line Editing
|
|
section below.)
|
|
.It Fl E Em emacs
|
|
Enable the built-in emacs style
|
|
command line editor (disables
|
|
.Fl V
|
|
if it has been set).
|
|
(See the
|
|
.Sx Command Line Editing
|
|
section below.)
|
|
.It Fl b Em notify
|
|
Enable asynchronous notification of background job completion.
|
|
(Not implemented.)
|
|
.It "\ \ " Em cdprint
|
|
Make an interactive shell always print the new directory name when
|
|
changed by the
|
|
.Ic cd
|
|
command.
|
|
.It "\ \ " Em tabcomplete
|
|
Enables filename completion in the command line editor.
|
|
Typing a tab character will extend the current input word to match a
|
|
filename.
|
|
If more than one filename matches it is only extended to be the common prefix.
|
|
Typing a second tab character will list all the matching names.
|
|
One of the editing modes, either
|
|
.Fl E
|
|
or
|
|
.Fl V ,
|
|
must be enabled for this to work.
|
|
.El
|
|
.Ss Lexical Structure
|
|
The shell reads input in terms of lines from a file and breaks it up into
|
|
words at whitespace (blanks and tabs), and at certain sequences of
|
|
characters that are special to the shell called
|
|
.Dq operators .
|
|
There are two types of operators: control operators and redirection
|
|
operators (their meaning is discussed later).
|
|
Following is a list of operators:
|
|
.Bl -ohang -offset indent
|
|
.It "Control operators:"
|
|
.Dl \*[Am] \*[Am]\*[Am] \&( \&) \&; ;; | || \*[Lt]newline\*[Gt]
|
|
.It "Redirection operators:"
|
|
.Dl \*[Lt] \*[Gt] \*[Gt]| \*[Lt]\*[Lt] \*[Gt]\*[Gt] \*[Lt]\*[Am] \*[Gt]\*[Am] \*[Lt]\*[Lt]- \*[Lt]\*[Gt]
|
|
.El
|
|
.Ss Quoting
|
|
Quoting is used to remove the special meaning of certain characters or
|
|
words to the shell, such as operators, whitespace, or keywords.
|
|
There are three types of quoting: matched single quotes,
|
|
matched double quotes, and backslash.
|
|
.Ss Backslash
|
|
A backslash preserves the literal meaning of the following
|
|
character, with the exception of
|
|
.Aq newline .
|
|
A backslash preceding a
|
|
.Aq newline
|
|
is treated as a line continuation.
|
|
.Ss Single Quotes
|
|
Enclosing characters in single quotes preserves the literal meaning of all
|
|
the characters (except single quotes, making it impossible to put
|
|
single quotes in a single-quoted string).
|
|
.Ss Double Quotes
|
|
Enclosing characters within double quotes preserves the literal
|
|
meaning of all characters except dollar sign
|
|
.Pq $ ,
|
|
backquote
|
|
.Pq ` ,
|
|
and backslash
|
|
.Pq \e .
|
|
The backslash inside double quotes is historically weird, and serves to
|
|
quote only the following characters:
|
|
.Dl $ ` \*q \e \*[Lt]newline\*[Gt] .
|
|
Otherwise it remains literal.
|
|
.Ss Reserved Words
|
|
Reserved words are words that have special meaning to the
|
|
shell and are recognized at the beginning of a line and
|
|
after a control operator.
|
|
The following are reserved words:
|
|
.Bl -column while while while while while -offset indent
|
|
.It ! Ta elif Ta fi Ta while Ta case
|
|
.It else Ta for Ta then Ta { Ta }
|
|
.It do Ta done Ta until Ta if Ta esac
|
|
.El
|
|
.Pp
|
|
Their meaning is discussed later.
|
|
.Ss Aliases
|
|
An alias is a name and corresponding value set using the
|
|
.Ic alias
|
|
built-in command.
|
|
Whenever a reserved word may occur (see above),
|
|
and after checking for reserved words, the shell
|
|
checks the word to see if it matches an alias.
|
|
If it does, it replaces it in the input stream with its value.
|
|
For example, if there is an alias called
|
|
.Dq lf
|
|
with the value
|
|
.Dq "ls -F" ,
|
|
then the input:
|
|
.Pp
|
|
.Dl lf foobar Aq return
|
|
.Pp
|
|
would become
|
|
.Pp
|
|
.Dl ls -F foobar Aq return
|
|
.Pp
|
|
Aliases provide a convenient way for naive users to create shorthands for
|
|
commands without having to learn how to create functions with arguments.
|
|
They can also be used to create lexically obscure code.
|
|
This use is discouraged.
|
|
.Ss Commands
|
|
The shell interprets the words it reads according to a language, the
|
|
specification of which is outside the scope of this man page (refer to the
|
|
BNF in the
|
|
.Tn POSIX
|
|
1003.2 document).
|
|
Essentially though, a line is read and if the first
|
|
word of the line (or after a control operator) is not a reserved word,
|
|
then the shell has recognized a simple command.
|
|
Otherwise, a complex
|
|
command or some other special construct may have been recognized.
|
|
.Ss Simple Commands
|
|
If a simple command has been recognized, the shell performs
|
|
the following actions:
|
|
.Bl -enum -offset indent
|
|
.It
|
|
Leading words of the form
|
|
.Dq name=value
|
|
are stripped off and assigned to the environment of the simple command.
|
|
Redirection operators and their arguments (as described below) are
|
|
stripped off and saved for processing.
|
|
.It
|
|
The remaining words are expanded as described in the
|
|
.Sx Word Expansions
|
|
section below,
|
|
and the first remaining word is considered the command name and the
|
|
command is located.
|
|
The remaining words are considered the arguments of the command.
|
|
If no command name resulted, then the
|
|
.Dq name=value
|
|
variable assignments recognized in item 1 affect the current shell.
|
|
.It
|
|
Redirections are performed as described in the next section.
|
|
.El
|
|
.Ss Redirections
|
|
Redirections are used to change where a command reads its input or sends
|
|
its output.
|
|
In general, redirections open, close, or duplicate an
|
|
existing reference to a file.
|
|
The overall format used for redirection is:
|
|
.Pp
|
|
.Dl [n] Va redir-op Ar file
|
|
.Pp
|
|
where
|
|
.Va redir-op
|
|
is one of the redirection operators mentioned previously.
|
|
Following is a list of the possible redirections.
|
|
The
|
|
.Bq n
|
|
is an optional number, as in
|
|
.Sq 3
|
|
(not
|
|
.Sq Bq 3 ) ,
|
|
that refers to a file descriptor.
|
|
.Bl -tag -width aaabsfiles -offset indent
|
|
.It [n] Ns \*[Gt] file
|
|
Redirect standard output (or n) to file.
|
|
.It [n] Ns \*[Gt]| file
|
|
Same, but override the
|
|
.Fl C
|
|
option.
|
|
.It [n] Ns \*[Gt]\*[Gt] file
|
|
Append standard output (or n) to file.
|
|
.It [n] Ns \*[Lt] file
|
|
Redirect standard input (or n) from file.
|
|
.It [n1] Ns \*[Lt]\*[Am] Ns n2
|
|
Duplicate standard input (or n1) from file descriptor n2.
|
|
.It [n] Ns \*[Lt]\*[Am]-
|
|
Close standard input (or n).
|
|
.It [n1] Ns \*[Gt]\*[Am] Ns n2
|
|
Duplicate standard output (or n1) to n2.
|
|
.It [n] Ns \*[Gt]\*[Am]-
|
|
Close standard output (or n).
|
|
.It [n] Ns \*[Lt]\*[Gt] file
|
|
Open file for reading and writing on standard input (or n).
|
|
.El
|
|
.Pp
|
|
The following redirection is often called a
|
|
.Dq here-document .
|
|
.Bl -item -offset indent
|
|
.It
|
|
.Li [n]\*[Lt]\*[Lt] delimiter
|
|
.Dl here-doc-text ...
|
|
.Li delimiter
|
|
.El
|
|
.Pp
|
|
All the text on successive lines up to the delimiter, or to an EOF, is
|
|
saved away and made available to the command on standard input, or file
|
|
descriptor n if it is specified.
|
|
If the delimiter as specified on the initial line is
|
|
quoted, then the here-doc-text is treated literally; otherwise, the text is
|
|
subjected to parameter expansion, command substitution, and arithmetic
|
|
expansion as described in the
|
|
.Sx Word Expansions
|
|
section below.
|
|
If the operator is
|
|
.Dq \*[Lt]\*[Lt]-
|
|
instead of
|
|
.Dq \*[Lt]\*[Lt] ,
|
|
then leading tabs in the here-doc-text are stripped.
|
|
.Ss Search and Execution
|
|
There are three types of commands: shell functions, built-in commands, and
|
|
normal programs -- and the command is searched for (by name) in that order.
|
|
They each are executed in a different way.
|
|
.Pp
|
|
When a shell function is executed, all of the shell positional parameters
|
|
(except $0, which remains unchanged) are set to the arguments of 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 the 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.
|
|
This all occurs within the current shell.
|
|
.Pp
|
|
Shell built-ins are executed internally to the shell, without spawning a
|
|
new process.
|
|
.Pp
|
|
Otherwise, if the command name doesn't match a function or built-in, the
|
|
command is searched for as a normal program in the file system (as
|
|
described in the next section).
|
|
When a normal program is executed, the shell runs the program,
|
|
passing the arguments and the environment to the program.
|
|
If the program is not a normal executable file (i.e., if it does
|
|
not begin with the "magic number" whose
|
|
.Tn ASCII
|
|
representation is "#!", so
|
|
.Xr execve 2
|
|
returns
|
|
.Er ENOEXEC
|
|
then) the shell will interpret the program in a subshell.
|
|
The child shell will reinitialize itself in this case,
|
|
so that the effect will be as if a
|
|
new shell had been invoked to handle the ad-hoc shell script, except that
|
|
the location of hashed commands located in the parent shell will be
|
|
remembered by the child.
|
|
.Pp
|
|
Note that previous versions of this document and the source code itself
|
|
misleadingly and sporadically refer to a shell script without a magic
|
|
number as a "shell procedure".
|
|
.Ss Path Search
|
|
When locating a command, the shell first looks to see if it has a shell
|
|
function by that name.
|
|
Then it looks for a built-in command by that name.
|
|
If a built-in command is not found, one of two things happen:
|
|
.Bl -enum
|
|
.It
|
|
Command names containing a slash are simply executed without performing
|
|
any searches.
|
|
.It
|
|
The shell searches each entry in
|
|
.Ev PATH
|
|
in turn for the command.
|
|
The value of the
|
|
.Ev PATH
|
|
variable should be a series of entries separated by colons.
|
|
Each entry consists of a directory name.
|
|
The current directory may be indicated
|
|
implicitly by an empty directory name, or explicitly by a single period.
|
|
.El
|
|
.Ss Command Exit Status
|
|
Each command has an exit status that can influence the behavior
|
|
of other shell commands.
|
|
The paradigm is that a command exits
|
|
with zero for normal or success, and non-zero for failure,
|
|
error, or a false indication.
|
|
The man page for each command
|
|
should indicate the various exit codes and what they mean.
|
|
Additionally, the built-in commands return exit codes, as does
|
|
an executed shell function.
|
|
.Pp
|
|
If a command consists entirely of variable assignments then the
|
|
exit status of the command is that of the last command substitution
|
|
if any, otherwise 0.
|
|
.Ss Complex Commands
|
|
Complex commands are combinations of simple commands with control
|
|
operators or reserved words, together creating a larger complex command.
|
|
More generally, a command is one of the following:
|
|
.Bl -bullet
|
|
.It
|
|
simple command
|
|
.It
|
|
pipeline
|
|
.It
|
|
list or compound-list
|
|
.It
|
|
compound command
|
|
.It
|
|
function definition
|
|
.El
|
|
.Pp
|
|
Unless otherwise stated, the exit status of a command is that of the last
|
|
simple command executed by the command.
|
|
.Ss Pipelines
|
|
A pipeline is a sequence of one or more commands separated
|
|
by the control operator |.
|
|
The standard output of all but
|
|
the last command is connected to the standard input
|
|
of the next command.
|
|
The standard output of the last
|
|
command is inherited from the shell, as usual.
|
|
.Pp
|
|
The format for a pipeline is:
|
|
.Pp
|
|
.Dl [!] command1 [ | command2 ...]
|
|
.Pp
|
|
The standard output of command1 is connected to the standard input of
|
|
command2.
|
|
The standard input, standard output, or both of a command is
|
|
considered to be assigned by the pipeline before any redirection specified
|
|
by redirection operators that are part of the command.
|
|
.Pp
|
|
If the pipeline is not in the background (discussed later), the shell
|
|
waits for all commands to complete.
|
|
.Pp
|
|
If the reserved word ! does not precede the pipeline, the exit status is
|
|
the exit status of the last command specified in the pipeline.
|
|
Otherwise, the exit status is the logical NOT of the exit status of the
|
|
last command.
|
|
That is, if the last command returns zero, the exit status
|
|
is 1; if the last command returns greater than zero, the exit status is
|
|
zero.
|
|
.Pp
|
|
Because pipeline assignment of standard input or standard output or both
|
|
takes place before redirection, it can be modified by redirection.
|
|
For example:
|
|
.Pp
|
|
.Dl $ command1 2\*[Gt]\*[Am]1 | command2
|
|
.Pp
|
|
sends both the standard output and standard error of command1
|
|
to the standard input of command2.
|
|
.Pp
|
|
A ; or
|
|
.Aq newline
|
|
terminator causes the preceding AND-OR-list (described
|
|
next) to be executed sequentially; a \*[Am] causes asynchronous execution of
|
|
the preceding AND-OR-list.
|
|
.Pp
|
|
Note that unlike some other shells, each process in the pipeline is a
|
|
child of the invoking shell (unless it is a shell built-in, in which case
|
|
it executes in the current shell -- but any effect it has on the
|
|
environment is wiped).
|
|
.Ss Background Commands -- \*[Am]
|
|
If a command is terminated by the control operator ampersand (\*[Am]), the
|
|
shell executes the command asynchronously -- that is, the shell does not
|
|
wait for the command to finish before executing the next command.
|
|
.Pp
|
|
The format for running a command in background is:
|
|
.Pp
|
|
.Dl command1 \*[Am] [command2 \*[Am] ...]
|
|
.Pp
|
|
If the shell is not interactive, the standard input of an asynchronous
|
|
command is set to
|
|
.Pa /dev/null .
|
|
.Ss Lists -- Generally Speaking
|
|
A list is a sequence of zero or more commands separated by newlines,
|
|
semicolons, or ampersands, and optionally terminated by one of these three
|
|
characters.
|
|
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.
|
|
.Ss Short-Circuit List Operators
|
|
.Dq \*[Am]\*[Am]
|
|
and
|
|
.Dq ||
|
|
are AND-OR list operators.
|
|
.Dq \*[Am]\*[Am]
|
|
executes the first command, and then executes the second command if and only
|
|
if the exit status of the first command is zero.
|
|
.Dq ||
|
|
is similar, but executes the second command if and only if the exit status
|
|
of the first command is nonzero.
|
|
.Dq \*[Am]\*[Am]
|
|
and
|
|
.Dq ||
|
|
both have the same priority.
|
|
Note that these operators are left-associative, so
|
|
.Dq true || echo bar \*[Am]\*[Am] echo baz
|
|
writes
|
|
.Dq baz
|
|
and nothing else.
|
|
This is not the way it works in C.
|
|
Also, if you forget the left-hand side (for example when continuing lines but
|
|
forgetting to use a backslash) it defaults to a true statement.
|
|
This behavior is not useful and should not be relied upon.
|
|
.Ss Flow-Control Constructs -- if, while, for, case
|
|
The syntax of the if command is
|
|
.Bd -literal -offset indent
|
|
if list
|
|
then list
|
|
[ elif list
|
|
then list ] ...
|
|
[ else list ]
|
|
fi
|
|
.Ed
|
|
.Pp
|
|
The syntax of the while command is
|
|
.Bd -literal -offset indent
|
|
while list
|
|
do list
|
|
done
|
|
.Ed
|
|
.Pp
|
|
The two lists are executed repeatedly while the exit status of the
|
|
first list is zero.
|
|
The until command is similar, but has the word
|
|
until in place of while, which causes it to
|
|
repeat until the exit status of the first list is zero.
|
|
.Pp
|
|
The syntax of the for command is
|
|
.Bd -literal -offset indent
|
|
for variable in word ...
|
|
do list
|
|
done
|
|
.Ed
|
|
.Pp
|
|
The words are expanded, and then the list is executed repeatedly with the
|
|
variable set to each word in turn.
|
|
do and done may be replaced with
|
|
.Dq {
|
|
and
|
|
.Dq } .
|
|
.Pp
|
|
The syntax of the break and continue command is
|
|
.Bd -literal -offset indent
|
|
break [ num ]
|
|
continue [ num ]
|
|
.Ed
|
|
.Pp
|
|
Break terminates the num innermost for or while loops.
|
|
Continue continues with the next iteration of the innermost loop.
|
|
These are implemented as built-in commands.
|
|
.Pp
|
|
The syntax of the case command is
|
|
.Bd -literal -offset indent
|
|
case word in
|
|
pattern) list ;;
|
|
\&...
|
|
esac
|
|
.Ed
|
|
.Pp
|
|
The pattern can actually be one or more patterns (see
|
|
.Sx Shell Patterns
|
|
described later), separated by
|
|
.Dq \*(Ba
|
|
characters.
|
|
.Ss Grouping Commands Together
|
|
Commands may be grouped by writing either
|
|
.Pp
|
|
.Dl (list)
|
|
.Pp
|
|
or
|
|
.Pp
|
|
.Dl { list; }
|
|
.Pp
|
|
The first of these executes the commands in a subshell.
|
|
Built-in commands grouped into a (list) will not affect the current shell.
|
|
The second form does not fork another shell so is slightly more efficient.
|
|
Grouping commands together this way allows you to redirect
|
|
their output as though they were one program:
|
|
.Bd -literal -offset indent
|
|
{ echo -n \*q hello \*q ; echo \*q world" ; } \*[Gt] greeting
|
|
.Ed
|
|
.Pp
|
|
Note that
|
|
.Dq }
|
|
must follow a control operator (here,
|
|
.Dq \&; )
|
|
so that it is recognized as a reserved word and not as another command argument.
|
|
.Ss Functions
|
|
The syntax of a function definition is
|
|
.Pp
|
|
.Dl name ( ) command
|
|
.Pp
|
|
A function definition is an executable statement; when executed it
|
|
installs a function named name and returns an exit status of zero.
|
|
The command is normally a list enclosed between
|
|
.Dq {
|
|
and
|
|
.Dq } .
|
|
.Pp
|
|
Variables may be declared to be local to a function by using a local
|
|
command.
|
|
This should appear as the first statement of a function, and the syntax is
|
|
.Pp
|
|
.Dl local [ variable | - ] ...
|
|
.Pp
|
|
.Dq Local
|
|
is implemented as a built-in command.
|
|
.Pp
|
|
When a variable is made local, it inherits the initial value and exported
|
|
and read-only flags from the variable with the same name in the surrounding
|
|
scope, if there is one.
|
|
Otherwise, the variable is initially unset.
|
|
The shell uses dynamic scoping, so that if you make the variable x local to
|
|
function f, which then calls function g, references to the variable x made
|
|
inside g will refer to the variable x declared inside f, not to the global
|
|
variable named x.
|
|
.Pp
|
|
The only special parameter that can be made local is
|
|
.Dq - .
|
|
Making
|
|
.Dq -
|
|
local causes any shell options that are changed via the set command inside the
|
|
function to be restored to their original values when the function
|
|
returns.
|
|
.Pp
|
|
The syntax of the return command is
|
|
.Pp
|
|
.Dl return [ exitstatus ]
|
|
.Pp
|
|
It terminates the currently executing function.
|
|
Return is implemented as a built-in command.
|
|
.Ss Variables and Parameters
|
|
The shell maintains a set of parameters.
|
|
A parameter denoted by a name is called a variable.
|
|
When starting up, the shell turns all the environment
|
|
variables into shell variables.
|
|
New variables can be set using the form
|
|
.Pp
|
|
.Dl name=value
|
|
.Pp
|
|
Variables set by the user must have a name consisting solely of
|
|
alphabetics, numerics, and underscores - the first of which must not be
|
|
numeric.
|
|
A parameter can also be denoted by a number or a special
|
|
character as explained below.
|
|
.Ss Positional Parameters
|
|
A positional parameter is a parameter denoted by a number (n \*[Gt] 0).
|
|
The shell sets these initially to the values of its command line arguments
|
|
that follow the name of the shell script.
|
|
The
|
|
.Ic set
|
|
built-in can also be used to set or reset them.
|
|
.Ss Special Parameters
|
|
A special parameter is a parameter denoted by one of the following special
|
|
characters.
|
|
The value of the parameter is listed next to its character.
|
|
.Bl -tag -width thinhyphena
|
|
.It *
|
|
Expands to the positional parameters, starting from one.
|
|
When the
|
|
expansion occurs within a double-quoted string it expands to a single
|
|
field with the value of each parameter separated by the first character of
|
|
the
|
|
.Ev IFS
|
|
variable, or by a
|
|
.Aq space
|
|
if
|
|
.Ev IFS
|
|
is unset.
|
|
.It @
|
|
Expands to the positional parameters, starting from one.
|
|
When the expansion occurs within double quotes, each positional
|
|
parameter expands as a separate argument.
|
|
If there are no positional parameters, the
|
|
expansion of @ generates zero arguments, even when @ is
|
|
double-quoted.
|
|
What this basically means, for example, is
|
|
if $1 is
|
|
.Dq abc
|
|
and $2 is
|
|
.Dq def ghi ,
|
|
then
|
|
.Qq $@
|
|
expands to
|
|
the two arguments:
|
|
.Pp
|
|
.Sm off
|
|
.Dl \*q abc \*q \ \*q def\ ghi \*q
|
|
.Sm on
|
|
.It #
|
|
Expands to the number of positional parameters.
|
|
.It \&?
|
|
Expands to the exit status of the most recent pipeline.
|
|
.It - (Hyphen.)
|
|
Expands to the current option flags (the single-letter
|
|
option names concatenated into a string) as specified on
|
|
invocation, by the set built-in command, or implicitly
|
|
by the shell.
|
|
.It $
|
|
Expands to the process ID of the invoked shell.
|
|
A subshell retains the same value of $ as its parent.
|
|
.It \&!
|
|
Expands to the process ID of the most recent background
|
|
command executed from the current shell.
|
|
For a pipeline, the process ID is that of the last command in the pipeline.
|
|
.It 0 (Zero.)
|
|
Expands to the name of the shell or shell script.
|
|
.El
|
|
.Ss Word Expansions
|
|
This section describes the various expansions that are performed on words.
|
|
Not all expansions are performed on every word, as explained later.
|
|
.Pp
|
|
Tilde expansions, parameter expansions, command substitutions, arithmetic
|
|
expansions, and quote removals that occur within a single word expand to a
|
|
single field.
|
|
It is only field splitting or pathname expansion that can
|
|
create multiple fields from a single word.
|
|
The single exception to this
|
|
rule is the expansion of the special parameter @ within double quotes, as
|
|
was described above.
|
|
.Pp
|
|
The order of word expansion is:
|
|
.Bl -enum
|
|
.It
|
|
Tilde Expansion, Parameter Expansion, Command Substitution,
|
|
Arithmetic Expansion (these all occur at the same time).
|
|
.It
|
|
Field Splitting is performed on fields
|
|
generated by step (1) unless the
|
|
.Ev IFS
|
|
variable is null.
|
|
.It
|
|
Pathname Expansion (unless set
|
|
.Fl f
|
|
is in effect).
|
|
.It
|
|
Quote Removal.
|
|
.El
|
|
.Pp
|
|
The $ character is used to introduce parameter expansion, command
|
|
substitution, or arithmetic evaluation.
|
|
.Ss Tilde Expansion (substituting a user's home directory)
|
|
A word beginning with an unquoted tilde character (~) is
|
|
subjected to tilde expansion.
|
|
All the characters up to
|
|
a slash (/) or the end of the word are treated as a username
|
|
and are replaced with the user's home directory.
|
|
If the username is missing (as in
|
|
.Pa ~/foobar ) ,
|
|
the tilde is replaced with the value of the
|
|
.Va HOME
|
|
variable (the current user's home directory).
|
|
.Ss Parameter Expansion
|
|
The format for parameter expansion is as follows:
|
|
.Pp
|
|
.Dl ${expression}
|
|
.Pp
|
|
where expression consists of all characters until the matching
|
|
.Dq } .
|
|
Any
|
|
.Dq }
|
|
escaped by a backslash or within a quoted string, and characters in
|
|
embedded arithmetic expansions, command substitutions, and variable
|
|
expansions, are not examined in determining the matching
|
|
.Dq } .
|
|
.Pp
|
|
The simplest form for parameter expansion is:
|
|
.Pp
|
|
.Dl ${parameter}
|
|
.Pp
|
|
The value, if any, of parameter is substituted.
|
|
.Pp
|
|
The parameter name or symbol can be enclosed in braces, which are
|
|
optional except for positional parameters with more than one digit or
|
|
when parameter is followed by a character that could be interpreted as
|
|
part of the name.
|
|
If a parameter expansion occurs inside double quotes:
|
|
.Bl -enum
|
|
.It
|
|
Pathname expansion is not performed on the results of the expansion.
|
|
.It
|
|
Field splitting is not performed on the results of the
|
|
expansion, with the exception of the special rules for @.
|
|
.El
|
|
.Pp
|
|
In addition, a parameter expansion can be modified by using one of the
|
|
following formats.
|
|
If the
|
|
.Dq Dv \&:
|
|
is omitted in the following modifiers, then the expansion is applied only
|
|
to unset parameters, not null ones.
|
|
.Bl -tag -width aaparameterwordaaaaa
|
|
.It ${parameter:-word}
|
|
Use Default Values.
|
|
If parameter is unset or null, the expansion of word
|
|
is substituted; otherwise, the value of parameter is substituted.
|
|
.It ${parameter:=word}
|
|
Assign Default Values.
|
|
If parameter is unset or null, the expansion of
|
|
word is assigned to parameter.
|
|
In all cases, the final value of parameter is substituted.
|
|
Only variables, not positional parameters or special
|
|
parameters, can be assigned in this way.
|
|
.It ${parameter:?[word]}
|
|
Indicate Error if Null or Unset.
|
|
If parameter is unset or null, the
|
|
expansion of word (or a message indicating it is unset if word is omitted)
|
|
is written to standard error and the shell exits with a nonzero exit status.
|
|
Otherwise, the value of parameter is substituted.
|
|
An interactive shell need not exit.
|
|
.It ${parameter:+word}
|
|
Use Alternative Value.
|
|
If parameter is unset or null, null is
|
|
substituted; otherwise, the expansion of word is substituted.
|
|
.It ${#parameter}
|
|
String Length.
|
|
The length in characters of the value of parameter.
|
|
.El
|
|
.Pp
|
|
The following four varieties of parameter expansion provide for substring
|
|
processing.
|
|
In each case, pattern matching notation (see
|
|
.Sx Shell Patterns ) ,
|
|
rather than regular expression notation, is used to evaluate the patterns.
|
|
If parameter is * or @, the result of the expansion is unspecified.
|
|
Enclosing the full parameter expansion string in double quotes does not
|
|
cause the following four varieties of pattern characters to be quoted,
|
|
whereas quoting characters within the braces has this effect.
|
|
.Bl -tag -width aaparameterwordaaaaa
|
|
.It ${parameter%word}
|
|
Remove Smallest Suffix Pattern.
|
|
The word is expanded to produce a pattern.
|
|
The parameter expansion then results in parameter, with the
|
|
smallest portion of the suffix matched by the pattern deleted.
|
|
.It ${parameter%%word}
|
|
Remove Largest Suffix Pattern.
|
|
The word is expanded to produce a pattern.
|
|
The parameter expansion then results in parameter, with the largest
|
|
portion of the suffix matched by the pattern deleted.
|
|
.It ${parameter#word}
|
|
Remove Smallest Prefix Pattern.
|
|
The word is expanded to produce a pattern.
|
|
The parameter expansion then results in parameter, with the
|
|
smallest portion of the prefix matched by the pattern deleted.
|
|
.It ${parameter##word}
|
|
Remove Largest Prefix Pattern.
|
|
The word is expanded to produce a pattern.
|
|
The parameter expansion then results in parameter, with the largest
|
|
portion of the prefix matched by the pattern deleted.
|
|
.El
|
|
.Ss Command Substitution
|
|
Command substitution allows the output of a command to be substituted in
|
|
place of the command name itself.
|
|
Command substitution occurs when the command is enclosed as follows:
|
|
.Pp
|
|
.Dl $(command)
|
|
.Pp
|
|
or
|
|
.Po
|
|
.Dq backquoted
|
|
version
|
|
.Pc :
|
|
.Pp
|
|
.Dl `command`
|
|
.Pp
|
|
The shell expands the command substitution by executing command in a
|
|
subshell environment and replacing the command substitution with the
|
|
standard output of the command, removing sequences of one or more
|
|
.Ao newline Ac Ns s
|
|
at the end of the substitution.
|
|
(Embedded
|
|
.Ao newline Ac Ns s
|
|
before
|
|
the end of the output are not removed; however, during field splitting,
|
|
they may be translated into
|
|
.Ao space Ac Ns s ,
|
|
depending on the value of
|
|
.Ev IFS
|
|
and quoting that is in effect.)
|
|
.Ss Arithmetic Expansion
|
|
Arithmetic expansion provides a mechanism for evaluating an arithmetic
|
|
expression and substituting its value.
|
|
The format for arithmetic expansion is as follows:
|
|
.Pp
|
|
.Dl $((expression))
|
|
.Pp
|
|
The expression is treated as if it were in double quotes, except
|
|
that a double quote inside the expression is not treated specially.
|
|
The shell expands all tokens in the expression for parameter expansion,
|
|
command substitution, and quote removal.
|
|
.Pp
|
|
Next, the shell treats this as an arithmetic expression and
|
|
substitutes the value of the expression.
|
|
.Pp
|
|
Arithmetic expressions use a syntax similar to that
|
|
of the C language, and are evaluated using the
|
|
.Ql intmax_t
|
|
data type (this is an extension to
|
|
.Tn POSIX ,
|
|
which requires only
|
|
.Ql long
|
|
arithmetic).
|
|
Shell variables may be referenced by name inside an arithmetic
|
|
expression, without needing a
|
|
.Dq \&$
|
|
sign.
|
|
.Ss White Space Splitting (Field Splitting)
|
|
After parameter expansion, command substitution, and
|
|
arithmetic expansion the shell scans the results of
|
|
expansions and substitutions that did not occur in double quotes for
|
|
field splitting and multiple fields can result.
|
|
.Pp
|
|
The shell treats each character of the
|
|
.Ev IFS
|
|
as a delimiter and use the delimiters to split the results of parameter
|
|
expansion and command substitution into fields.
|
|
.Pp
|
|
Non-whitespace characters in
|
|
.Ev IFS
|
|
are treated strictly as parameter terminators.
|
|
So adjacent non-whitespace
|
|
.Ev IFS
|
|
characters will produce empty parameters.
|
|
.Pp
|
|
If
|
|
.Ev IFS
|
|
is unset it is assumed to contain space, tab, and newline.
|
|
.Ss Pathname Expansion (File Name Generation)
|
|
Unless the
|
|
.Fl 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.
|
|
The next section describes the
|
|
patterns used for both Pathname Expansion and the
|
|
.Ic case
|
|
command.
|
|
.Ss Shell Patterns
|
|
A pattern consists of normal characters, which match themselves,
|
|
and meta-characters.
|
|
The meta-characters are
|
|
.Dq \&! ,
|
|
.Dq * ,
|
|
.Dq \&? ,
|
|
and
|
|
.Dq \&[ .
|
|
These characters lose their special meanings if they are quoted.
|
|
When command or variable substitution is performed
|
|
and the dollar sign or backquotes 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
|
|
An asterisk
|
|
.Pq Dq *
|
|
matches any string of characters.
|
|
A question mark
|
|
.Pq Dq \&?
|
|
matches any single character.
|
|
A left bracket
|
|
.Pq Dq \&[
|
|
introduces a character class.
|
|
The end of the character class is indicated by a right bracket
|
|
.Pq Dq \&] ;
|
|
if this
|
|
.Dq \&]
|
|
is missing then the
|
|
.Dq \&[
|
|
matches a
|
|
.Dq \&[
|
|
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
|
|
.Pq Dq - .
|
|
The character class may be complemented
|
|
by making an exclamation mark
|
|
.Pq Dq \&!
|
|
the first character of the character class.
|
|
.Pp
|
|
To include a
|
|
.Dq \&]
|
|
in a character class, make it the first character listed (after the
|
|
.Dq \&! ,
|
|
if any).
|
|
To include a
|
|
.Dq - ,
|
|
make it the first or last character listed.
|
|
.Ss Built-ins
|
|
This section lists the built-in commands which are built-in 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 that may
|
|
be built in for efficiency (e.g.
|
|
.Xr printf 1 ,
|
|
.Xr echo 1 ,
|
|
.Xr test 1 ,
|
|
etc).
|
|
.Bl -tag -width 5n
|
|
.It :
|
|
A null command that returns a 0 (true) exit value.
|
|
.It \&. file
|
|
The commands in the specified file are read and executed by the shell.
|
|
.It alias Op Ar name Ns Op Ar "=string ..."
|
|
If
|
|
.Ar name=string
|
|
is specified, the shell defines the alias
|
|
.Ar name
|
|
with value
|
|
.Ar string .
|
|
If just
|
|
.Ar name
|
|
is specified, the value of the alias
|
|
.Ar name
|
|
is printed.
|
|
With no arguments, the
|
|
.Ic alias
|
|
built-in prints the
|
|
names and values of all defined aliases (see
|
|
.Ic unalias ) .
|
|
.It bg [ Ar job ] ...
|
|
Continue the specified jobs (or the current job if no
|
|
jobs are given) in the background.
|
|
.It command Oo Fl p Oc Oo Fl v Oc Oo Fl V Oc Ar command Oo Ar arg ... Oc
|
|
Execute the specified command but ignore shell functions when searching
|
|
for it.
|
|
(This is useful when you
|
|
have a shell function with the same name as a built-in command.)
|
|
.Bl -tag -width 5n
|
|
.It Fl p
|
|
search for command using a
|
|
.Ev PATH
|
|
that guarantees to find all the standard utilities.
|
|
.It Fl V
|
|
Do not execute the command but
|
|
search for the command and print the resolution of the
|
|
command search.
|
|
This is the same as the
|
|
.Ic type
|
|
built-in.
|
|
.It Fl v
|
|
Do not execute the command but
|
|
search for the command and print the absolute pathname
|
|
of utilities, the name for built-ins or the expansion of aliases.
|
|
.El
|
|
.It cd Oo Fl P Oc Op Ar directory Op Ar replace
|
|
Switch to the specified directory (default
|
|
.Ev $HOME ) .
|
|
If
|
|
.Ar replace
|
|
is specified, then the new directory name is generated by replacing
|
|
the first occurrence of
|
|
.Ar directory
|
|
in the current directory name with
|
|
.Ar replace .
|
|
If
|
|
.Ar directory
|
|
is
|
|
.Sq - ,
|
|
then the current working directory is changed to the previous current
|
|
working directory as set in
|
|
.Ev OLDPWD .
|
|
Otherwise if an entry for
|
|
.Ev CDPATH
|
|
appears in the environment of the
|
|
.Ic cd
|
|
command or the shell variable
|
|
.Ev CDPATH
|
|
is set and the directory name does not begin with a slash,
|
|
or its first (or only) component isn't dot or dot dot,
|
|
then the directories listed in
|
|
.Ev CDPATH
|
|
will be searched for the specified directory.
|
|
The format of
|
|
.Ev CDPATH
|
|
is the same as that of
|
|
.Ev PATH .
|
|
.Pp
|
|
The
|
|
.Fl P
|
|
option instructs the shell to update
|
|
.Ev PWD
|
|
with the specified physical directory path and change to that directory.
|
|
This is the default.
|
|
.Pp
|
|
When the directory changes, the variable
|
|
.Ev OLDPWD
|
|
is set to the working directory before the change.
|
|
.Pp
|
|
Some shells also support a
|
|
.Fl L
|
|
option, which instructs the shell to update
|
|
.Ev PWD
|
|
with the logical path and to change the current directory
|
|
accordingly.
|
|
This is not supported.
|
|
.Pp
|
|
In an interactive shell, the
|
|
.Ic 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
|
|
.Ev CDPATH
|
|
mechanism was used or because a symbolic link was crossed.
|
|
.It eval Ar string ...
|
|
Concatenate all the arguments with spaces.
|
|
Then re-parse and execute the command.
|
|
.It exec Op Ar command arg ...
|
|
Unless command is omitted, the shell process is replaced with the
|
|
specified program (which must be a real program, not a shell built-in or
|
|
function).
|
|
Any redirections on the
|
|
.Ic exec
|
|
command are marked as permanent, so that they are not undone when the
|
|
.Ic exec
|
|
command finishes.
|
|
.It exit Op Ar exitstatus
|
|
Terminate the shell process.
|
|
If
|
|
.Ar exitstatus
|
|
is given it is used as the exit status of the shell; otherwise the
|
|
exit status of the preceding command is used.
|
|
.It export Ar name ...
|
|
.It export Fl p
|
|
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.
|
|
The shell allows the value of a variable to be set at the
|
|
same time it is exported by writing
|
|
.Pp
|
|
.Dl export name=value
|
|
.Pp
|
|
With no arguments the export command lists the names of all exported variables.
|
|
With the
|
|
.Fl p
|
|
option specified the output will be formatted suitably for non-interactive use.
|
|
.It fc Oo Fl e Ar editor Oc Oo Ar first Oo Ar last Oc Oc
|
|
.It fc Fl l Oo Fl nr Oc Oo Ar first Oo Ar last Oc Oc
|
|
.It fc Fl s Oo Ar old=new Oc Oo Ar first Oc
|
|
The
|
|
.Ic fc
|
|
built-in lists, or edits and re-executes, commands previously entered
|
|
to an interactive shell.
|
|
.Bl -tag -width 5n
|
|
.It Fl e No editor
|
|
Use the editor named by editor to edit the commands.
|
|
The editor string is a command name, subject to search via the
|
|
.Ev PATH
|
|
variable.
|
|
The value in the
|
|
.Ev FCEDIT
|
|
variable is used as a default when
|
|
.Fl e
|
|
is not specified.
|
|
If
|
|
.Ev FCEDIT
|
|
is null or unset, the value of the
|
|
.Ev EDITOR
|
|
variable is used.
|
|
If
|
|
.Ev EDITOR
|
|
is null or unset,
|
|
.Xr ed 1
|
|
is used as the editor.
|
|
.It Fl l No (ell)
|
|
List the commands rather than invoking an editor on them.
|
|
The commands are written in the sequence indicated by
|
|
the first and last operands, as affected by
|
|
.Fl r ,
|
|
with each command preceded by the command number.
|
|
.It Fl n
|
|
Suppress command numbers when listing with -l.
|
|
.It Fl r
|
|
Reverse the order of the commands listed (with
|
|
.Fl l )
|
|
or edited (with neither
|
|
.Fl l
|
|
nor
|
|
.Fl s ) .
|
|
.It Fl s
|
|
Re-execute the command without invoking an editor.
|
|
.It first
|
|
.It last
|
|
Select the commands to list or edit.
|
|
The number of previous commands that
|
|
can be accessed are determined by the value of the
|
|
.Ev HISTSIZE
|
|
variable.
|
|
The value of first or last or both are one of the following:
|
|
.Bl -tag -width 5n
|
|
.It [+]number
|
|
A positive number representing a command number; command numbers can be
|
|
displayed with the
|
|
.Fl l
|
|
option.
|
|
.It Fl number
|
|
A negative decimal number representing the command that was executed
|
|
number of commands previously.
|
|
For example, \-1 is the immediately previous command.
|
|
.El
|
|
.It string
|
|
A string indicating the most recently entered command that begins with
|
|
that string.
|
|
If the old=new operand is not also specified with
|
|
.Fl s ,
|
|
the string form of the first operand cannot contain an embedded equal sign.
|
|
.El
|
|
.Pp
|
|
The following environment variables affect the execution of fc:
|
|
.Bl -tag -width HISTSIZE
|
|
.It Ev FCEDIT
|
|
Name of the editor to use.
|
|
.It Ev HISTSIZE
|
|
The number of previous commands that are accessible.
|
|
.El
|
|
.It fg Op Ar job
|
|
Move the specified job or the current job to the foreground.
|
|
.It getopts Ar optstring var
|
|
The
|
|
.Tn POSIX
|
|
.Ic getopts
|
|
command, not to be confused with the
|
|
.Em Bell Labs
|
|
-derived
|
|
.Xr getopt 1 .
|
|
.Pp
|
|
The first argument should be a series of letters, each of which may be
|
|
optionally followed by a colon to indicate that the option requires an
|
|
argument.
|
|
The variable specified is set to the parsed option.
|
|
.Pp
|
|
The
|
|
.Ic getopts
|
|
command deprecates the older
|
|
.Xr getopt 1
|
|
utility due to its handling of arguments containing whitespace.
|
|
.Pp
|
|
The
|
|
.Ic getopts
|
|
built-in may be used to obtain options and their arguments
|
|
from a list of parameters.
|
|
When invoked,
|
|
.Ic getopts
|
|
places the value of the next option from the option string in the list in
|
|
the shell variable specified by
|
|
.Va var
|
|
and its index in the shell variable
|
|
.Ev OPTIND .
|
|
When the shell is invoked,
|
|
.Ev OPTIND
|
|
is initialized to 1.
|
|
For each option that requires an argument, the
|
|
.Ic getopts
|
|
built-in will place it in the shell variable
|
|
.Ev OPTARG .
|
|
If an option is not allowed for in the
|
|
.Va optstring ,
|
|
then
|
|
.Ev OPTARG
|
|
will be unset.
|
|
.Pp
|
|
.Va optstring
|
|
is a string of recognized option letters (see
|
|
.Xr getopt 3 ) .
|
|
If a letter is followed by a colon, the option is expected to have an
|
|
argument which may or may not be separated from it by whitespace.
|
|
If an option character is not found where expected,
|
|
.Ic getopts
|
|
will set the variable
|
|
.Va var
|
|
to a
|
|
.Dq \&? ;
|
|
.Ic getopts
|
|
will then unset
|
|
.Ev OPTARG
|
|
and write output to standard error.
|
|
By specifying a colon as the first character of
|
|
.Va optstring
|
|
all errors will be ignored.
|
|
.Pp
|
|
A nonzero value is returned when the last option is reached.
|
|
If there are no remaining arguments,
|
|
.Ic getopts
|
|
will set
|
|
.Va var
|
|
to the special option,
|
|
.Dq -- ,
|
|
otherwise, it will set
|
|
.Va var
|
|
to
|
|
.Dq \&? .
|
|
.Pp
|
|
The following code fragment shows how one might process the arguments
|
|
for a command that can take the options
|
|
.Op a
|
|
and
|
|
.Op b ,
|
|
and the option
|
|
.Op c ,
|
|
which requires an argument.
|
|
.Bd -literal -offset indent
|
|
while getopts abc: f
|
|
do
|
|
case $f in
|
|
a | b) flag=$f;;
|
|
c) carg=$OPTARG;;
|
|
\e?) echo $USAGE; exit 1;;
|
|
esac
|
|
done
|
|
shift $(expr $OPTIND - 1)
|
|
.Ed
|
|
.Pp
|
|
This code will accept any of the following as equivalent:
|
|
.Bd -literal -offset indent
|
|
cmd \-acarg file file
|
|
cmd \-a \-c arg file file
|
|
cmd \-carg -a file file
|
|
cmd \-a \-carg \-\- file file
|
|
.Ed
|
|
.It hash Fl rv Ar command ...
|
|
The shell maintains a hash table which remembers the
|
|
locations of commands.
|
|
With no arguments whatsoever,
|
|
the
|
|
.Ic hash
|
|
command prints out the contents of this table.
|
|
Entries which have not been looked at since the last
|
|
.Ic cd
|
|
command are marked with an asterisk; it is possible for these entries
|
|
to be invalid.
|
|
.Pp
|
|
With arguments, the
|
|
.Ic hash
|
|
command removes the specified commands from the hash table (unless
|
|
they are functions) and then locates them.
|
|
With the
|
|
.Fl v
|
|
option, hash prints the locations of the commands as it finds them.
|
|
The
|
|
.Fl r
|
|
option causes the hash command to delete all the entries in the hash table
|
|
except for functions.
|
|
.It inputrc Ar file
|
|
Read the
|
|
.Va file
|
|
to set keybindings as defined by
|
|
.Xr editrc 5 .
|
|
.It jobid Op Ar job
|
|
Print the process id's of the processes in the job.
|
|
If the
|
|
.Ar job
|
|
argument is omitted, the current job is used.
|
|
.It jobs
|
|
This command lists out all the background processes
|
|
which are children of the current shell process.
|
|
.It pwd Op Fl \&LP
|
|
Print the current directory.
|
|
If
|
|
.Fl L
|
|
is specified the cached value (initially set from
|
|
.Ev PWD )
|
|
is checked to see if it refers to the current directory; if it does
|
|
the value is printed.
|
|
Otherwise the current directory name is found using
|
|
.Xr getcwd 3 .
|
|
The environment variable
|
|
.Ev PWD
|
|
is set to the printed value.
|
|
.Pp
|
|
The default is
|
|
.Ic pwd
|
|
.Fl L ,
|
|
but note that the built-in
|
|
.Ic cd
|
|
command doesn't currently support the
|
|
.Fl L
|
|
option and will cache (almost) the absolute path.
|
|
If
|
|
.Ic cd
|
|
is changed,
|
|
.Ic pwd
|
|
may be changed to default to
|
|
.Ic pwd
|
|
.Fl P .
|
|
.Pp
|
|
If the current directory is renamed and replaced by a symlink to the
|
|
same directory, or the initial
|
|
.Ev PWD
|
|
value followed a symbolic link, then the cached value may not
|
|
be the absolute path.
|
|
.Pp
|
|
The built-in command may differ from the program of the same name because
|
|
the program will use
|
|
.Ev PWD
|
|
and the built-in uses a separately cached value.
|
|
.It read Oo Fl p Ar prompt Oc Oo Fl r Oc Ar variable Oo Ar ... Oc
|
|
The prompt is printed if the
|
|
.Fl 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
|
|
.Sx Word Expansions
|
|
section 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
|
|
.Ev 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
|
|
.Ic read
|
|
built-in will indicate success unless EOF is encountered on input, in
|
|
which case failure is returned.
|
|
.Pp
|
|
By default, unless the
|
|
.Fl r
|
|
option is specified, the backslash
|
|
.Dq \e
|
|
acts as an escape character, causing the following character to be treated
|
|
literally.
|
|
If a backslash is followed by a newline, the backslash and the
|
|
newline will be deleted.
|
|
.It readonly Ar name ...
|
|
.It readonly Fl p
|
|
The specified names are marked as read only, so that they cannot be
|
|
subsequently modified or unset.
|
|
The shell allows the value of a variable
|
|
to be set at the same time it is marked read only by writing
|
|
.Pp
|
|
.Dl readonly name=value
|
|
.Pp
|
|
With no arguments the readonly command lists the names of all read only
|
|
variables.
|
|
With the
|
|
.Fl p
|
|
option specified the output will be formatted suitably for non-interactive use.
|
|
.Pp
|
|
.It set Oo { Fl options | Cm +options | Cm \-- } Oc Ar arg ...
|
|
The
|
|
.Ic set
|
|
command performs three different functions.
|
|
.Pp
|
|
With no arguments, it lists the values of all shell variables.
|
|
.Pp
|
|
If options are given, it sets the specified option
|
|
flags, or clears them as described in the
|
|
.Sx Argument List Processing
|
|
section.
|
|
.Pp
|
|
The third use of the set command is to set the values of the shell's
|
|
positional parameters to the specified arguments.
|
|
To change the positional
|
|
parameters without changing any options, use
|
|
.Dq --
|
|
as the first argument to set.
|
|
If no arguments are present, the set command
|
|
will clear all the positional parameters (equivalent to executing
|
|
.Dq shift $# . )
|
|
.It setvar Ar variable Ar value
|
|
Assigns value to variable.
|
|
(In general it is better to write
|
|
variable=value rather than using
|
|
.Ic setvar .
|
|
.Ic setvar
|
|
is intended to be used in
|
|
functions that assign values to variables whose names are passed as
|
|
parameters.)
|
|
.It shift Op Ar n
|
|
Shift the positional parameters n times.
|
|
A
|
|
.Ic shift
|
|
sets the value of
|
|
.Va $1
|
|
to the value of
|
|
.Va $2 ,
|
|
the value of
|
|
.Va $2
|
|
to the value of
|
|
.Va $3 ,
|
|
and so on, decreasing
|
|
the value of
|
|
.Va $#
|
|
by one.
|
|
If there are zero positional parameters,
|
|
.Ic shift
|
|
does nothing.
|
|
.It trap Oo Fl l Oc
|
|
.It trap Oo Ar action Oc Ar signal ...
|
|
Cause the shell to parse and execute action when any of the specified
|
|
signals are received.
|
|
The signals are specified by signal number or as the name of the signal.
|
|
If
|
|
.Ar signal
|
|
is
|
|
.Li 0
|
|
or its equivalent, EXIT,
|
|
the action is executed when the shell exits.
|
|
.Ar action
|
|
may be null, which cause the specified signals to be ignored.
|
|
With
|
|
.Ar action
|
|
omitted or set to
|
|
.Sq -
|
|
the specified signals are set to their default action.
|
|
When the shell forks off a subshell, it resets trapped (but not ignored)
|
|
signals to the default action.
|
|
On non-interactive shells, the
|
|
.Ic trap
|
|
command has no effect on signals that were
|
|
ignored on entry to the shell.
|
|
On interactive shells, the
|
|
.Ic trap
|
|
command will catch or reset signals ignored on entry.
|
|
Issuing
|
|
.Ic trap
|
|
with option
|
|
.Ar -l
|
|
will print a list of valid signal names.
|
|
.Ic trap
|
|
without any arguments cause it to write a list of signals and their
|
|
associated action to the standard output in a format that is suitable
|
|
as an input to the shell that achieves the same trapping results.
|
|
.Pp
|
|
Examples:
|
|
.Pp
|
|
.Dl trap
|
|
.Pp
|
|
List trapped signals and their corresponding action
|
|
.Pp
|
|
.Dl trap -l
|
|
.Pp
|
|
Print a list of valid signals
|
|
.Pp
|
|
.Dl trap '' INT QUIT tstp 30
|
|
.Pp
|
|
Ignore signals INT QUIT TSTP USR1
|
|
.Pp
|
|
.Dl trap date INT
|
|
.Pp
|
|
Print date upon receiving signal INT
|
|
.It type Op Ar name ...
|
|
Interpret each name as a command and print the resolution of the command
|
|
search.
|
|
Possible resolutions are:
|
|
shell keyword, alias, shell built-in,
|
|
command, tracked alias and not found.
|
|
For aliases the alias expansion is
|
|
printed; for commands and tracked aliases the complete pathname of the
|
|
command is printed.
|
|
.It ulimit Oo Fl H \*(Ba Fl S Oc Oo Fl a \*(Ba Fl btfdscmlrpnv Oo Ar value Oc Oc
|
|
Inquire about or set the hard or soft limits on processes or set new
|
|
limits.
|
|
The choice between hard limit (which no process is allowed to
|
|
violate, and which may not be raised once it has been lowered) and soft
|
|
limit (which causes processes to be signaled but not necessarily killed,
|
|
and which may be raised) is made with these flags:
|
|
.Bl -tag -width Fl
|
|
.It Fl H
|
|
set or inquire about hard limits
|
|
.It Fl S
|
|
set or inquire about soft limits.
|
|
If neither
|
|
.Fl H
|
|
nor
|
|
.Fl S
|
|
is specified, the soft limit is displayed or both limits are set.
|
|
If both are specified, the last one wins.
|
|
.El
|
|
.Pp
|
|
The limit to be interrogated or set, then, is chosen by specifying
|
|
any one of these flags:
|
|
.Bl -tag -width Fl
|
|
.It Fl a
|
|
show all the current limits
|
|
.It Fl b
|
|
show or set the limit on the socket buffer size of a process (in bytes)
|
|
.It Fl t
|
|
show or set the limit on CPU time (in seconds)
|
|
.It Fl f
|
|
show or set the limit on the largest file that can be created
|
|
(in 512-byte blocks)
|
|
.It Fl d
|
|
show or set the limit on the data segment size of a process (in kilobytes)
|
|
.It Fl s
|
|
show or set the limit on the stack size of a process (in kilobytes)
|
|
.It Fl c
|
|
show or set the limit on the largest core dump size that can be produced
|
|
(in 512-byte blocks)
|
|
.It Fl m
|
|
show or set the limit on the total physical memory that can be
|
|
in use by a process (in kilobytes)
|
|
.It Fl l
|
|
show or set the limit on how much memory a process can lock with
|
|
.Xr mlock 2
|
|
(in kilobytes)
|
|
.It Fl r
|
|
show or set the limit on the number of threads this user can
|
|
have at one time
|
|
.It Fl p
|
|
show or set the limit on the number of processes this user can
|
|
have at one time
|
|
.It Fl n
|
|
show or set the limit on the number of files a process can have open at once
|
|
.It Fl v
|
|
show or set the limit on how large a process address space can be
|
|
.El
|
|
.Pp
|
|
If none of these is specified, it is the limit on file size that is shown
|
|
or set.
|
|
If value is specified, the limit is set to that number; otherwise
|
|
the current limit is displayed.
|
|
.Pp
|
|
Limits of an arbitrary process can be displayed or set using the
|
|
.Xr sysctl 8
|
|
utility.
|
|
.Pp
|
|
.It umask Op Ar mask
|
|
Set the value of umask (see
|
|
.Xr umask 2 )
|
|
to the specified octal value.
|
|
If the argument is omitted, the umask value is printed.
|
|
.It unalias Oo Fl a Oc Oo Ar name Oc
|
|
If
|
|
.Ar name
|
|
is specified, the shell removes that alias.
|
|
If
|
|
.Fl a
|
|
is specified, all aliases are removed.
|
|
.It unset Ar name ...
|
|
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.
|
|
.It wait Op Ar job
|
|
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 then return an exit status of zero.
|
|
.El
|
|
.Ss Command Line Editing
|
|
When
|
|
.Nm
|
|
is being used interactively from a terminal, the current command
|
|
and the command history (see
|
|
.Ic fc
|
|
in the
|
|
.Sx Built-ins
|
|
section)
|
|
can be edited using emacs-mode or vi-mode command-line editing.
|
|
The command
|
|
.Ql set -o emacs
|
|
enables emacs-mode editing.
|
|
The command
|
|
.Ql set -o vi
|
|
enables vi-mode editing and places the current shell process into
|
|
.Ar vi
|
|
insert mode.
|
|
(See the
|
|
.Sx Argument List Processing
|
|
section above.)
|
|
.Pp
|
|
The
|
|
.Ar vi
|
|
mode uses commands similar to a subset of those described in the
|
|
.Xr vi 1
|
|
man page.
|
|
With vi-mode
|
|
enabled,
|
|
.Nm sh
|
|
can be switched between insert mode and command mode.
|
|
It's similar to
|
|
.Xr vi 1 :
|
|
pressing the
|
|
.Aq ESC
|
|
key will throw you into command VI command mode.
|
|
Pressing the
|
|
.Aq return
|
|
key while in command mode will pass the line to the shell.
|
|
.Pp
|
|
The
|
|
.Ar emacs
|
|
mode uses commands similar to a subset available in
|
|
the
|
|
.Xr emacs 1
|
|
editor.
|
|
With emacs-mode enabled, special keys can be used to modify the text
|
|
in the buffer using the control key.
|
|
.Pp
|
|
.Nm
|
|
uses the
|
|
.Xr editline 3
|
|
library.
|
|
.Sh ENVIRONMENT
|
|
.Bl -tag -width MAILCHECK
|
|
.It Ev HOME
|
|
Set automatically by
|
|
.Xr login 1
|
|
from the user's login directory in the password file
|
|
.Pq Xr passwd 5 .
|
|
This environment variable also functions as the default argument for the
|
|
.Ic cd
|
|
built-in.
|
|
.It Ev PATH
|
|
The default search path for executables.
|
|
See the
|
|
.Sx Path Search
|
|
section above.
|
|
.It Ev CDPATH
|
|
The search path used with the
|
|
.Ic cd
|
|
built-in.
|
|
.It Ev LINENO
|
|
The current line number in the script or function.
|
|
.It Ev LANG
|
|
The string used to specify localization information that allows users
|
|
to work with different culture-specific and language conventions.
|
|
See
|
|
.Xr nls 7 .
|
|
.It Ev MAIL
|
|
The name of a mail file, that will be checked for the arrival of new mail.
|
|
Overridden by
|
|
.Ev MAILPATH .
|
|
.It Ev MAILCHECK
|
|
The frequency in seconds that the shell checks for the arrival of mail
|
|
in the files specified by the
|
|
.Ev MAILPATH
|
|
or the
|
|
.Ev MAIL
|
|
file.
|
|
If set to 0, the check will occur at each prompt.
|
|
.It Ev MAILPATH
|
|
A colon
|
|
.Dq \&:
|
|
separated list of file names, for the shell to check for incoming mail.
|
|
This environment setting overrides the
|
|
.Ev MAIL
|
|
setting.
|
|
There is a maximum of 10 mailboxes that can be monitored at once.
|
|
.It Ev PS1
|
|
The primary prompt string, which defaults to
|
|
.Dq $ \ ,
|
|
unless you are the superuser, in which case it defaults to
|
|
.Dq # \ .
|
|
.It Ev PS2
|
|
The secondary prompt string, which defaults to
|
|
.Dq \*[Gt] \ .
|
|
.It Ev PS4
|
|
Output before each line when execution trace (set -x) is enabled,
|
|
defaults to
|
|
.Dq + \ .
|
|
.It Ev IFS
|
|
Input Field Separators.
|
|
This is normally set to
|
|
.Aq space ,
|
|
.Aq tab ,
|
|
and
|
|
.Aq newline .
|
|
See the
|
|
.Sx White Space Splitting
|
|
section for more details.
|
|
.It Ev TERM
|
|
The default terminal setting for the shell.
|
|
This is inherited by
|
|
children of the shell, and is used in the history editing modes.
|
|
.It Ev HISTSIZE
|
|
The number of lines in the history buffer for the shell.
|
|
.El
|
|
.Sh FILES
|
|
.Bl -item
|
|
.It
|
|
.Pa $HOME/.profile
|
|
.It
|
|
.Pa /etc/profile
|
|
.El
|
|
.Sh EXIT STATUS
|
|
Errors that are detected by the shell, such as a syntax error, will cause the
|
|
shell to exit with a non-zero exit status.
|
|
If the shell is not an
|
|
interactive shell, the execution of the shell file will be aborted.
|
|
Otherwise
|
|
the shell will return the exit status of the last command executed, or
|
|
if the exit built-in is used with a numeric argument, it will return the
|
|
argument.
|
|
.Sh SEE ALSO
|
|
.Xr csh 1 ,
|
|
.Xr echo 1 ,
|
|
.Xr getopt 1 ,
|
|
.Xr ksh 1 ,
|
|
.Xr login 1 ,
|
|
.Xr printf 1 ,
|
|
.Xr test 1 ,
|
|
.Xr editline 3 ,
|
|
.Xr getopt 3 ,
|
|
.\" .Xr profile 4 ,
|
|
.Xr editrc 5 ,
|
|
.Xr passwd 5 ,
|
|
.Xr environ 7 ,
|
|
.Xr nls 7 ,
|
|
.Xr sysctl 8
|
|
.Sh HISTORY
|
|
A
|
|
.Nm
|
|
command appeared in
|
|
.At v1 .
|
|
It was, however, unmaintainable so we wrote this one.
|
|
.Sh BUGS
|
|
Setuid shell scripts should be avoided at all costs, as they are a
|
|
significant security risk.
|
|
.Pp
|
|
PS1, PS2, and PS4 should be subject to parameter expansion before
|
|
being displayed.
|
|
.Pp
|
|
The characters generated by filename completion should probably be quoted
|
|
to ensure that the filename is still valid after the input line has been
|
|
processed.
|