|
|
|
|
B Major Differences From The Bourne Shell
Bash implements essentially the same grammar, parameter and
variable expansion, redirection, and quoting as the Bourne Shell.
Bash uses the POSIX 1003.2 standard as the specification of
how these features are to be implemented. There are some
differences between the traditional Bourne shell and Bash; this
section quickly details the differences of significance. A
number of these differences are explained in greater depth in
previous sections.
This section uses the version of sh included in SVR4.2 as
the baseline reference.
-
Bash is POSIX-conformant, even where the POSIX specification
differs from traditional
sh behavior (see section 6.11 Bash POSIX Mode).
-
Bash has multi-character invocation options (see section 6.1 Invoking Bash).
-
Bash has command-line editing (see section 8 Command Line Editing) and
the
bind builtin.
-
Bash provides a programmable word completion mechanism
(see section 8.6 Programmable Completion), and two builtin commands,
complete and compgen , to manipulate it.
-
Bash has command history (see section 9.1 Bash History Facilities) and the
history and fc builtins to manipulate it.
-
Bash implements
csh -like history expansion
(see section 9.3 History Expansion).
-
Bash has one-dimensional array variables (see section 6.7 Arrays), and the
appropriate variable expansions and assignment syntax to use them.
Several of the Bash builtins take options to act on arrays.
Bash provides a number of built-in array variables.
-
The
$'...' quoting syntax, which expands ANSI-C
backslash-escaped characters in the text between the single quotes,
is supported (see section 3.1.2.4 ANSI-C Quoting).
-
Bash supports the
$"..." quoting syntax to do
locale-specific translation of the characters between the double
quotes. The -D , --dump-strings , and --dump-po-strings
invocation options list the translatable strings found in a script
(see section 3.1.2.5 Locale-Specific Translation).
-
Bash implements the
! keyword to negate the return value of
a pipeline (see section 3.2.2 Pipelines).
Very useful when an if statement needs to act only if a test fails.
-
Bash has the
time reserved word and command timing (see section 3.2.2 Pipelines).
The display of the timing statistics may be controlled with the
TIMEFORMAT variable.
-
Bash implements the
for (( expr1 ; expr2 ; expr3 ))
arithmetic for command, similar to the C language (see section 3.2.4 Looping Constructs).
-
Bash includes the
select compound command, which allows the
generation of simple menus (see section 3.2.5 Conditional Constructs).
-
Bash includes the
[[ compound command, which makes conditional
testing part of the shell grammar (see section 3.2.5 Conditional Constructs).
-
Bash includes brace expansion (see section 3.5.1 Brace Expansion) and tilde
expansion (see section 3.5.2 Tilde Expansion).
-
Bash implements command aliases and the
alias and unalias
builtins (see section 6.6 Aliases).
-
Bash provides shell arithmetic, the
(( compound command
(see section 3.2.5 Conditional Constructs),
and arithmetic expansion (see section 6.5 Shell Arithmetic).
-
Variables present in the shell's initial environment are automatically
exported to child processes. The Bourne shell does not normally do
this unless the variables are explicitly marked using the
export
command.
-
Bash includes the POSIX pattern removal '%', '#', '%%'
and '##' expansions to remove leading or trailing substrings from
variable values (see section 3.5.3 Shell Parameter Expansion).
-
The expansion
${#xx} , which returns the length of ${xx} ,
is supported (see section 3.5.3 Shell Parameter Expansion).
-
The expansion
${var: offset[: length]} ,
which expands to the substring of var 's value of length
length, beginning at offset, is present
(see section 3.5.3 Shell Parameter Expansion).
-
The expansion
${var/[/] pattern[/ replacement]} ,
which matches pattern and replaces it with replacement in
the value of var , is available (see section 3.5.3 Shell Parameter Expansion).
-
The expansion
${!prefix}* expansion, which expands to
the names of all shell variables whose names begin with prefix,
is available (see section 3.5.3 Shell Parameter Expansion).
-
Bash has indirect variable expansion using
${!word}
(see section 3.5.3 Shell Parameter Expansion).
-
Bash can expand positional parameters beyond
$9 using
${num} .
-
The POSIX
$() form of command substitution
is implemented (see section 3.5.4 Command Substitution),
and preferred to the Bourne shell's " (which
is also implemented for backwards compatibility).
-
Bash has process substitution (see section 3.5.6 Process Substitution).
-
Bash automatically assigns variables that provide information about the
current user (
UID , EUID , and GROUPS ), the current host
(HOSTTYPE , OSTYPE , MACHTYPE , and HOSTNAME ),
and the instance of Bash that is running (BASH ,
BASH_VERSION , and BASH_VERSINFO ). See section 5.2 Bash Variables,
for details.
-
The
IFS variable is used to split only the results of expansion,
not all words (see section 3.5.7 Word Splitting).
This closes a longstanding shell security hole.
-
Bash implements the full set of POSIX 1003.2 filename expansion operators,
including character classes, equivalence classes, and
collating symbols (see section 3.5.8 Filename Expansion).
-
Bash implements extended pattern matching features when the
extglob
shell option is enabled (see section 3.5.8.1 Pattern Matching).
-
It is possible to have a variable and a function with the same name;
sh does not separate the two name spaces.
-
Bash functions are permitted to have local variables using the
local builtin, and thus useful recursive functions may be written
(see section 4.2 Bash Builtin Commands).
-
Variable assignments preceding commands affect only that command, even
builtins and functions (see section 3.7.4 Environment).
In
sh , all variable assignments
preceding commands are global unless the command is executed from the
file system.
-
Bash performs filename expansion on filenames specified as operands
to input and output redirection operators (see section 3.6 Redirections).
-
Bash contains the '<>' redirection operator, allowing a file to be
opened for both reading and writing, and the '&>' redirection
operator, for directing standard output and standard error to the same
file (see section 3.6 Redirections).
-
Bash treats a number of filenames specially when they are
used in redirection operators (see section 3.6 Redirections).
-
Bash can open network connections to arbitrary machines and services
with the redirection operators (see section 3.6 Redirections).
-
The
noclobber option is available to avoid overwriting existing
files with output redirection (see section 4.3 The Set Builtin).
The '>|' redirection operator may be used to override noclobber .
-
The Bash
cd and pwd builtins (see section 4.1 Bourne Shell Builtins)
each take -L and -P options to switch between logical and
physical modes.
-
Bash allows a function to override a builtin with the same name, and provides
access to that builtin's functionality within the function via the
builtin and command builtins (see section 4.2 Bash Builtin Commands).
-
The
command builtin allows selective disabling of functions
when command lookup is performed (see section 4.2 Bash Builtin Commands).
-
Individual builtins may be enabled or disabled using the
enable
builtin (see section 4.2 Bash Builtin Commands).
-
The Bash
exec builtin takes additional options that allow users
to control the contents of the environment passed to the executed
command, and what the zeroth argument to the command is to be
(see section 4.1 Bourne Shell Builtins).
-
Shell functions may be exported to children via the environment
using
export -f (see section 3.3 Shell Functions).
-
The Bash
export , readonly , and declare builtins can
take a -f option to act on shell functions, a -p option to
display variables with various attributes set in a format that can be
used as shell input, a -n option to remove various variable
attributes, and 'name=value' arguments to set variable attributes
and values simultaneously.
-
The Bash
hash builtin allows a name to be associated with
an arbitrary filename, even when that filename cannot be found by
searching the $PATH , using 'hash -p'
(see section 4.1 Bourne Shell Builtins).
-
Bash includes a
help builtin for quick reference to shell
facilities (see section 4.2 Bash Builtin Commands).
-
The
printf builtin is available to display formatted output
(see section 4.2 Bash Builtin Commands).
-
The Bash
read builtin (see section 4.2 Bash Builtin Commands)
will read a line ending in '\' with
the -r option, and will use the REPLY variable as a
default if no non-option arguments are supplied.
The Bash read builtin
also accepts a prompt string with the -p option and will use
Readline to obtain the line when given the -e option.
The read builtin also has additional options to control input:
the -s option will turn off echoing of input characters as
they are read, the -t option will allow read to time out
if input does not arrive within a specified number of seconds, the
-n option will allow reading only a specified number of
characters rather than a full line, and the -d option will read
until a particular character rather than newline.
-
The
return builtin may be used to abort execution of scripts
executed with the . or source builtins
(see section 4.1 Bourne Shell Builtins).
-
Bash includes the
shopt builtin, for finer control of shell
optional capabilities (see section 4.2 Bash Builtin Commands), and allows these options
to be set and unset at shell invocation (see section 6.1 Invoking Bash).
-
Bash has much more optional behavior controllable with the
set
builtin (see section 4.3 The Set Builtin).
-
The
test builtin (see section 4.1 Bourne Shell Builtins)
is slightly different, as it implements the POSIX algorithm,
which specifies the behavior based on the number of arguments.
-
The
trap builtin (see section 4.1 Bourne Shell Builtins) allows a
DEBUG pseudo-signal specification, similar to EXIT .
Commands specified with a DEBUG trap are executed after every
simple command.
The DEBUG trap is not inherited by shell functions unless the
function has been given the trace attribute.
The trap builtin (see section 4.1 Bourne Shell Builtins) allows an
ERR pseudo-signal specification, similar to EXIT and DEBUG .
Commands specified with an ERR trap are executed after a simple
command fails, with a few exceptions.
The ERR trap is not inherited by shell functions.
-
The Bash
type builtin is more extensive and gives more information
about the names it finds (see section 4.2 Bash Builtin Commands).
-
The Bash
umask builtin permits a -p option to cause
the output to be displayed in the form of a umask command
that may be reused as input (see section 4.1 Bourne Shell Builtins).
-
Bash implements a
csh -like directory stack, and provides the
pushd , popd , and dirs builtins to manipulate it
(see section 6.8 The Directory Stack).
Bash also makes the directory stack visible as the value of the
DIRSTACK shell variable.
-
Bash interprets special backslash-escaped characters in the prompt
strings when interactive (see section 6.9 Controlling the Prompt).
-
The Bash restricted mode is more useful (see section 6.10 The Restricted Shell);
the SVR4.2 shell restricted mode is too limited.
-
The
disown builtin can remove a job from the internal shell
job table (see section 7.2 Job Control Builtins) or suppress the sending
of SIGHUP to a job when the shell exits as the result of a
SIGHUP .
-
The SVR4.2 shell has two privilege-related builtins
(
mldmode and priv ) not present in Bash.
-
Bash does not have the
stop or newgrp builtins.
-
Bash does not use the
SHACCT variable or perform shell accounting.
-
The SVR4.2
sh uses a TIMEOUT variable like Bash uses
TMOUT .
More features unique to Bash may be found in section 6 Bash Features.
B.1 Implementation Differences From The SVR4.2 Shell
Since Bash is a completely new implementation, it does not suffer from
many of the limitations of the SVR4.2 shell. For instance:
-
Bash does not fork a subshell when redirecting into or out of
a shell control structure such as an
if or while
statement.
-
Bash does not allow unbalanced quotes. The SVR4.2 shell will silently
insert a needed closing quote at
EOF under certain circumstances.
This can be the cause of some hard-to-find errors.
-
The SVR4.2 shell uses a baroque memory management scheme based on
trapping
SIGSEGV . If the shell is started from a process with
SIGSEGV blocked (e.g., by using the system() C library
function call), it misbehaves badly.
-
In a questionable attempt at security, the SVR4.2 shell,
when invoked without the
-p option, will alter its real
and effective UID and GID if they are less than some
magic threshold value, commonly 100.
This can lead to unexpected results.
-
The SVR4.2 shell does not allow users to trap
SIGSEGV ,
SIGALRM , or SIGCHLD .
-
The SVR4.2 shell does not allow the
IFS , MAILCHECK ,
PATH , PS1 , or PS2 variables to be unset.
-
The SVR4.2 shell treats '^' as the undocumented equivalent of
'|'.
-
Bash allows multiple option arguments when it is invoked (
-x -v );
the SVR4.2 shell allows only one option argument (-xv ). In
fact, some versions of the shell dump core if the second argument begins
with a '-'.
-
The SVR4.2 shell exits a script if any builtin fails; Bash exits
a script only if one of the POSIX 1003.2 special builtins fails, and
only for certain failures, as enumerated in the POSIX 1003.2 standard.
-
The SVR4.2 shell behaves differently when invoked as
jsh
(it turns on job control).
|
|
|