1114 lines
41 KiB
Text
1114 lines
41 KiB
Text
.de SE \" start example
|
|
.sp .5
|
|
.RS
|
|
.ft CR
|
|
.nf
|
|
..
|
|
.de EE \" end example
|
|
.fi
|
|
.sp .5
|
|
.RE
|
|
.ft R
|
|
..
|
|
.TL
|
|
Bash \- The GNU shell*
|
|
.AU
|
|
Chet Ramey
|
|
Case Western Reserve University
|
|
chet@po.cwru.edu
|
|
.FS
|
|
*An earlier version of this article appeared in The Linux Journal.
|
|
.FE
|
|
.NH 1
|
|
Introduction
|
|
.PP
|
|
.B Bash
|
|
is the shell, or command language interpreter,
|
|
that will appear in the GNU operating system.
|
|
The name is an acronym for
|
|
the \*QBourne-Again SHell\*U, a pun on Steve Bourne, the author
|
|
of the direct ancestor of the current
|
|
.UX
|
|
shell \fI/bin/sh\fP,
|
|
which appeared in the Seventh Edition Bell Labs Research version
|
|
of \s-1UNIX\s+1.
|
|
.PP
|
|
Bash is an \fBsh\fP\-compatible shell that incorporates useful
|
|
features from the Korn shell (\fBksh\fP) and the C shell (\fBcsh\fP),
|
|
described later in this article. It is ultimately intended to be a
|
|
conformant implementation of the IEEE POSIX Shell and Utilities
|
|
specification (IEEE Working Group 1003.2). It offers functional
|
|
improvements over sh for both interactive and programming use.
|
|
.PP
|
|
While the GNU operating system will most likely include a version
|
|
of the Berkeley shell csh, Bash will be the default shell.
|
|
Like other GNU software, Bash is quite portable. It currently runs
|
|
on nearly every version of
|
|
.UX
|
|
and a few other operating systems \- an independently-supported
|
|
port exists for OS/2, and there are rumors of ports to DOS and
|
|
Windows NT. Ports to \s-1UNIX\s+1-like systems such as QNX and Minix
|
|
are part of the distribution.
|
|
.PP
|
|
The original author of Bash
|
|
was Brian Fox, an employee of the Free Software Foundation. The
|
|
current developer and maintainer is Chet Ramey, a volunteer who
|
|
works at Case Western Reserve University.
|
|
.NH 1
|
|
What's POSIX, anyway?
|
|
.PP
|
|
.I POSIX
|
|
is a name originally coined by Richard Stallman for a family of open
|
|
system standards based on \s-1UNIX\s+1. There are a number of aspects of \s-1UNIX\s+1
|
|
under consideration for standardization, from the basic system services
|
|
at the system call and C library level to applications and tools to system
|
|
administration and management. Each area of standardization is
|
|
assigned to a working group in the 1003 series.
|
|
.PP
|
|
The POSIX Shell and Utilities standard has been developed by IEEE Working
|
|
Group 1003.2 (POSIX.2).\(dd
|
|
.FS
|
|
\(ddIEEE, \fIIEEE Standard for Information Technology -- Portable
|
|
Operating System Interface (POSIX) Part 2: Shell and Utilities\fP,
|
|
1992.
|
|
.FE
|
|
It concentrates on the command interpreter
|
|
interface and utility programs
|
|
commonly executed from the command line or by other programs.
|
|
An initial version of the standard has been
|
|
approved and published by the IEEE, and work is currently underway to
|
|
update it.
|
|
There are four primary areas of work in the 1003.2 standard:
|
|
.IP \(bu
|
|
Aspects of the shell's syntax and command language.
|
|
A number of special builtins such as
|
|
.B cd
|
|
and
|
|
.B exec
|
|
are being specified as part of the shell, since their
|
|
functionality usually cannot be implemented by a separate executable;
|
|
.IP \(bu
|
|
A set of utilities to be called by shell scripts and applications.
|
|
Examples are programs like
|
|
.I sed,
|
|
.I tr,
|
|
and
|
|
.I awk.
|
|
Utilities commonly implemented as shell builtins
|
|
are described in this section, such as
|
|
.B test
|
|
and
|
|
.B kill .
|
|
An expansion of this section's scope, termed the User Portability
|
|
Extension, or UPE, has standardized interactive programs such as
|
|
.I vi
|
|
and
|
|
.I mailx;
|
|
.IP \(bu
|
|
A group of functional interfaces to services provided by the
|
|
shell, such as the traditional \f(CRsystem()\fP
|
|
C library function. There are functions to perform shell word
|
|
expansions, perform filename expansion (\fIglobbing\fP), obtain values
|
|
of POSIX.2 system configuration variables, retrieve values of
|
|
environment variables (\f(CRgetenv()\fP\^), and other services;
|
|
.IP \(bu
|
|
A suite of \*Qdevelopment\*U utilities such as
|
|
.I c89
|
|
(the POSIX.2 version of \fIcc\fP),
|
|
and
|
|
.I yacc.
|
|
.PP
|
|
Bash is concerned with the aspects of the shell's behavior
|
|
defined by POSIX.2. The shell command language has of
|
|
course been standardized, including the basic flow control
|
|
and program execution constructs, I/O redirection and
|
|
pipelining, argument handling, variable expansion, and quoting.
|
|
The
|
|
.I special
|
|
builtins, which must be implemented as part of the shell to
|
|
provide the desired functionality, are specified as being
|
|
part of the shell; examples of these are
|
|
.B eval
|
|
and
|
|
.B export .
|
|
Other utilities appear in the sections of POSIX.2 not
|
|
devoted to the shell which are commonly (and in some
|
|
cases must be) implemented as builtin commands, such as
|
|
.B read
|
|
and
|
|
.B test .
|
|
POSIX.2 also specifies aspects of the shell's
|
|
interactive behavior as part of
|
|
the UPE, including job control and command line editing.
|
|
Interestingly enough, only \fIvi\fP-style line editing commands
|
|
have been standardized; \fIemacs\fP editing commands were left
|
|
out due to objections.
|
|
.PP
|
|
While POSIX.2 includes much of what the shell has traditionally
|
|
provided, some important things have been omitted as being
|
|
\*Qbeyond its scope.\*U There is, for instance, no mention of
|
|
a difference between a
|
|
.I login
|
|
shell and any other interactive shell (since POSIX.2 does not
|
|
specify a login program). No fixed startup files are defined,
|
|
either \- the standard does not mention
|
|
.I .profile .
|
|
.NH 1
|
|
Basic Bash features
|
|
.PP
|
|
Since the Bourne shell
|
|
provides Bash with most of its philosophical underpinnings,
|
|
Bash inherits most of its features and functionality from sh.
|
|
Bash implements all of the traditional sh flow
|
|
control constructs (\fIfor\fP, \fIif\fP, \fIwhile\fP, etc.).
|
|
All of the Bourne shell builtins, including those not specified in
|
|
the POSIX.2 standard, appear in Bash. Shell \fIfunctions\fP,
|
|
introduced in the SVR2 version of the Bourne shell,
|
|
are similar to shell scripts, but are defined using a special
|
|
syntax and are executed in the same process as the calling shell.
|
|
Bash has shell functions
|
|
which behave in a fashion upward-compatible with sh functions.
|
|
There are certain shell
|
|
variables that Bash interprets in the same way as sh, such as
|
|
.B PS1 ,
|
|
.B IFS ,
|
|
and
|
|
.B PATH .
|
|
Bash implements essentially the same grammar, parameter and
|
|
variable expansion semantics, redirection, and quoting as the
|
|
Bourne shell. Where differences appear between the POSIX.2
|
|
standard and traditional sh behavior, Bash follows POSIX.
|
|
.PP
|
|
The Korn Shell (\fBksh\fP) is a descendant of the Bourne shell written
|
|
at AT&T Bell Laboratories by David Korn\(dg. It provides a number of
|
|
useful features that POSIX and Bash have adopted. Many of the
|
|
interactive facilities in POSIX.2 have their roots in the ksh:
|
|
for example, the POSIX and ksh job control facilities are nearly
|
|
identical. Bash includes features from the Korn Shell for both
|
|
interactive use and shell programming. For programming, Bash provides
|
|
variables such as
|
|
.B RANDOM
|
|
and
|
|
.B REPLY ,
|
|
the
|
|
.B typeset
|
|
builtin,
|
|
the ability to remove substrings from variables based on patterns,
|
|
and shell arithmetic.
|
|
.FS
|
|
\(dgMorris Bolsky and David Korn, \fIThe KornShell Command and
|
|
Programming Language\fP, Prentice Hall, 1989.
|
|
.FE
|
|
.B RANDOM
|
|
expands to a random number each time it is referenced; assigning a
|
|
value to
|
|
.B RANDOM
|
|
seeds the random number generator.
|
|
.B REPLY
|
|
is the default variable used by the
|
|
.B read
|
|
builtin when no variable names are supplied as arguments.
|
|
The
|
|
.B typeset
|
|
builtin is used to define variables and give them attributes
|
|
such as \fBreadonly\fP.
|
|
Bash arithmetic allows the evaluation of an expression and the
|
|
substitution of the result. Shell variables may be used as operands,
|
|
and the result of an expression may be assigned to a variable.
|
|
Nearly all of the operators from the C language are available,
|
|
with the same precedence rules:
|
|
.SE
|
|
$ echo $((3 + 5 * 32))
|
|
163
|
|
.EE
|
|
.LP
|
|
For interactive use, Bash implements ksh-style aliases and builtins
|
|
such as
|
|
.B fc
|
|
(discussed below) and
|
|
.B jobs .
|
|
Bash aliases allow a string to be substituted for a command name.
|
|
They can be used to create a mnemonic for a \s-1UNIX\s+1 command
|
|
name (\f(CRalias del=rm\fP), to expand a single word to a complex command
|
|
(\f(CRalias news='xterm -g 80x45 -title trn -e trn -e -S1 -N &'\fP), or to
|
|
ensure that a command is invoked with a basic set of options
|
|
(\f(CRalias ls="/bin/ls -F"\fP).
|
|
.PP
|
|
The C shell (\fBcsh\fP)\(dg, originally written by Bill Joy while at
|
|
Berkeley, is widely used and quite popular for its interactive
|
|
facilities. Bash includes a csh-compatible history expansion
|
|
mechanism (\*Q! history\*U), brace expansion, access to a stack
|
|
of directories via the
|
|
.B pushd ,
|
|
.B popd ,
|
|
and
|
|
.B dirs
|
|
builtins, and tilde expansion, to generate users' home directories.
|
|
Tilde expansion has also been adopted by both the Korn Shell and
|
|
POSIX.2.
|
|
.FS
|
|
\(dgBill Joy, An Introduction to the C Shell, \fIUNIX User's Supplementary
|
|
Documents\fP, University of California at Berkeley, 1986.
|
|
.FE
|
|
.PP
|
|
There were certain areas in which POSIX.2 felt standardization
|
|
was necessary, but no existing implementation provided the proper
|
|
behavior. The working group invented and standardized functionality
|
|
in these areas, which Bash implements. The
|
|
.B command
|
|
builtin was invented so that shell functions could be written to
|
|
replace builtins; it makes the capabilities of the builtin
|
|
available to the function. The reserved word \*Q!\*U was added
|
|
to negate the return value of a command or pipeline; it was nearly
|
|
impossible to express \*Qif not x\*U cleanly using the sh language.
|
|
There exist multiple incompatible implementations of the
|
|
.B test
|
|
builtin, which tests files for type and other attributes and performs
|
|
arithmetic and string comparisons.
|
|
POSIX considered none of these correct, so the standard
|
|
behavior was specified in terms of the number of arguments to the
|
|
command. POSIX.2 dictates exactly what will happen when four or
|
|
fewer arguments are given to
|
|
.B test ,
|
|
and leaves the behavior undefined when more arguments are supplied.
|
|
Bash uses the POSIX.2 algorithm, which was conceived by David Korn.
|
|
.NH 2
|
|
Features not in the Bourne Shell
|
|
.PP
|
|
There are a number of minor differences between Bash and the
|
|
version of sh present on most other versions of \s-1UNIX\s+1. The majority
|
|
of these are due to the POSIX standard, but some are the result of
|
|
Bash adopting features from other shells. For instance, Bash
|
|
includes the new \*Q!\*U reserved word, the
|
|
.B command
|
|
builtin, the ability of the
|
|
.B read
|
|
builtin to correctly return a line ending with a backslash, symbolic
|
|
arguments to the
|
|
.B umask
|
|
builtin, variable substring removal, a way to get the length of a variable,
|
|
and the new algorithm for the
|
|
.B test
|
|
builtin from the POSIX.2 standard, none of which appear in sh.
|
|
.PP
|
|
Bash also implements the \*Q$(...)\*U command substitution syntax,
|
|
which supersedes the sh `...` construct.
|
|
The \*Q$(...)\*U construct expands to the output of the command
|
|
contained within the
|
|
parentheses, with trailing newlines removed. The sh syntax is
|
|
accepted for backwards compatibility, but the \*Q$(...)\*U form
|
|
is preferred because its quoting rules are much simpler and it
|
|
is easier to nest.
|
|
.PP
|
|
The Bourne shell does not provide such features as brace expansion,
|
|
the ability
|
|
to define a variable and a function with the same name, local variables
|
|
in shell functions, the ability to enable and disable individual
|
|
builtins or write a function to replace a builtin, or a means to
|
|
export a shell function to a child process.
|
|
.PP
|
|
Bash has closed
|
|
a long-standing shell security hole by not using the
|
|
.B $IFS
|
|
variable to split each word read by the shell, but splitting only
|
|
the results of expansion (ksh and the 4.4 BSD sh have fixed this
|
|
as well). Useful behavior such as a means to abort
|
|
execution of a script read with the \*Q.\*U command using the
|
|
\fBreturn\fP builtin or automatically
|
|
exporting variables in the shell's environment to children is also
|
|
not present in the Bourne shell. Bash provides a much more powerful
|
|
environment for both interactive use and programming.
|
|
.NH 1
|
|
Bash-specific Features
|
|
.PP
|
|
This section details a few of the features which make Bash unique.
|
|
Most of them provide improved interactive use, but a few programming
|
|
improvements are present as well. Full descriptions of these
|
|
features can be found in the Bash documentation.
|
|
.NH 2
|
|
Startup Files
|
|
.PP
|
|
Bash executes startup files differently than other shells. The Bash
|
|
behavior is a compromise between the csh principle of startup files
|
|
with fixed names executed for each shell and the sh
|
|
\*Qminimalist\*U behavior. An interactive instance of Bash started
|
|
as a login shell reads and executes
|
|
.I ~/.bash_profile
|
|
(the file .bash_profile in the user's home directory), if it exists.
|
|
An interactive non-login shell reads and executes
|
|
.I ~/.bashrc .
|
|
A non-interactive shell (one begun to execute a shell script, for
|
|
example) reads no fixed startup file, but uses the value of the variable
|
|
.B $ENV ,
|
|
if set, as the name of a startup file. The ksh practice of reading
|
|
.B $ENV
|
|
for every shell, with the accompanying difficulty of defining the
|
|
proper variables and functions for interactive and non-interactive
|
|
shells or having the file read only for interactive shells, was
|
|
considered too complex. Ease of use won out here. Interestingly,
|
|
the next release of ksh will change to reading
|
|
.B $ENV
|
|
only for interactive shells.
|
|
.NH 2
|
|
New Builtin Commands
|
|
.PP
|
|
There are a few builtins which are new or have been extended in Bash.
|
|
The
|
|
.B enable
|
|
builtin allows builtin commands to be turned on and off arbitrarily.
|
|
To use the version of
|
|
.I echo
|
|
found in a user's search path rather than the Bash builtin,
|
|
\f(CRenable -n echo\fP suffices. The
|
|
.B help
|
|
builtin provides
|
|
quick synopses of the shell facilities without requiring
|
|
access to a manual page.
|
|
.B Builtin
|
|
is similar to
|
|
.B command
|
|
in that it bypasses shell functions and directly executes builtin
|
|
commands. Access to a csh-style stack of directories is provided
|
|
via the
|
|
.B pushd ,
|
|
.B popd ,
|
|
and
|
|
.B dirs
|
|
builtins.
|
|
.B Pushd
|
|
and
|
|
.B popd
|
|
insert and remove directories from the stack, respectively, and
|
|
.B dirs
|
|
lists the stack contents. On systems that allow fine-grained control
|
|
of resources, the
|
|
.B ulimit
|
|
builtin can be used to tune these settings.
|
|
.B Ulimit
|
|
allows a user to control,
|
|
among other things, whether core dumps are to be generated,
|
|
how much memory the shell or a child process is allowed to allocate,
|
|
and how large a file created by a child process can grow. The
|
|
.B suspend
|
|
command will stop the shell process when job control is active; most
|
|
other shells do not allow themselves to be stopped like that.
|
|
.B Type,
|
|
the Bash answer to
|
|
.B which
|
|
and
|
|
.B whence,
|
|
shows what will happen when a word is typed as a command:
|
|
.SE
|
|
$ type export
|
|
export is a shell builtin
|
|
$ type -t export
|
|
builtin
|
|
$ type bash
|
|
bash is /bin/bash
|
|
$ type cd
|
|
cd is a function
|
|
cd ()
|
|
{
|
|
builtin cd ${1+"$@"} && xtitle $HOST: $PWD
|
|
}
|
|
.EE
|
|
.LP
|
|
Various
|
|
modes tell what a command word is (reserved word, alias, function, builtin,
|
|
or file) or which version of a command will be executed based on
|
|
a user's search path. Some of this functionality has been adopted
|
|
by POSIX.2 and folded into the
|
|
.B command
|
|
utility.
|
|
.NH 2
|
|
Editing and Completion
|
|
.PP
|
|
One area in which Bash shines is command line editing. Bash uses the
|
|
.I readline
|
|
library to read and edit lines when interactive. Readline is a
|
|
powerful and flexible input facility that a user can configure to
|
|
individual tastes. It allows lines to be edited using either emacs
|
|
or vi commands, where those commands are appropriate. The full
|
|
capability of emacs is not present \- there is no way to execute
|
|
a named command with M-x, for instance \- but the existing commands
|
|
are more than adequate. The vi mode is compliant with
|
|
the command line editing standardized by POSIX.2.
|
|
.PP
|
|
Readline is fully customizable. In addition to the basic commands
|
|
and key bindings, the library allows users to define additional
|
|
key bindings using a startup file. The
|
|
.I inputrc
|
|
file, which defaults to the file
|
|
.I ~/.inputrc ,
|
|
is read each time readline initializes, permitting users to
|
|
maintain a consistent interface across a set of programs. Readline
|
|
includes an extensible interface, so each program using the
|
|
library can add its own bindable commands and program-specific
|
|
key bindings. Bash uses this facility to add bindings
|
|
that perform history expansion or shell word expansions on the current
|
|
input line.
|
|
.PP
|
|
Readline interprets a number of
|
|
variables which further tune its behavior. Variables
|
|
exist to control whether or not eight-bit characters are directly
|
|
read as input or converted to meta-prefixed key sequences (a
|
|
meta-prefixed key sequence consists of the character with the
|
|
eighth bit zeroed, preceded by the
|
|
.I meta-prefix
|
|
character, usually escape, which selects an alternate keymap), to
|
|
decide whether to output characters with the eighth bit set
|
|
directly or as a meta-prefixed key sequence, whether or not to
|
|
wrap to a new screen line when a line being edited is longer than
|
|
the screen width, the keymap to which subsequent key bindings should
|
|
apply, or even what happens when readline wants to
|
|
ring the terminal's bell. All of these variables can be set in
|
|
the inputrc file.
|
|
.PP
|
|
The startup file understands a set of C
|
|
preprocessor-like conditional constructs which allow variables or
|
|
key bindings to be assigned based on the application using readline,
|
|
the terminal currently being used, or the editing mode. Users can
|
|
add program-specific bindings to make their lives easier: I have
|
|
bindings that let me edit the value of
|
|
.B $PATH
|
|
and double-quote the current or previous word:
|
|
.SE
|
|
# Macros that are convenient for shell interaction
|
|
$if Bash
|
|
# edit the path
|
|
"\eC-xp": "PATH=${PATH}\ee\eC-e\eC-a\eef\eC-f"
|
|
# prepare to type a quoted word -- insert open and close double
|
|
# quotes and move to just after the open quote
|
|
"\eC-x\e"": "\e"\e"\eC-b"
|
|
# Quote the current or previous word
|
|
"\eC-xq": "\eeb\e"\eef\e""
|
|
$endif
|
|
.EE
|
|
.LP
|
|
There is a readline
|
|
command to re-read the file, so users can edit the file, change
|
|
some bindings, and begin to use them almost immediately.
|
|
.PP
|
|
Bash implements the
|
|
.B bind
|
|
builtin for more dynamic control of readline than the startup file
|
|
permits.
|
|
.B Bind
|
|
is used in several ways. In
|
|
.I list
|
|
mode, it can display the current key bindings, list all the
|
|
readline editing directives available for binding, list which keys
|
|
invoke a given directive, or output the current set of key
|
|
bindings in a format that can be incorporated directly into an inputrc
|
|
file. In
|
|
.I batch
|
|
mode, it reads a series of key bindings directly from a file and
|
|
passes them to readline. In its most common usage,
|
|
.B bind
|
|
takes a single string and passes it directly to readline, which
|
|
interprets the line as if it had just been read from the inputrc file.
|
|
Both key bindings and variable assignments may appear in the
|
|
string given to
|
|
.B bind .
|
|
.PP
|
|
The readline library also provides an interface for \fIword completion\fP.
|
|
When the
|
|
.I completion
|
|
character (usually TAB) is typed, readline looks at the word currently
|
|
being entered and computes the set of filenames of which the current
|
|
word is a valid prefix.
|
|
If there is only one possible completion, the
|
|
rest of the characters are inserted directly, otherwise the
|
|
common prefix of the set of filenames is added to the current word.
|
|
A second TAB character entered immediately after a non-unique
|
|
completion causes readline to list the possible completions; there is
|
|
an option to have the list displayed immediately.
|
|
Readline provides hooks so that applications can provide specific types
|
|
of completion before the default filename completion is attempted.
|
|
This is quite flexible, though it is not completely user-programmable.
|
|
Bash, for example, can complete filenames, command names (including aliases,
|
|
builtins, shell reserved words, shell functions, and executables found
|
|
in the file system), shell variables, usernames, and hostnames. It
|
|
uses a set of heuristics that, while not perfect, is generally quite
|
|
good at determining what type of completion to attempt.
|
|
.NH 2
|
|
History
|
|
.PP
|
|
Access to the list of commands previously entered (the \fIcommand history\fP)
|
|
is provided jointly by Bash and the readline library. Bash provides
|
|
variables (\fB$HISTFILE\fP, \fB$HISTSIZE\fP, and \fB$HISTCONTROL\fP)
|
|
and the
|
|
.B history
|
|
and
|
|
.B fc
|
|
builtins to manipulate the history list.
|
|
The value of
|
|
.B $HISTFILE
|
|
specifies the file where Bash writes the command history on exit and
|
|
reads it on startup.
|
|
.B $HISTSIZE
|
|
is used to limit the number of commands saved in the history.
|
|
.B $HISTCONTROL
|
|
provides a crude form of control over which commands are saved on
|
|
the history list: a value of
|
|
.I ignorespace
|
|
means to not save commands which begin with a space; a value of
|
|
.I ignoredups
|
|
means to not save commands identical to the last command saved.
|
|
\fB$HISTCONTROL\fP was named \fB$history_control\fP in earlier
|
|
versions of Bash; the old name is still accepted for backwards
|
|
compatibility. The
|
|
.B history
|
|
command can read or write files containing the history list
|
|
and display the current list contents. The
|
|
.B fc
|
|
builtin, adopted from POSIX.2 and the Korn Shell, allows display
|
|
and re-execution, with optional editing,
|
|
of commands from the history list. The readline
|
|
library offers a set of commands to search the history list for
|
|
a portion of the current input line or a string typed by the user.
|
|
Finally, the
|
|
.I history
|
|
library, generally incorporated directly into the readline library,
|
|
implements a facility for history recall, expansion, and re-execution
|
|
of previous commands very similar to csh
|
|
(\*Qbang history\*U, so called because the exclamation point
|
|
introduces a history substitution):
|
|
.SE
|
|
$ echo a b c d e
|
|
a b c d e
|
|
$ !! f g h i
|
|
echo a b c d e f g h i
|
|
a b c d e f g h i
|
|
$ !-2
|
|
echo a b c d e
|
|
a b c d e
|
|
$ echo !-2:1-4
|
|
echo a b c d
|
|
a b c d
|
|
.EE
|
|
.LP
|
|
The command history is only
|
|
saved when the shell is interactive, so it is not available for use
|
|
by shell scripts.
|
|
.NH 2
|
|
New Shell Variables
|
|
.PP
|
|
There are a number of convenience variables that Bash interprets
|
|
to make life easier. These include
|
|
.B FIGNORE ,
|
|
which is a set of filename suffixes identifying files to exclude when
|
|
completing filenames;
|
|
.B HOSTTYPE ,
|
|
which is automatically set to a string describing the type of
|
|
hardware on which Bash is currently executing;
|
|
.B command_oriented_history ,
|
|
which directs Bash to save all lines of a multiple-line
|
|
command such as a \fIwhile\fP or \fIfor\fP loop in a single
|
|
history entry, allowing easy re-editing; and
|
|
.B IGNOREEOF ,
|
|
whose value indicates the number of consecutive EOF characters that
|
|
an interactive shell will read before exiting \- an easy way to keep
|
|
yourself from being logged out accidentally. The
|
|
.B auto_resume
|
|
variable alters the way the shell treats simple command names:
|
|
if job control is active, and this variable is set, single-word
|
|
simple commands without redirections cause the shell to first
|
|
look for and restart a suspended job with that name before
|
|
starting a new process.
|
|
.NH 2
|
|
Brace Expansion
|
|
.PP
|
|
Since sh offers no convenient way to generate arbitrary strings that
|
|
share a common prefix or suffix (filename expansion requires that
|
|
the filenames exist), Bash implements \fIbrace expansion\fP, a
|
|
capability picked up from csh.
|
|
Brace expansion is similar to filename expansion, but the strings
|
|
generated need not correspond to existing files. A brace expression
|
|
consists of an optional
|
|
.I preamble ,
|
|
followed by a pair of braces enclosing a series of comma-separated
|
|
strings, and an optional
|
|
.I postamble .
|
|
The preamble is prepended to each string within the braces, and the
|
|
postamble is then appended to each resulting string:
|
|
.SE
|
|
$ echo a{d,c,b}e
|
|
ade ace abe
|
|
.EE
|
|
.LP
|
|
As this example demonstrates, the results of brace expansion are not
|
|
sorted, as they are by filename expansion.
|
|
.NH 2
|
|
Process Substitution
|
|
.PP
|
|
On systems that can support it, Bash provides a facility known as
|
|
\fIprocess substitution\fP. Process substitution is similar to command
|
|
substitution in that its specification includes a command to execute,
|
|
but the shell does not collect the command's output and insert it into
|
|
the command line. Rather, Bash opens a pipe to the command, which
|
|
is run in the background. The shell uses named pipes (FIFOs) or the
|
|
.I /dev/fd
|
|
method of naming open files to expand the process
|
|
substitution to a filename which connects to the pipe when opened.
|
|
This filename becomes the result of the expansion. Process substitution
|
|
can be used to compare the outputs of two different versions of an
|
|
application as part of a regression test:
|
|
.SE
|
|
$ cmp <(old_prog) <(new_prog)
|
|
.EE
|
|
.NH 2
|
|
Prompt Customization
|
|
.PP
|
|
One of the more popular interactive features that Bash provides is
|
|
the ability to customize the prompt. Both
|
|
.B $PS1
|
|
and
|
|
.B $PS2,
|
|
the primary and secondary prompts, are expanded before being
|
|
displayed. Parameter and variable expansion is performed when
|
|
the prompt string is expanded, so any shell variable can be
|
|
put into the prompt (e.g.,
|
|
.B $SHLVL ,
|
|
which indicates how deeply the current shell is nested).
|
|
Bash specially interprets characters in the prompt string
|
|
preceded by a backslash. Some of these backslash escapes are
|
|
replaced with
|
|
the current time, the date, the current working directory,
|
|
the username, and the command number or history number of the command
|
|
being entered. There is even a backslash escape to cause the shell
|
|
to change its prompt when running as root after an \fIsu\fP.
|
|
Before printing each primary prompt, Bash expands the variable
|
|
.B $PROMPT_COMMAND
|
|
and, if it has a value, executes the expanded value as a command,
|
|
allowing additional prompt customization. For example, this assignment
|
|
causes the current user, the current host, the time, the last
|
|
component of the current working directory, the level of shell
|
|
nesting, and the history number of the current command to be embedded
|
|
into the primary prompt:
|
|
.SE
|
|
$ PS1='\eu@\eh [\et] \eW($SHLVL:\e!)\e$ '
|
|
chet@odin [21:03:44] documentation(2:636)$ cd ..
|
|
chet@odin [21:03:54] src(2:637)$
|
|
.EE
|
|
.LP
|
|
The string being assigned is surrounded by single quotes so that if
|
|
it is exported, the value of
|
|
.B $SHLVL
|
|
will be updated by a child shell:
|
|
.SE
|
|
chet@odin [21:17:35] src(2:638)$ export PS1
|
|
chet@odin [21:17:40] src(2:639)$ bash
|
|
chet@odin [21:17:46] src(3:696)$
|
|
.EE
|
|
.LP
|
|
The \fP\e$\fP escape is displayed
|
|
as \*Q\fB$\fP\*U when running as a normal user, but as \*Q\fB#\fP\*U when
|
|
running as root.
|
|
.NH 2
|
|
File System Views
|
|
.PP
|
|
Since Berkeley introduced symbolic links in 4.2 BSD, one of their most
|
|
annoying properties has been the \*Qwarping\*U to a completely
|
|
different area of the file system when using
|
|
.B cd ,
|
|
and the resultant non-intuitive behavior of \*Q\fBcd ..\fP\*U.
|
|
The \s-1UNIX\s+1 kernel treats symbolic links
|
|
.I physically .
|
|
When the kernel is translating a pathname
|
|
in which one component is a symbolic link, it replaces all or part
|
|
of the pathname while processing the link. If the contents of the symbolic
|
|
link begin with a slash, the kernel replaces the
|
|
pathname entirely; if not, the link contents replace
|
|
the current component. In either case, the symbolic link
|
|
is visible. If the link value is an absolute pathname,
|
|
the user finds himself in a completely different part of the file
|
|
system.
|
|
.PP
|
|
Bash provides a
|
|
.I logical
|
|
view of the file system. In this default mode, command and filename
|
|
completion and builtin commands such as
|
|
.B cd
|
|
and
|
|
.B pushd
|
|
which change the current working directory transparently follow
|
|
symbolic links as if they were directories.
|
|
The
|
|
.B $PWD
|
|
variable, which holds the shell's idea of the current working directory,
|
|
depends on the path used to reach the directory rather than its
|
|
physical location in the local file system hierarchy. For example:
|
|
.SE
|
|
$ cd /usr/local/bin
|
|
$ echo $PWD
|
|
/usr/local/bin
|
|
$ pwd
|
|
/usr/local/bin
|
|
$ /bin/pwd
|
|
/net/share/sun4/local/bin
|
|
$ cd ..
|
|
$ pwd
|
|
/usr/local
|
|
$ /bin/pwd
|
|
/net/share/sun4/local
|
|
$ cd ..
|
|
$ pwd
|
|
/usr
|
|
$ /bin/pwd
|
|
/usr
|
|
.EE
|
|
.LP
|
|
One problem with this, of
|
|
course, arises when programs that do not understand the shell's logical
|
|
notion of the file system interpret \*Q..\*U differently. This generally
|
|
happens when Bash completes filenames containing \*Q..\*U according to a
|
|
logical hierarchy which does not correspond to their physical location.
|
|
For users who find this troublesome, a corresponding
|
|
.I physical
|
|
view of the file system is available:
|
|
.SE
|
|
$ cd /usr/local/bin
|
|
$ pwd
|
|
/usr/local/bin
|
|
$ set -o physical
|
|
$ pwd
|
|
/net/share/sun4/local/bin
|
|
.EE
|
|
.NH 2
|
|
Internationalization
|
|
.PP
|
|
One of the most significant improvements in version 1.13 of Bash was the
|
|
change to \*Qeight-bit cleanliness\*U. Previous versions used the
|
|
eighth bit of characters to mark whether or not they were
|
|
quoted when performing word expansions. While this did not affect
|
|
the majority of users, most of whom used only seven-bit ASCII characters,
|
|
some found it confining. Beginning with version 1.13, Bash
|
|
implemented a different quoting mechanism that did not alter the
|
|
eighth bit of characters. This allowed Bash
|
|
to manipulate files with \*Qodd\*U characters in their names, but
|
|
did nothing to help users enter those names, so
|
|
version 1.13 introduced changes to readline that
|
|
made it eight-bit clean as well. Options exist that force readline to
|
|
attach no special significance to characters with the eighth bit set
|
|
(the default behavior is to convert these characters to meta-prefixed
|
|
key sequences) and to output these characters without conversion to
|
|
meta-prefixed sequences. These changes, along with the expansion of
|
|
keymaps to a full eight bits, enable readline to work with most of the
|
|
ISO-8859 family of character sets, used by many European countries.
|
|
.NH 2
|
|
POSIX Mode
|
|
.PP
|
|
Although Bash is intended to be POSIX.2 conformant, there are areas in
|
|
which the default behavior is not compatible with the standard. For
|
|
users who wish to operate in a strict POSIX.2 environment, Bash
|
|
implements a \fIPOSIX mode\fP. When this mode is active, Bash modifies
|
|
its default operation where it differs from POSIX.2 to match the
|
|
standard. POSIX mode is entered when Bash is started with the
|
|
.B -posix
|
|
option. This feature is also available as an option to the
|
|
\fBset\fP builtin, \fBset -o posix\fP.
|
|
For compatibility with other GNU software that attempts to be POSIX.2
|
|
compliant, Bash also enters POSIX mode if the variable
|
|
.B $POSIXLY_CORRECT
|
|
is set when Bash is started or assigned a value during execution.
|
|
.B $POSIX_PEDANTIC
|
|
is accepted as well, to be compatible with some older GNU utilities.
|
|
When Bash is started in POSIX mode, for example, it sources the
|
|
file named by the value of
|
|
.B $ENV
|
|
rather than the \*Qnormal\*U startup files, and does not allow
|
|
reserved words to be aliased.
|
|
.NH 1
|
|
New Features and Future Plans
|
|
.PP
|
|
There are several features introduced in the current
|
|
version of Bash, version 1.14, and a number under consideration
|
|
for future releases. This section will briefly detail the new
|
|
features in version 1.14 and describe several features
|
|
that may appear in later versions.
|
|
.NH 2
|
|
New Features in Bash-1.14
|
|
.PP
|
|
The new features available in Bash-1.14 answer several of
|
|
the most common requests for enhancements. Most notably, there
|
|
is a mechanism
|
|
for including non-visible character sequences in prompts, such as
|
|
those which cause a terminal to print characters in different
|
|
colors or in standout mode. There was nothing preventing the use
|
|
of these sequences in earlier
|
|
versions, but the readline redisplay algorithm assumed each
|
|
character occupied physical screen space and would wrap lines
|
|
prematurely.
|
|
.PP
|
|
Readline has a few new
|
|
variables, several new bindable commands, and some additional
|
|
emacs mode default key bindings. A new history search
|
|
mode has been implemented: in this mode, readline searches the
|
|
history for lines beginning with the characters between the
|
|
beginning of the current line and the cursor. The existing readline
|
|
incremental search commands no longer match identical lines more
|
|
than once.
|
|
Filename completion now expands variables in directory names.
|
|
The history expansion facilities are now nearly
|
|
completely csh-compatible: missing modifiers have been added and
|
|
history substitution has been extended.
|
|
.PP
|
|
Several of the features described earlier, such as
|
|
.B "set -o posix"
|
|
and
|
|
.B $POSIX_PEDANTIC ,
|
|
are new in version 1.14.
|
|
There is a new shell variable,
|
|
.B OSTYPE ,
|
|
to which Bash assigns a value that identifies the
|
|
version of \s-1UNIX\s+1 it's
|
|
running on (great for putting architecture-specific binary directories
|
|
into the \fB$PATH\fP).
|
|
Two variables have been renamed:
|
|
.B $HISTCONTROL
|
|
replaces
|
|
.B $history_control ,
|
|
and
|
|
.B $HOSTFILE
|
|
replaces
|
|
.B $hostname_completion_file .
|
|
In both cases, the old names are accepted for backwards
|
|
compatibility. The ksh
|
|
.I select
|
|
construct, which allows the generation of simple menus,
|
|
has been implemented. New capabilities have been added
|
|
to existing variables:
|
|
.B $auto_resume
|
|
can now take values of
|
|
.I exact
|
|
or
|
|
.I substring ,
|
|
and
|
|
.B $HISTCONTROL
|
|
understands the value
|
|
.I ignoreboth ,
|
|
which combines the two previously acceptable values. The
|
|
.B dirs
|
|
builtin has acquired options to print out specific members of the
|
|
directory stack. The
|
|
.B $nolinks
|
|
variable, which forces a physical view of the file system,
|
|
has been superseded by the
|
|
.B \-P
|
|
option to the
|
|
.B set
|
|
builtin (equivalent to \fBset -o physical\fP); the variable is retained
|
|
for backwards compatibility. The version string contained in
|
|
.B $BASH_VERSION
|
|
now includes an indication of the patch level as well as the
|
|
\*Qbuild version\*U.
|
|
Some little-used features have
|
|
been removed: the
|
|
.B bye
|
|
synonym for
|
|
.B exit
|
|
and the
|
|
.B $NO_PROMPT_VARS
|
|
variable are gone. There is now an organized test suite that can be
|
|
run as a regression test when building a new version of Bash.
|
|
.PP
|
|
The documentation has been thoroughly overhauled:
|
|
there is a new manual page on the readline library and the \fIinfo\fP
|
|
file has been updated to reflect the current version.
|
|
As always, as many bugs as possible have been fixed, although some
|
|
surely remain.
|
|
.NH 2
|
|
Other Features
|
|
.PP
|
|
There are a few features that I hope to include in later Bash releases.
|
|
Some are based on work already done in other shells.
|
|
.PP
|
|
In addition to simple variables, a future release of Bash will include
|
|
one-dimensional arrays, using the ksh
|
|
implementation of arrays as a model. Additions to the ksh syntax,
|
|
such as \fIvarname\fP=( ... ) to assign a list of words directly to
|
|
an array and a mechanism to allow
|
|
the
|
|
.B read
|
|
builtin to read a list of values directly into an array, would be
|
|
desirable. Given those extensions, the ksh
|
|
.B "set \-A"
|
|
syntax may not be worth supporting (the
|
|
.B \-A
|
|
option assigns a list of values to an array, but is a rather
|
|
peculiar special case).
|
|
.PP
|
|
Some shells include a means of \fIprogrammable\fP word
|
|
completion, where the user specifies on a per-command basis how the
|
|
arguments of the command are to be treated when completion is attempted:
|
|
as filenames, hostnames, executable files, and so on. The other
|
|
aspects of the current Bash implementation could remain as-is; the
|
|
existing heuristics would still be valid. Only when completing the
|
|
arguments to a simple command would the programmable completion be
|
|
in effect.
|
|
.PP
|
|
It would also be nice to give the user finer-grained
|
|
control over which commands are saved onto the history list. One
|
|
proposal is for a variable, tentatively named
|
|
.B HISTIGNORE ,
|
|
which would contain a colon-separated list of commands. Lines beginning
|
|
with these commands, after the restrictions of
|
|
.B $HISTCONTROL
|
|
have been applied, would not be placed onto the history list. The
|
|
shell pattern-matching capabilities could also be available when
|
|
specifying the contents of
|
|
.B $HISTIGNORE .
|
|
.PP
|
|
One thing that newer shells such as
|
|
.B wksh
|
|
(also known as
|
|
.B dtksh )
|
|
provide is a command to dynamically load code
|
|
implementing additional builtin commands into a running shell.
|
|
This new builtin would take an object file or shared library
|
|
implementing the \*Qbody\*U of the
|
|
builtin (\fIxxx_builtin()\fP for those familiar with Bash internals)
|
|
and a structure containing the name of the new command, the function
|
|
to call when the new builtin is invoked (presumably defined in the
|
|
shared object specified as an argument), and the documentation to be
|
|
printed by the
|
|
.B help
|
|
command (possibly present in the shared object as well). It would
|
|
manage the details of extending the internal table of builtins.
|
|
.PP
|
|
A few other builtins would also be desirable: two are the POSIX.2
|
|
.B getconf
|
|
command, which prints the values of system configuration variables
|
|
defined by POSIX.2, and a
|
|
.B disown
|
|
builtin, which causes a shell running
|
|
with job control active to \*Qforget about\*U one or more
|
|
background jobs in its internal jobs table. Using
|
|
.B getconf ,
|
|
for example, a user could retrieve a value for
|
|
.B $PATH
|
|
guaranteed to find all of the POSIX standard utilities, or
|
|
find out how long filenames may be in the file system containing
|
|
a specified directory.
|
|
.PP
|
|
There are no implementation timetables for any of these features, nor
|
|
are there concrete plans to include them. If anyone has comments on
|
|
these proposals, feel free to send me electronic mail.
|
|
.NH 1
|
|
Reflections and Lessons Learned
|
|
.PP
|
|
The lesson that has been repeated most often during Bash
|
|
development is that there are dark corners in the Bourne shell,
|
|
and people use all of them. In the original description of the
|
|
Bourne shell, quoting and the shell grammar are both poorly
|
|
specified and incomplete; subsequent descriptions have not helped
|
|
much. The grammar presented in Bourne's paper describing
|
|
the shell distributed with the Seventh Edition of \s-1UNIX\s+1\(dg
|
|
is so far off that it does not allow the command \f(CWwho|wc\fP.
|
|
In fact, as Tom Duff states:
|
|
.QP
|
|
Nobody really knows what the
|
|
Bourne shell's grammar is. Even examination of the source code is
|
|
little help.\(dd
|
|
.FS
|
|
\(dgS. R. Bourne, \*QUNIX Time-Sharing System: The UNIX Shell\*U,
|
|
\fIBell System Technical Journal\fP, 57(6), July-August, 1978, pp. 1971-1990.
|
|
.FE
|
|
.FS
|
|
\(ddTom Duff, \*QRc \- A Shell for Plan 9 and \s-1UNIX\s+1 systems\*U,
|
|
\fIProc. of the Summer 1990 EUUG Conference\fP, London, July, 1990,
|
|
pp. 21-33.
|
|
.FE
|
|
.LP
|
|
The POSIX.2 standard includes a \fIyacc\fP grammar that comes close
|
|
to capturing the Bourne shell's behavior, but it disallows some
|
|
constructs which sh accepts without complaint \- and there are
|
|
scripts out there that use them. It took a few versions and
|
|
several bug reports before Bash implemented sh-compatible quoting,
|
|
and there are still some \*Qlegal\*U sh constructs which Bash flags as
|
|
syntax errors. Complete sh compatibility is a tough nut.
|
|
.PP
|
|
The shell is bigger and slower than I would like, though the current
|
|
version is substantially faster than previously. The readline library
|
|
could stand a substantial rewrite. A hand-written parser to replace
|
|
the current \fIyacc\fP-generated one would probably result in a speedup,
|
|
and would solve one glaring problem: the shell could parse
|
|
commands in \*Q$(...)\*U constructs
|
|
as they are entered, rather than reporting errors when the construct
|
|
is expanded.
|
|
.PP
|
|
As always, there is some chaff to go with the wheat.
|
|
Areas of duplicated functionality need to be cleaned
|
|
up. There are several cases where Bash treats a variable specially to
|
|
enable functionality available another way (\fB$notify\fP vs.
|
|
\fBset -o notify\fP and \fB$nolinks\fP vs. \fBset -o physical\fP, for
|
|
instance); the special treatment of the variable name should probably
|
|
be removed. A few more things could stand removal; the
|
|
.B $allow_null_glob_expansion
|
|
and
|
|
.B $glob_dot_filenames
|
|
variables are of particularly questionable value.
|
|
The \fB$[...]\fP arithmetic evaluation syntax is redundant now that
|
|
the POSIX-mandated \fB$((...))\fP construct has been implemented,
|
|
and could be deleted.
|
|
It would be nice if the text output by the
|
|
.B help
|
|
builtin were external to the shell rather than compiled into it.
|
|
The behavior enabled by
|
|
.B $command_oriented_history ,
|
|
which causes the shell to attempt to save all lines of a multi-line
|
|
command in a single history entry, should be made the default and
|
|
the variable removed.
|
|
.NH 1
|
|
Availability
|
|
.PP
|
|
As with all other
|
|
GNU software, Bash is available for anonymous FTP from
|
|
.I prep.ai.mit.edu:/pub/gnu
|
|
and from other GNU software mirror sites. The current version is in
|
|
.I bash-1.14.1.tar.gz
|
|
in that directory. Use
|
|
.I archie
|
|
to find the nearest archive site. The
|
|
latest version is always available for FTP from
|
|
.I bash.CWRU.Edu:/pub/dist.
|
|
Bash documentation is available for FTP from
|
|
.I bash.CWRU.Edu:/pub/bash.
|
|
.PP
|
|
The Free Software Foundation sells tapes and CD-ROMs
|
|
containing Bash; send electronic mail to
|
|
\f(CRgnu@prep.ai.mit.edu\fP or call \f(CR+1-617-876-3296\fP
|
|
for more information.
|
|
.PP
|
|
Bash is also distributed with several versions of \s-1UNIX\s+1-compatible
|
|
systems. It is included as /bin/sh and /bin/bash on several Linux
|
|
distributions (more about the difference in a moment), and as contributed
|
|
software in BSDI's BSD/386* and FreeBSD.
|
|
.FS
|
|
*BSD/386 is a trademark of Berkeley Software Design, Inc.
|
|
.FE
|
|
.PP
|
|
The Linux distribution deserves special mention. There are two
|
|
configurations included in the standard Bash distribution: a
|
|
\*Qnormal\*U configuration, in which all of the standard features
|
|
are included, and a \*Qminimal\*U configuration, which omits job
|
|
control, aliases, history and command line editing, the directory
|
|
stack and
|
|
.B pushd/popd/dirs,
|
|
process substitution, prompt string special character decoding, and the
|
|
.I select
|
|
construct. This minimal version is designed to be a drop-in replacement
|
|
for the traditional \s-1UNIX\s+1 /bin/sh, and is included as the Linux
|
|
/bin/sh in several packagings.
|
|
.NH 1
|
|
Conclusion
|
|
.PP
|
|
Bash is a worthy successor to sh.
|
|
It is sufficiently portable
|
|
to run on nearly every version of \s-1UNIX\s+1 from
|
|
4.3 BSD to SVR4.2, and several \s-1UNIX\s+1 workalikes.
|
|
It is robust enough to replace sh on most of those systems,
|
|
and provides more functionality. It has several thousand regular users,
|
|
and their feedback has helped to make it as good as it is today \- a
|
|
testament to the benefits of free software.
|