Appendix 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 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 (the last version of the historical Bourne shell) as the baseline reference.
- Bash is POSIX-conformant, even where the POSIX specification differs from traditional
shbehavior (see Bash POSIX Mode). - Bash has multi-character invocation options (see Invoking Bash).
- Bash has command-line editing (see Command Line Editing) and the
bindbuiltin. - Bash provides a programmable word completion mechanism (see Programmable Completion), and builtin commands
complete,compgen, andcompopt, to manipulate it. - Bash has command history (see Bash History Facilities) and the
historyandfcbuiltins to manipulate it. The Bash history list maintains timestamp information and uses the value of theHISTTIMEFORMATvariable to display it. - Bash implements
csh-like history expansion (see History Expansion). - Bash has one-dimensional array variables (see 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 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 Locale-Specific Translation). - Bash implements the
!keyword to negate the return value of a pipeline (see Pipelines). Very useful when anifstatement needs to act only if a test fails. The Bash ‘-o pipefail’ option tosetwill cause a pipeline to return a failure status if any command fails. - Bash has the
timereserved word and command timing (see Pipelines). The display of the timing statistics may be controlled with theTIMEFORMATvariable. - Bash implements the
for (( expr1 ; expr2 ; expr3 ))arithmetic for command, similar to the C language (see Looping Constructs). - Bash includes the
selectcompound command, which allows the generation of simple menus (see Conditional Constructs). - Bash includes the
[[compound command, which makes conditional testing part of the shell grammar (see Conditional Constructs), including optional regular expression matching. - Bash provides optional case-insensitive matching for the
caseand[[constructs. - Bash includes brace expansion (see Brace Expansion) and tilde expansion (see Tilde Expansion).
- Bash implements command aliases and the
aliasandunaliasbuiltins (see Aliases). - Bash provides shell arithmetic, the
((compound command (see Conditional Constructs), and arithmetic expansion (see 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
exportcommand. - Bash supports the ‘+=’ assignment operator, which appends to the value of the variable named on the left hand side.
- Bash includes the POSIX pattern removal ‘%’, ‘#’, ‘%%’ and ‘##’ expansions to remove leading or trailing substrings from variable values (see Shell Parameter Expansion).
- The expansion
${#xx}, which returns the length of${xx}, is supported (see Shell Parameter Expansion). - The expansion
${var:offset[:length]}, which expands to the substring ofvar’s value of length length, beginning at offset, is present (see Shell Parameter Expansion). - The expansion
${var/[/]pattern[/replacement]}, which matches pattern and replaces it with replacement in the value of var, is available (see Shell Parameter Expansion). - The expansion
${!prefix*}expansion, which expands to the names of all shell variables whose names begin with prefix, is available (see Shell Parameter Expansion). - Bash has indirect variable expansion using
${!word}(see Shell Parameter Expansion). - Bash can expand positional parameters beyond
$9using${num}. - The POSIX
$()form of command substitution is implemented (see Command Substitution), and preferred to the Bourne shell’s``(which is also implemented for backwards compatibility). - Bash has process substitution (see Process Substitution).
- Bash automatically assigns variables that provide information about the current user (
UID,EUID, andGROUPS), the current host (HOSTTYPE,OSTYPE,MACHTYPE, andHOSTNAME), and the instance of Bash that is running (BASH,BASH_VERSION, andBASH_VERSINFO). See Bash Variables, for details. - The
IFSvariable is used to split only the results of expansion, not all words (see Word Splitting). This closes a longstanding shell security hole. - The filename expansion bracket expression code uses ‘!’ and ‘^’ to negate the set of characters between the brackets. The Bourne shell uses only ‘!’.
- Bash implements the full set of POSIX filename expansion operators, including character classes, equivalence classes, and collating symbols (see Filename Expansion).
- Bash implements extended pattern matching features when the
extglobshell option is enabled (see Pattern Matching). - It is possible to have a variable and a function with the same name;
shdoes not separate the two name spaces. - Bash functions are permitted to have local variables using the
localbuiltin, and thus useful recursive functions may be written (see Bash Builtin Commands). - Variable assignments preceding commands affect only that command, even builtins and functions (see 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 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 Redirections).
- Bash includes the ‘<<<’ redirection operator, allowing a string to be used as the standard input to a command.
- Bash implements the ‘[n]<&word’ and ‘[n]>&word’ redirection operators, which move one file descriptor to another.
- Bash treats a number of filenames specially when they are used in redirection operators (see Redirections).
- Bash can open network connections to arbitrary machines and services with the redirection operators (see Redirections).
- The
noclobberoption is available to avoid overwriting existing files with output redirection (see The Set Builtin). The ‘>|’ redirection operator may be used to overridenoclobber. - The Bash
cdandpwdbuiltins (see 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
builtinandcommandbuiltins (see Bash Builtin Commands). - The
commandbuiltin allows selective disabling of functions when command lookup is performed (see Bash Builtin Commands). - Individual builtins may be enabled or disabled using the
enablebuiltin (see Bash Builtin Commands). - The Bash
execbuiltin 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 Bourne Shell Builtins). - Shell functions may be exported to children via the environment using
export -f(see Shell Functions). - The Bash
export,readonly, anddeclarebuiltins 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
hashbuiltin 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 Bourne Shell Builtins). - Bash includes a
helpbuiltin for quick reference to shell facilities (see Bash Builtin Commands). - The
printfbuiltin is available to display formatted output (see Bash Builtin Commands). - The Bash
readbuiltin (see Bash Builtin Commands) will read a line ending in ‘\’ with the -r option, and will use theREPLYvariable as a default if no non-option arguments are supplied. The Bashreadbuiltin also accepts a prompt string with the -p option and will use Readline to obtain the line when given the -e option. Thereadbuiltin 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 allowreadto 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
returnbuiltin may be used to abort execution of scripts executed with the.orsourcebuiltins (see Bourne Shell Builtins). - Bash includes the
shoptbuiltin, for finer control of shell optional capabilities (see The Shopt Builtin), and allows these options to be set and unset at shell invocation (see Invoking Bash). - Bash has much more optional behavior controllable with the
setbuiltin (see The Set Builtin). - The ‘-x’ (xtrace) option displays commands other than simple commands when performing an execution trace (see The Set Builtin).
- The
testbuiltin (see Bourne Shell Builtins) is slightly different, as it implements the POSIX algorithm, which specifies the behavior based on the number of arguments. - Bash includes the
callerbuiltin, which displays the context of any active subroutine call (a shell function or a script executed with the.orsourcebuiltins). This supports the Bash debugger. - The
trapbuiltin (see Bourne Shell Builtins) allows aDEBUGpseudo-signal specification, similar toEXIT. Commands specified with aDEBUGtrap are executed before every simple command,forcommand,casecommand,selectcommand, every arithmeticforcommand, and before the first command executes in a shell function. TheDEBUGtrap is not inherited by shell functions unless the function has been given thetraceattribute or thefunctraceoption has been enabled using theshoptbuiltin. Theextdebugshell option has additional effects on theDEBUGtrap.The
trapbuiltin (see Bourne Shell Builtins) allows anERRpseudo-signal specification, similar toEXITandDEBUG. Commands specified with anERRtrap are executed after a simple command fails, with a few exceptions. TheERRtrap is not inherited by shell functions unless the-o errtraceoption to thesetbuiltin is enabled.The
trapbuiltin (see Bourne Shell Builtins) allows aRETURNpseudo-signal specification, similar toEXITandDEBUG. Commands specified with aRETURNtrap are executed before execution resumes after a shell function or a shell script executed with.orsourcereturns. TheRETURNtrap is not inherited by shell functions unless the function has been given thetraceattribute or thefunctraceoption has been enabled using theshoptbuiltin. - The Bash
typebuiltin is more extensive and gives more information about the names it finds (see Bash Builtin Commands). - The Bash
umaskbuiltin permits a -p option to cause the output to be displayed in the form of aumaskcommand that may be reused as input (see Bourne Shell Builtins). - Bash implements a
csh-like directory stack, and provides thepushd,popd, anddirsbuiltins to manipulate it (see The Directory Stack). Bash also makes the directory stack visible as the value of theDIRSTACKshell variable. - Bash interprets special backslash-escaped characters in the prompt strings when interactive (see Controlling the Prompt).
- The Bash restricted mode is more useful (see The Restricted Shell); the SVR4.2 shell restricted mode is too limited.
- The
disownbuiltin can remove a job from the internal shell job table (see Job Control Builtins) or suppress the sending ofSIGHUPto a job when the shell exits as the result of aSIGHUP. - Bash includes a number of features to support a separate debugger for shell scripts.
- The SVR4.2 shell has two privilege-related builtins (
mldmodeandpriv) not present in Bash. - Bash does not have the
stopornewgrpbuiltins. - Bash does not use the
SHACCTvariable or perform shell accounting. - The SVR4.2
shuses aTIMEOUTvariable like Bash usesTMOUT.
More features unique to Bash may be found in 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
iforwhilestatement. - Bash does not allow unbalanced quotes. The SVR4.2 shell will silently insert a needed closing quote at
EOFunder 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 withSIGSEGVblocked (e.g., by using thesystem()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, orSIGCHLD. - The SVR4.2 shell does not allow the
IFS,MAILCHECK,PATH,PS1, orPS2variables 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 special builtins fails, and only for certain failures, as enumerated in the POSIX standard.
- The SVR4.2 shell behaves differently when invoked as
jsh(it turns on job control).
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Major-Differences-From-The-Bourne-Shell.html