diff options
| author | Jari Aalto <jari.aalto@cante.net> | 2000-03-17 21:46:59 +0000 |
|---|---|---|
| committer | Jari Aalto <jari.aalto@cante.net> | 2009-09-12 16:46:53 +0000 |
| commit | bb70624e964126b7ac4ff085ba163a9c35ffa18f (patch) | |
| tree | ba2dd4add13ada94b1899c6d4aca80195b80b74b /doc | |
| parent | b72432fdcc59300c6fe7c9d6c8a31ad3447933f5 (diff) | |
| download | android_external_bash-bb70624e964126b7ac4ff085ba163a9c35ffa18f.tar.gz android_external_bash-bb70624e964126b7ac4ff085ba163a9c35ffa18f.tar.bz2 android_external_bash-bb70624e964126b7ac4ff085ba163a9c35ffa18f.zip | |
Imported from ../bash-2.04.tar.gz.
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/FAQ | 622 | ||||
| -rw-r--r-- | doc/Makefile.in | 76 | ||||
| -rw-r--r-- | doc/bash.1 | 890 | ||||
| -rw-r--r-- | doc/bashref.info | 4132 | ||||
| -rw-r--r-- | doc/bashref.texi | 2881 | ||||
| -rw-r--r-- | doc/builtins.1 | 2 | ||||
| -rwxr-xr-x | doc/htmlpost.sh | 22 | ||||
| -rw-r--r-- | doc/rbash.1 | 8 | ||||
| -rw-r--r-- | doc/readline.3 | 11 |
9 files changed, 5442 insertions, 3202 deletions
@@ -1,4 +1,4 @@ -This is the Bash FAQ, version 3.0, for Bash version 2.03. +This is the Bash FAQ, version 3.7, for Bash version 2.04. This document contains a set of frequently-asked questions concerning Bash, the GNU Bourne-Again Shell. Bash is a freely-available command @@ -15,6 +15,8 @@ This document is available for anonymous FTP with the URL ftp://ftp.cwru.edu/pub/bash/FAQ +The Bash home page is http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html + ---------- Contents: @@ -34,8 +36,8 @@ A10) What is the bash `posix mode'? Section B: The latest version -B1) What's new in version 2.03? -B2) Are there any user-visible incompatibilities between bash-2.03 and +B1) What's new in version 2.04? +B2) Are there any user-visible incompatibilities between bash-2.04 and bash-1.14.7? Section C: Differences from other Unix shells @@ -56,26 +58,18 @@ D5) How can I pipe standard output and standard error from one command to D6) Now that I've converted from ksh to bash, are there equivalents to ksh features like autoloaded functions and the `whence' command? -Section E: How can I get bash to do certain things, and why does bash do - things the way it does? +Section E: Why does bash do certain things the way it does? E1) Why is the bash builtin `test' slightly different from /bin/test? E2) Why does bash sometimes say `Broken pipe'? -E3) How can I get bash to read and display eight-bit characters? -E4) How do I write a function `x' to replace builtin command `x', but - still invoke the command from within the function? -E5) When I have terminal escape sequences in my prompt, why does bash +E3) When I have terminal escape sequences in my prompt, why does bash wrap lines at the wrong column? -E6) How can I find the value of a shell variable whose name is the value - of another shell variable? -E7) If I pipe the output of a command into `read variable', why doesn't +E4) If I pipe the output of a command into `read variable', why doesn't the output show up in $variable when the read command finishes? -E8) I have a bunch of shell scripts that use backslash-escaped characters +E5) I have a bunch of shell scripts that use backslash-escaped characters in arguments to `echo'. Bash doesn't interpret these characters. Why not, and how can I make it understand them? -E9) Why doesn't a while or for loop get suspended when I type ^Z? -E10) How can I make the bash `time' reserved word print timing output that - looks like the output from my system's /usr/bin/time? +E6) Why doesn't a while or for loop get suspended when I type ^Z? Section F: Things to watch out for on certain Unix versions @@ -87,15 +81,31 @@ F3) Why does bash dump core after I interrupt username completion or F4) I'm running SVR4.2. Why is the line erased every time I type `@'? F5) Why does bash report syntax errors when my C News scripts use a redirection before a subshell command? +F6) Why can't I use vi-mode editing on Red Hat Linux 6.1? + +Section G: How can I get bash to do certain common things? + +G1) How can I get bash to read and display eight-bit characters? +G2) How do I write a function `x' to replace builtin command `x', but + still invoke the command from within the function? +G3) How can I find the value of a shell variable whose name is the value + of another shell variable? +G4) How can I make the bash `time' reserved word print timing output that + looks like the output from my system's /usr/bin/time? +G5) How do I get the current directory into my prompt? +G6) How can I rename "*.foo" to "*.bar"? +G7) How can I translate a filename from uppercase to lowercase? +G8) How can I write a filename expansion (globbing) pattern that will match + all files in the current directory except "." and ".."? -Section G: Where do I go from here? +Section H: Where do I go from here? -G1) How do I report bugs in bash, and where should I look for fixes and +H1) How do I report bugs in bash, and where should I look for fixes and advice? -G2) What kind of bash documentation is there? -G3) What's coming in future versions? -G4) What's on the bash `wish list'? -G5) When will the next release appear? +H2) What kind of bash documentation is there? +H3) What's coming in future versions? +H4) What's on the bash `wish list'? +H5) When will the next release appear? ---------- Section A: The Basics @@ -120,22 +130,22 @@ of Case Western Reserve University. A2) What's the latest version? -The latest version is 2.03, first made available on Friday, 19 Feburary 1999. +The latest version is 2.04, first made available on Friday, 17 March 2000. A3) Where can I get it? Bash is the GNU project's shell, and so is available from the master GNU archive site, ftp.gnu.org, and its mirrors. The latest version is also available for FTP from ftp.cwru.edu. -The following URLs tell how to get version 2.03: +The following URLs tell how to get version 2.04: -ftp://ftp.gnu.org/pub/gnu/bash-2.03.tar.gz -ftp://ftp.cwru.edu/pub/bash/bash-2.03.tar.gz +ftp://ftp.gnu.org/pub/gnu/bash/bash-2.04.tar.gz +ftp://ftp.cwru.edu/pub/bash/bash-2.04.tar.gz Formatted versions of the documentation are available with the URLs: -ftp://ftp.gnu.org/pub/gnu/bash-doc-2.03.tar.gz -ftp://ftp.cwru.edu/pub/bash/bash-doc-2.03.tar.gz +ftp://ftp.gnu.org/pub/gnu/bash/bash-doc-2.04.tar.gz +ftp://ftp.cwru.edu/pub/bash/bash-doc-2.04.tar.gz A4) On what machines will bash run? @@ -150,25 +160,25 @@ More information appears in the file `INSTALL' in the distribution. A5) Will bash run on operating systems other than Unix? Configuration specifics for Unix-like systems such as QNX and -LynxOS are included in the distribution. Bash-2.03 should +LynxOS are included in the distribution. Bash-2.04 should compile and run on Minix 2.0 (patches were contributed), but I don't believe anyone has built bash-2.x on earlier Minix versions yet. Bash has been ported to versions of Windows implementing the Win32 programming interface. This includes Windows 95 and Windows NT. -The port was done by Cygnus Solutions as part of their GNU-Win32 +The port was done by Cygnus Solutions as part of their CYGWIN project. For more information about the project, look at the URL -http://www.cygnus.com/misc/gnu-win32 +http:/sourceware.cygnus.com/cygwin Cygnus originally ported bash-1.14.7, and that port was part of their -early GNU-Win32 releases. Cygnus has also done a port of bash-2.01 to the -GNU-Win32 environment, and it is available as part of their current -release. (They may have upgraded by now.) +early GNU-Win32 (the original name) releases. Cygnus has also done a +port of bash-2.02.1 to the CYGWIN environment, and it is available as +part of their current release. (They may have upgraded by now.) -Bash-2.03 should require no local Cygnus changes to build and run under -GNU-WIN32. +Bash-2.04 should require no local Cygnus changes to build and run under +CYGWIN. The Cygnus port works only on Intel machines. There is a port of bash (I don't know which version) to the alpha/NT environment available from @@ -185,7 +195,7 @@ but Interix users should fetch ftp://ftp.interix.com/pub/tw/unsup/bash.diffs.tar.gz and read the README.OpenNT file in that archive. It will detail the -arguments configure needs to build on Interix. A configure cache +arguments `configure' needs to build on Interix. A configure cache file for Interix is in the bash distribution in cross-build/opennt.cache; copy that to `config.cache' before starting configure. @@ -203,6 +213,15 @@ The corresponding source is ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh1147s.zip +Mark Elbrecht <snowball3@bigfoot.com> has sent me notice that bash-2.03 +has become available for DJGPP V2. The files are available as: + +ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh203b.zip binary +ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh203d.zip documentation +ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh203s.zip source + +Mark has begun to work with bash-2.04. + Ports of bash-1.12 and bash-2.0 are available for OS/2 from ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash_112.zip @@ -211,6 +230,10 @@ ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash-2.0(253).zip I haven't looked at either, but the second appears to be a binary-only distribution. Beware. +I have received word that Bash (I'm not sure which version, but I +believe that it's at least bash-2.02.1) is the standard shell on +BeOS. + A6) How can I build bash with gcc? Bash configures to use gcc by default if it is available. Read the @@ -262,6 +285,33 @@ This will cause login shells to replace themselves with bash running as a login shell. Once you have this working, you can copy your initialization code from ~/.profile to ~/.bash_profile. +I have received word that the recipe supplied above is insufficient for +machines running CDE. CDE has a maze of twisty little startup files, all +slightly different. + +If you cannot change your login shell in the password file to bash, you +will have to (apparently) live with CDE using the shell in the password +file to run its startup scripts. If you have changed your shell to bash, +there is code in the CDE startup files (on Solaris, at least) to do the +right thing. + +`dtterm' claims to use $SHELL as the default program to start, so if you +can change $SHELL in the CDE startup files, you should be able to use bash +in your terminal windows. + +Setting DTSOURCEPROFILE in ~/.dtprofile will cause the `Xsession' program +to read your login shell's startup files. You may be able to use bash for +the rest of the CDE programs by setting SHELL to bash in ~/.dtprofile as +well, but I have not tried this. + +You can use the above `exec' recipe to start bash when not logging in with +CDE by testing the value of the DT variable: + + if [ -n "$DT" ]; then + [ -f /usr/gnu/bin/bash ] && exec /usr/gnu/bin/bash --login + fi + + A8) I just changed my login shell to bash, and now I can't FTP into my machine. Why not? @@ -324,16 +374,59 @@ Reference Manual. Section B: The latest version -B1) What's new in version 2.03? - -Bash-2.03 has a very few new features, in keeping with the convention +B1) What's new in version 2.04? + +Bash-2.04 contains the following new features (see the manual page for +complete descriptions and the CHANGES and NEWS files in the bash-2.04 +distribution): + +o Programmable word completion with the new `complete' and `compgen' builtins; + examples are provided in examples/complete/complete-examples +o `history' has a new `-d' option to delete a history entry +o `bind' has a new `-x' option to bind key sequences to shell commands +o The prompt expansion code has new `\j' and `\l' escape sequences +o The `no_empty_command_completion' shell option, if enabled, inhibits + command completion when TAB is typed on an empty line +o `help' has a new `-s' option to print a usage synopsis +o New arithmetic operators: var++, var--, ++var, --var, expr1,expr2 (comma) +o New ksh93-style arithmetic for command: + for ((expr1 ; expr2; expr3 )); do list; done +o `read' has new options: `-t', `-n', `-d', `-s' +o The redirection code handles several filenames specially: /dev/fd/N, + /dev/stdin, /dev/stdout, /dev/stderr +o The redirection code now recognizes /dev/tcp/HOST/PORT and + /dev/udp/HOST/PORT and tries to open a TCP or UDP socket, respectively, + to the specified port on the specified host +o The ${!prefix*} expansion has been implemented +o A new FUNCNAME variable, which expands to the name of a currently-executing + function +o The GROUPS variable is no longer readonly +o A new shopt `xpg_echo' variable, to control the behavior of echo with + respect to backslash-escape sequences at runtime +o The NON_INTERACTIVE_LOGIN_SHELLS #define has returned + +The version of Readline released with Bash-2.04, Readline-4.1, has several +new features as well: + +o Parentheses matching is always compiled into readline, and controllable + with the new `blink-matching-paren' variable +o The history-search-forward and history-search-backward functions now leave + point at the end of the line when the search string is empty, like + reverse-search-history, and forward-search-history +o A new function for applications: rl_on_new_line_with_prompt() +o New variables for applications: rl_already_prompted, and rl_gnu_readline_p + + +A short feature history dating from bash-2.0: + +Bash-2.03 had very few new features, in keeping with the convention that odd-numbered releases provide mainly bug fixes. A number of new features were added to Readline, mostly at the request of the Cygnus folks. -a new shopt option, `restricted_shell', so that startup files can test +A new shopt option, `restricted_shell', so that startup files can test whether or not the shell was started in restricted mode -filename generation is now performed on the words between ( and ) in +Filename generation is now performed on the words between ( and ) in compound array assignments (this is really a bug fix) OLDPWD is now auto-exported, as POSIX.2 requires ENV and BASH_ENV are read-only variables in a restricted shell @@ -342,7 +435,7 @@ Bash may now be linked against an already-installed Readline library, All shells begun with the `--login' option will source the login shell startup files, even if the shell is not interactive -There are lots of changes to the version of the Readline library released +There were lots of changes to the version of the Readline library released along with Bash-2.03. For a complete list of the changes, read the file CHANGES in the Bash-2.03 distribution. @@ -412,11 +505,11 @@ grammar tighter and smaller (66 reduce-reduce conflicts gone) lots of code now smaller and faster test suite greatly expanded -B2) Are there any user-visible incompatibilities between bash-2.03 and +B2) Are there any user-visible incompatibilities between bash-2.04 and bash-1.14.7? -There are a few incompatibilities between version 1.14.7 and version 2.03. -They are detailed in the file COMPAT in the bash-2.03 distribution. +There are a few incompatibilities between version 1.14.7 and version 2.04. +They are detailed in the file COMPAT in the bash-2.04 distribution. Section C: Differences from other Unix shells @@ -431,13 +524,15 @@ Things bash has that sh does not: `!' reserved word to invert pipeline return value `time' reserved word to time pipelines and shell builtins the `function' reserved word - the select compound command and reserved word + the `select' compound command and reserved word + arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done new $'...' and $"..." quoting the $(...) form of command substitution the $(<filename) form of command substitution, equivalent to $(cat filename) the ${#param} parameter value length operator the ${!param} indirect parameter expansion operator + the ${!param*} prefix expansion operator the ${param:length[:offset]} parameter substring operator the ${param/pat[/string]} parameter pattern substitution operator expansions to perform substring removal (${p%[%]w}, ${p#[#]w}) @@ -448,16 +543,18 @@ Things bash has that sh does not: ENV, PS3, PS4, DIRSTACK, PIPESTATUS, HISTSIZE, HISTFILE, HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE, GROUPS, PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC, - SHELLOPTS, OPTERR, HOSTFILE, TMOUT, histchars, auto_resume + SHELLOPTS, OPTERR, HOSTFILE, TMOUT, FUNCNAME, histchars, + auto_resume DEBUG trap variable arrays with new compound assignment syntax redirections: <>, &>, >| prompt string special char translation and variable expansion - auto-export of modified values of variables in initial environment + auto-export of variables in initial environment command search finds functions before builtins bash return builtin will exit a file sourced with `.' builtins: cd -/-L/-P, exec -l/-c/-a, echo -e/-E, hash -p. - export -n/-f/-p/name=value, pwd -L/-P, read -e/-p/-a, + export -n/-f/-p/name=value, pwd -L/-P, + read -e/-p/-a/-t/-n/-d/-s, readonly -a/-f/name=value, trap -l, set +o, set -b/-m/-o option/-h/-p/-B/-C/-H/-P, unset -f/-v, ulimit -m/-p/-u, @@ -473,12 +570,13 @@ Things bash has that sh does not: process substitution aliases and alias/unalias builtins local variables in functions and `local' builtin - readline and command-line editing + readline and command-line editing with programmable completion command history and history/fc builtins csh-like history expansion - other new bash builtins: bind, command, builtin, declare/typeset, - dirs, enable, fc, help, history, logout, - popd, pushd, disown, shopt, printf + other new bash builtins: bind, command, compgen, complete, builtin, + declare/typeset, dirs, enable, fc, help, + history, logout, popd, pushd, disown, shopt, + printf exported functions filename generation when using output redirection (command >a*) POSIX.2-style globbing character classes @@ -489,6 +587,8 @@ Things bash has that sh does not: variable assignments preceding commands affect only that command, even for builtins and functions posix mode + redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr, + /dev/tcp/host/port, /dev/udp/host/port Things sh has that bash does not: uses variable SHACCT to do shell accounting @@ -521,11 +621,13 @@ C2) How does bash differ from the Korn shell, version ksh88? Things bash has or uses that ksh88 does not: long invocation options `!' reserved word + arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done posix mode and posix conformance command hashing tilde expansion for assignment statements that look like $PATH process substitution with named pipes if /dev/fd is not available the ${!param} indirect parameter expansion operator + the ${!param*} prefix expansion operator the ${param:length[:offset]} parameter substring operator the ${param/pat[/string]} parameter pattern substitution operator variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, SHLVL, @@ -533,18 +635,19 @@ Things bash has or uses that ksh88 does not: HISTFILESIZE, HISTIGNORE, HISTCONTROL, PROMPT_COMMAND, IGNOREEOF, FIGNORE, INPUTRC, HOSTFILE, DIRSTACK, PIPESTATUS, HOSTNAME, OPTERR, SHELLOPTS, GLOBIGNORE, - GROUPS, histchars, auto_resume + GROUPS, FUNCNAME, histchars, auto_resume prompt expansion with backslash escapes and command substitution redirection: &> (stdout and stderr) - more extensive and extensible editing and completion + more extensive and extensible editing and programmable completion builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable, exec -l/-c/-a, fc -s, export -n/-f/-p, hash, help, history, jobs -x/-r/-s, kill -s/-n/-l, local, logout, popd, pushd, - read -e/-p/-a, readonly -a/-n/-f/-p, set -o braceexpand/ - -o histexpand/-o interactive-comments/-o notify/-o physical/ - -o posix/-o hashall/-o onecmd/-h/-B/-C/-b/-H/-P, set +o, - suspend, trap -l, type, typeset -a/-F/-p, ulimit -u, - umask -S, alias -p, shopt, disown, printf + read -e/-p/-a/-t/-n/-d/-s, readonly -a/-n/-f/-p, + set -o braceexpand/-o histexpand/-o interactive-comments/ + -o notify/-o physical/-o posix/-o hashall/-o onecmd/ + -h/-B/-C/-b/-H/-P, set +o, suspend, trap -l, type, + typeset -a/-F/-p, ulimit -u, umask -S, alias -p, shopt, + disown, printf, complete, compgen `!' csh-style history expansion POSIX.2-style globbing character classes POSIX.2-style globbing equivalence classes @@ -552,10 +655,11 @@ Things bash has or uses that ksh88 does not: egrep-like extended pattern matching operators case-insensitive pattern matching and globbing `**' arithmetic operator to do exponentiation + redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr Things ksh88 has or uses that bash does not: tracked aliases - variables: ERRNO, FPATH, COLUMNS, LINES, EDITOR, VISUAL + variables: ERRNO, FPATH, EDITOR, VISUAL co-processes (|&, >&p, <&p) weirdly-scoped functions typeset +f to list all function names without definitions @@ -574,30 +678,29 @@ Implementation differences: C3) Which new features in ksh-93 are not in bash, and which are? -New things in ksh-93 not in bash-2.03: +New things in ksh-93 not in bash-2.04: associative arrays floating point arithmetic - ++, --, comma arithmetic operators math library functions ${!name[sub]} name of subscript for associative array - ${!prefix*} and {!prefix@} variable name prefix expansions `.' is allowed in variable names to create a hierarchical namespace more extensive compound assignment syntax discipline functions `sleep' and `getconf' builtins (bash has loadable versions) typeset -n and `nameref' variables KEYBD trap - variables: .sh.edchar, .sh.edmode, .sh.edcol, .sh.edtext, HISTEDIT, - .sh.version, .sh.name, .sh.subscript, .sh.value + variables: .sh.edchar, .sh.edmode, .sh.edcol, .sh.edtext, .sh.version, + .sh.name, .sh.subscript, .sh.value, HISTEDIT backreferences in pattern matching - print -f (bash has a loadable version of print and the printf builtin) + print -f (bash uses printf) `fc' has been renamed to `hist' - read -t/-d `.' can execute shell functions -New things in ksh-93 present in bash-2.03: - ?: arithmetic operator - expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]} +New things in ksh-93 present in bash-2.04: + for (( expr1; expr2; expr3 )) ; do list; done - arithmetic for command + ?:, ++, --, `expr1 , expr2' arithmetic operators + expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]}, + ${!param*} compound array assignment the `!' reserved word loadable builtins -- but ksh uses `builtin' while bash uses `enable' @@ -607,6 +710,7 @@ New things in ksh-93 present in bash-2.03: set -o notify/-C changes to kill builtin read -A (bash uses read -a) + read -t/-d trap -p exec -c/-a `.' restores the positional parameters when it completes @@ -638,7 +742,7 @@ the following function definition to your .bashrc: which() { - builtin type -p "$@" + builtin type "$@" } If you're moving from tcsh and would like to bring `where' along @@ -771,8 +875,8 @@ descriptor 2. D6) Now that I've converted from ksh to bash, are there equivalents to ksh features like autoloaded functions and the `whence' command? -There are features in ksh-88 that do not have direct bash equivalents. -Most, however, can be emulated with very little trouble. +There are features in ksh-88 and ksh-93 that do not have direct bash +equivalents. Most, however, can be emulated with very little trouble. ksh-88 feature Bash equivalent -------------- --------------- @@ -784,6 +888,14 @@ cd, print, whence function substitutes in examples/functions/kshenv autoloaded functions examples/functions/autoload is the same as typeset -fu read var?prompt read -p prompt var +ksh-93 feature Bash equivalent +-------------- --------------- +sleep, getconf Bash has loadable versions in examples/loadables +${.sh.version} $BASH_VERSION +print -f printf +hist alias fc=hist +$HISTEDIT $FCEDIT + Section E: How can I get bash to do certain things, and why does bash do things the way it does? @@ -835,62 +947,7 @@ You can build a version of bash that will not report SIGPIPE errors by uncommenting the definition of DONT_REPORT_SIGPIPE in the file config-top.h. -E3) How can I get bash to read and display eight-bit characters? - -This is a process requiring several steps. - -First, you must ensure that the `physical' data path is a full eight -bits. For xterms, for example, the `vt100' resources `eightBitInput' -and `eightBitOutput' should be set to `true'. - -Once you have set up an eight-bit path, you must tell the kernel and -tty driver to leave the eighth bit of characters alone when processing -keyboard input. Use `stty' to do this: - - stty cs8 -istrip -parenb - -For old BSD-style systems, you can use - - stty pass8 - -You may also need - - stty even odd - -Finally, you need to tell readline that you will be inputting and -displaying eight-bit characters. You use readline variables to do -this. These variables can be set in your .inputrc or using the bash -`bind' builtin. Here's an example using `bind': - - bash$ bind 'set convert-meta off' - bash$ bind 'set meta-flag on' - bash$ bind 'set output-meta on' - -The `set' commands between the single quotes may also be placed -in ~/.inputrc. - -E4) How do I write a function `x' to replace builtin command `x', but - still invoke the command from within the function? - -This is why the `command' and `builtin' builtins exist. The -`command' builtin executes the command supplied as its first -argument, skipping over any function defined with that name. The -`builtin' builtin executes the builtin command given as its first -argument directly. - -For example, to write a function to replace `cd' that writes the -hostname and current directory to an xterm title bar, use -something like the following: - - cd() - { - builtin cd "$@" && xtitle "$HOST: $PWD" - } - -This could also be written using `command' instead of `builtin'; -the version above is marginally more efficient. - -E5) When I have terminal escape sequences in my prompt, why does bash +E3) When I have terminal escape sequences in my prompt, why does bash wrap lines at the wrong column? Readline, the line editing library that bash uses, does not know @@ -906,38 +963,7 @@ characters in the prompt strings take up no screen space. Use the \[ escape to begin a sequence of non-printing characters, and the \] escape to signal the end of such a sequence. -E6) How can I find the value of a shell variable whose name is the value - of another shell variable? - -Versions of Bash newer than Bash-2.0 support this directly. You can use - - ${!var} - -For example, the following sequence of commands will echo `z': - - var1=var2 - var2=z - echo ${!var1} - -For sh compatibility, use the `eval' builtin. The important -thing to remember is that `eval' expands the arguments you give -it again, so you need to quote the parts of the arguments that -you want `eval' to act on. - -For example, this expression prints the value of the last positional -parameter: - - eval echo \"\$\{$#\}\" - -The expansion of the quoted portions of this expression will be -deferred until `eval' runs, while the `$#' will be expanded -before `eval' is executed. In versions of bash later than bash-2.0, - - echo ${!#} - -does the same thing. - -E7) If I pipe the output of a command into `read variable', why doesn't +E4) If I pipe the output of a command into `read variable', why doesn't the output show up in $variable when the read command finishes? This has to do with the parent-child relationship between Unix @@ -993,13 +1019,13 @@ this. This is the general approach -- in most cases you will not need to set $IFS to a different value. -E8) I have a bunch of shell scripts that use backslash-escaped characters +E5) I have a bunch of shell scripts that use backslash-escaped characters in arguments to `echo'. Bash doesn't interpret these characters. Why not, and how can I make it understand them? This is the behavior of echo on most Unix System V machines. -The bash builtin `echo' is modelled after the 9th Edition +The bash builtin `echo' is modeled after the 9th Edition Research Unix version of `echo'. It does not interpret backslash-escaped characters in its argument strings by default; it requires the use of the -e option to enable the @@ -1013,7 +1039,11 @@ configure with the --enable-usg-echo-default option to turn this on. Be aware that this will cause some of the tests run when you type `make tests' to fail. -E9) Why doesn't a while or for loop get suspended when I type ^Z? +There is a shell option, `xpg_echo', settable with `shopt' that will +change the behavior of echo at runtime. Enabling this option turns +on expansion of backslash-escape sequences. + +E6) Why doesn't a while or for loop get suspended when I type ^Z? This is a consequence of how job control works on Unix. The only thing that can be suspended is the process group. This is a single @@ -1028,38 +1058,6 @@ If you want to be able to stop the entire loop, you need to put it within parentheses, which will force the loop into a subshell that may be stopped (and subsequently restarted) as a single unit. -E10) How can I make the bash `time' reserved word print timing output that - looks like the output from my system's /usr/bin/time? - -The bash command timing code looks for a variable `TIMEFORMAT' and -uses its value as a format string to decide how to display the -timing statistics. - -The value of TIMEFORMAT is a string with `%' escapes expanded in a -fashion similar in spirit to printf(3). The manual page explains -the meanings of the escape sequences in the format string. - -If TIMEFORMAT is not set, bash acts as if the following assignment had -been performed: - - TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS' - -The POSIX.2 default time format (used by `time -p command') is - - TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S' - -The BSD /usr/bin/time format can be emulated with: - - TIMEFORMAT=$'\t%1R real\t%1U user\t%1S sys' - -The System V /usr/bin/time format can be emulated with: - - TIMEFORMAT=$'\nreal\t%1R\nuser\t%1U\nsys\t%1S' - -The ksh format can be emulated with: - - TIMEFORMAT=$'\nreal\t%2lR\nuser\t%2lU\nsys\t%2lS' - Section F: Things to watch out for on certain Unix versions F1) Why can't I use command line editing in my `cmdtool'? @@ -1156,16 +1154,211 @@ is, in fact, a syntax error. Redirections may only precede `simple commands'. A subshell construct such as the above is one of the shell's `compound commands'. A redirection may only follow a compound command. -The file CWRU/sh-redir-hack in the bash-2.03 distribution is an +This affects the mechanical transformation of commands that use `cat' +to pipe a file into a command (a favorite Useless-Use-Of-Cat topic on +comp.unix.shell). While most commands of the form + + cat file | command + +can be converted to `< file command', shell control structures such as +loops and subshells require `command < file'. + +The file CWRU/sh-redir-hack in the bash-2.04 distribution is an (unofficial) patch to parse.y that will modify the grammar to support this construct. It will not apply with `patch'; you must modify parse.y by hand. Note that if you apply this, you must recompile with -DREDIRECTION_HACK. This introduces a large number of reduce/reduce conflicts into the shell grammar. -Section G: Where do I go from here? +F6) Why can't I use vi-mode editing on Red Hat Linux 6.1? + +The short answer is that Red Hat screwed up. + +The long answer is that they shipped an /etc/inputrc that only works +for emacs mode editing, and then screwed all the vi users by setting +INPUTRC to /etc/inputrc in /etc/profile. + +The short fix is to do one of the following: remove or rename +/etc/inputrc, set INPUTRC=~/.inputrc in ~/.bashrc (or .bash_profile, +but make sure you export it if you do), remove the assignment to +INPUTRC from /etc/profile, add + + set keymap emacs + +to the beginning of /etc/inputrc, or bracket the key bindings in +/etc/inputrc with these lines + + $if mode=emacs + [...] + $endif + +Section G: How can I get bash to do certain common things? + +G1) How can I get bash to read and display eight-bit characters? + +This is a process requiring several steps. + +First, you must ensure that the `physical' data path is a full eight +bits. For xterms, for example, the `vt100' resources `eightBitInput' +and `eightBitOutput' should be set to `true'. + +Once you have set up an eight-bit path, you must tell the kernel and +tty driver to leave the eighth bit of characters alone when processing +keyboard input. Use `stty' to do this: + + stty cs8 -istrip -parenb + +For old BSD-style systems, you can use + + stty pass8 + +You may also need + + stty even odd + +Finally, you need to tell readline that you will be inputting and +displaying eight-bit characters. You use readline variables to do +this. These variables can be set in your .inputrc or using the bash +`bind' builtin. Here's an example using `bind': + + bash$ bind 'set convert-meta off' + bash$ bind 'set meta-flag on' + bash$ bind 'set output-meta on' + +The `set' commands between the single quotes may also be placed +in ~/.inputrc. + +G2) How do I write a function `x' to replace builtin command `x', but + still invoke the command from within the function? + +This is why the `command' and `builtin' builtins exist. The +`command' builtin executes the command supplied as its first +argument, skipping over any function defined with that name. The +`builtin' builtin executes the builtin command given as its first +argument directly. + +For example, to write a function to replace `cd' that writes the +hostname and current directory to an xterm title bar, use +something like the following: + + cd() + { + builtin cd "$@" && xtitle "$HOST: $PWD" + } + +This could also be written using `command' instead of `builtin'; +the version above is marginally more efficient. + +G3) How can I find the value of a shell variable whose name is the value + of another shell variable? + +Versions of Bash newer than Bash-2.0 support this directly. You can use + + ${!var} + +For example, the following sequence of commands will echo `z': + + var1=var2 + var2=z + echo ${!var1} + +For sh compatibility, use the `eval' builtin. The important +thing to remember is that `eval' expands the arguments you give +it again, so you need to quote the parts of the arguments that +you want `eval' to act on. + +For example, this expression prints the value of the last positional +parameter: + + eval echo \"\$\{$#\}\" + +The expansion of the quoted portions of this expression will be +deferred until `eval' runs, while the `$#' will be expanded +before `eval' is executed. In versions of bash later than bash-2.0, + + echo ${!#} + +does the same thing. + +G4) How can I make the bash `time' reserved word print timing output that + looks like the output from my system's /usr/bin/time? + +The bash command timing code looks for a variable `TIMEFORMAT' and +uses its value as a format string to decide how to display the +timing statistics. + +The value of TIMEFORMAT is a string with `%' escapes expanded in a +fashion similar in spirit to printf(3). The manual page explains +the meanings of the escape sequences in the format string. + +If TIMEFORMAT is not set, bash acts as if the following assignment had +been performed: + + TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS' + +The POSIX.2 default time format (used by `time -p command') is + + TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S' + +The BSD /usr/bin/time format can be emulated with: + + TIMEFORMAT=$'\t%1R real\t%1U user\t%1S sys' + +The System V /usr/bin/time format can be emulated with: + + TIMEFORMAT=$'\nreal\t%1R\nuser\t%1U\nsys\t%1S' + +The ksh format can be emulated with: + + TIMEFORMAT=$'\nreal\t%2lR\nuser\t%2lU\nsys\t%2lS' + +G5) How do I get the current directory into my prompt? + +Bash provides a number of backslash-escape sequences which are expanded +when the prompt string (PS1 or PS2) is displayed. The full list is in +the manual page. + +The \w expansion gives the full pathname of the current directory, with +a tilde (`~') substituted for the current value of $HOME. The \W +expansion gives the basename of the current directory. To put the full +pathname of the current directory into the path without any tilde +subsitution, use $PWD. Here are some examples: + + PS1='\w$ ' # current directory with tilde + PS1='\W$ ' # basename of current directory + PS1='$PWD$ ' # full pathname of current directory + +The single quotes are important in the final example to prevent $PWD from +being expanded when the assignment to PS1 is performed. + +G6) How can I rename "*.foo" to "*.bar"? + +Use the pattern removal functionality described in D3. The following `for' +loop will do the trick: + + for f in *.foo; do + mv $f ${f%foo}bar + done + +G7) How can I translate a filename from uppercase to lowercase? + +The script examples/functions/lowercase, originally written by John DuBois, +will do the trick. The converse is left as an exercise. + +G8) How can I write a filename expansion (globbing) pattern that will match + all files in the current directory except "." and ".."? + +You must have set the `extglob' shell option using `shopt -s extglob' to use +this: + + echo .!(.|) * + +A solution that works without extended globbing is given in the Unix Shell +FAQ, posted periodically to comp.unix.shell. + +Section H: Where do I go from here? -G1) How do I report bugs in bash, and where should I look for fixes and +H1) How do I report bugs in bash, and where should I look for fixes and advice? Use the `bashbug' script to report bugs. It is built and @@ -1183,7 +1376,7 @@ and problems also take place there. To reach the bash maintainers directly, send mail to bash-maintainers@gnu.org. -G2) What kind of bash documentation is there? +H2) What kind of bash documentation is there? First, look in the doc directory in the bash distribution. It should contain at least the following files: @@ -1213,36 +1406,33 @@ A second edition of this book is available, published in January, 1998. The ISBN number is 1-56592-347-2. Look for it in the same fine bookstores or on the web. -G3) What's coming in future versions? +H3) What's coming in future versions? These are features I plan to include in a future version of bash. -a bash debugger (a minimally-tested version is included with bash-2.02) -Programmable completion a la zsh/tcsh +a bash debugger (a minimally-tested version is included with bash-2.04) +associative arrays -G4) What's on the bash `wish list' for future versions? +H4) What's on the bash `wish list' for future versions? These are features that may or may not appear in a future version of bash. -associative arrays (not really all that hard) breaking some of the shell functionality into embeddable libraries +a module system like zsh's, using dynamic loading like builtins better internationalization using GNU `gettext' an option to use external files for the long `help' text -timeouts for the `read' builtin -the ksh-93 ${!prefix*} and ${!prefix@} operators -arithmetic ++ and -- prefix and postfix operators date-stamped command history -a way to bind readline editing key sequences to shell commands -a mechanism to open network connections and assign them to file descriptors - using redirection (like ksh /dev/{tcp,udp}) +a bash programmer's guide with a chapter on creating loadable builtins +a better loadable interface to perl with access to the shell builtins and + variables (contributions gratefully accepted) -G5) When will the next release appear? +H5) When will the next release appear? -The next version will appear sometime in 1999. Never make +The next version will appear sometime in 2000 or 2001. Never make predictions. -This document is Copyright 1995-1999 by Chester Ramey. +This document is Copyright 1995-2000 by Chester Ramey. Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, and distribute diff --git a/doc/Makefile.in b/doc/Makefile.in index f0794da..9d00643 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -1,5 +1,22 @@ # This Makefile is for the Bash/documentation directory -*- text -*-. # +# Copyright (C) 1996 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +# SHELL = @MAKE_SHELL@ RM = rm -f @@ -7,8 +24,14 @@ topdir = @top_srcdir@ srcdir = @srcdir@ VPATH = .:@srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + infodir = @infodir@ +# set this to a directory name to have the HTML files installed +htmldir = @htmldir@ + mandir = @mandir@ manpfx = man @@ -34,7 +57,9 @@ TEXI2HTML = ${topdir}/support/texi2html MAN2HTML = ${BUILD_DIR}/support/man2html HTMLPOST = ${srcdir}/htmlpost.sh QUIETPS = #set this to -q to shut up dvips -DVIPS = dvips -D 300 $(QUIETPS) -o $@ # tricky +PAPERSIZE = letter # change to a4 for A4-size paper +PSDPI = 300 # could be 600 if you like +DVIPS = dvips -D ${PSDPI} $(QUIETPS) -t ${PAPERSIZE} -o $@ # tricky TEXINPUTDIR = $(RL_LIBDIR)/doc MKDIRS = ${topdir}/support/mkdirs @@ -85,10 +110,10 @@ RLUSER = $(RL_LIBDIR)/doc/rluser.texinfo all: ps info dvi text html nodvi: ps info text html -PSFILES = bash.ps bashbug.ps readline.ps article.ps builtins.ps +PSFILES = bash.ps bashbug.ps readline.ps article.ps builtins.ps rbash.ps DVIFILES = bashref.dvi bashref.ps INFOFILES = bashref.info -MAN0FILES = bash.0 bashbug.0 builtins.0 readline.0 +MAN0FILES = bash.0 bashbug.0 builtins.0 rbash.0 readline.0 HTMLFILES = bashref.html bash.html ps: ${PSFILES} @@ -110,6 +135,16 @@ bashref.info: $(srcdir)/bashref.texi $(HSUSER) $(RLUSER) bashref.html: bashref.texi $(HSUSER) $(RLUSER) $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/bashref.texi +new-bashref.dvi: $(srcdir)/new-bashref.texi $(HSUSER) $(RLUSER) + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/new-bashref.texi + +new-bashref.ps: new-bashref.dvi + $(RM) $@ + $(DVIPS) new-bashref.dvi + +new-bashref.info: $(srcdir)/new-bashref.texi $(HSUSER) $(RLUSER) + $(MAKEINFO) --no-split -I$(TEXINPUTDIR) $(srcdir)/new-bashref.texi + bash.dvi: bash.texinfo $(HSUSER) $(RLUSER) TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) bash.texinfo @@ -122,9 +157,11 @@ bash.ps: bash.1 bash.html: bash.1 $(MAN2HTML) bashbug.ps: bashbug.1 builtins.ps: builtins.1 bash.1 +rbash.ps: rbash.1 bash.1 bash.0: bash.1 bashbug.0: bashbug.1 builtins.0: builtins.1 bash.1 +rbash.0: rbash.1 bash.1 readline.0: readline.3 readline.ps: readline.3 article.ps: article.ms @@ -139,17 +176,26 @@ faq: ${CREATED_FAQ} faq.version: FAQ.version FAQ sh mkfaqvers FAQ.version > $@ -faq.news: FAQ FAQ.headers.news faq.version +faq.headers.mail: FAQ.headers.mail FAQ + sh mkfaqvers FAQ.headers.mail > $@ + +faq.headers.news: FAQ.headers.news FAQ + sh mkfaqvers FAQ.headers.news > $@ + +faq.headers.news2: FAQ.headers.news2 FAQ + sh mkfaqvers FAQ.headers.news2 > $@ + +faq.news: FAQ faq.headers.news faq.version $(RM) $@ - cat FAQ.headers.news faq.version FAQ > $@ + cat faq.headers.news faq.version FAQ > $@ -faq.news2: FAQ FAQ.headers.news2 faq.version +faq.news2: FAQ faq.headers.news2 faq.version $(RM) $@ - cat FAQ.headers.news2 faq.version FAQ > $@ + cat faq.headers.news2 faq.version FAQ > $@ -faq.mail: FAQ FAQ.headers.mail faq.version +faq.mail: FAQ faq.headers.mail faq.version $(RM) $@ - cat FAQ.headers.mail faq.version FAQ > $@ + cat faq.headers.mail faq.version FAQ > $@ clean: $(RM) *.aux *.bak *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \ @@ -169,6 +215,9 @@ installdirs: # uncomment the next line to create the directory for the readline man page # -test -d $(man3dir) || $(SHELL) ${MKDIRS} $(man3dir) -test -d $(infodir) || $(SHELL) ${MKDIRS} $(infodir) + -if [ -n "$(htmldir)" ]; then \ + test -d $(htmldir) || $(SHELL) ${MKDIRS} $(htmldir) ; \ + fi install: info installdirs -$(INSTALL_DATA) $(srcdir)/bash.1 $(man1dir)/bash.${man1ext} @@ -182,11 +231,20 @@ install: info installdirs if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ install-info --dir-file=$(infodir)/dir $(infodir)/bash.info; \ else true; fi +# if htmldir is set, install the html files into that directory + -if [ -n "${htmldir}" ]; then \ + $(INSTALL_DATA) $(srcdir)/bash.html $(htmldir) ; \ + $(INSTALL_DATA) $(srcdir)/bashref.html $(htmldir) ; \ + fi uninstall: -$(RM) $(man1dir)/bash.${man1ext} $(man1dir)/bashbug.${man1ext} -$(RM) $(man3dir)/readline.${man3ext} $(RM) $(infodir)/bash.info + -if [ -n "$(htmldir)" ]; then \ + $(RM) $(htmldir)/bash.html ; \ + $(RM) $(htmldir)/bashref.html ; \ + fi # for use by chet inst: bashref.texi @@ -6,11 +6,12 @@ .\" Case Western Reserve University .\" chet@ins.CWRU.Edu .\" -.\" Last Change: Wed Jan 20 16:47:14 EST 1999 +.\" Last Change: Tue Mar 14 11:36:43 EST 2000 .\" .\" bash_builtins, strip all but Built-Ins section .if \n(zZ=1 .ig zZ -.TH BASH 1 "1999 Jan 20" GNU +.if \n(zY=1 .ig zY +.TH BASH 1 "2000 Mar 14" "GNU Bash-2.04" .\" .\" There's some problem with having a `@' .\" in a tagged paragraph with the BSD man macros. @@ -151,7 +152,7 @@ below). .B \-\-noediting Do not use the GNU .B readline -library to read command lines if interactive. +library to read command lines when the shell is interactive. .TP .B \-\-noprofile Do not read either the system-wide startup file @@ -228,7 +229,11 @@ or one started with the .B \-\-login option. .PP -An \fIinteractive\fP shell is one whose standard input and output are +An \fIinteractive\fP shell is one started without non-option arguments +and without the +.B \-c +option +whose standard input and output are both connected to terminals (as determined by .IR isatty (3)), or one started with the @@ -548,24 +553,24 @@ denote AND lists and OR lists, respectively. An AND list has the form .RS .PP -\fIcommand\fP \fB&&\fP \fIcommand2\fP +\fIcommand1\fP \fB&&\fP \fIcommand2\fP .RE .PP .I command2 is executed if, and only if, -.I command +.I command1 returns an exit status of zero. .PP An OR list has the form .RS .PP -\fIcommand\fP \fB\(bv\(bv\fP \fIcommand2\fP +\fIcommand1\fP \fB\(bv\(bv\fP \fIcommand2\fP .PP .RE .PP .I command2 is executed if and only if -.I command +.I command1 returns a non-zero exit status. The return status of AND and OR lists is the exit status of the last command executed in the list. @@ -658,10 +663,11 @@ the entire conditional expression. .TP \fBfor\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP The list of words following \fBin\fP is expanded, generating a list -of items. The variable \fIname\fP is set to each element of this list -in turn, and \fIlist\fP is executed each time. If the \fBin\fP -\fIword\fP is omitted, the \fBfor\fP command executes \fIlist\fP -once for each positional parameter that is set (see +of items. +The variable \fIname\fP is set to each element of this list +in turn, and \fIlist\fP is executed each time. +If the \fBin\fP \fIword\fP is omitted, the \fBfor\fP command executes +\fIlist\fP once for each positional parameter that is set (see .SM .B PARAMETERS below). @@ -669,6 +675,19 @@ The return status is the exit status of the last command that executes. If the expansion of the items following \fBin\fP results in an empty list, no commands are executed, and the return status is 0. .TP +\fBfor\fP (( \fIexpr1\fP ; \fIexpr2\fP ; \fIexpr3\fP )) ; \fBdo\fP \fIlist\fP ; \fBdone\fP +First, the arithmetic expression \fIexpr1\fP is evaluated according +to the rules described below under +.SM +.BR "ARITHMETIC EVALUATION" . +The arithmetic expression \fIexpr2\fP is then evaluated repeatedly +until it evaluates to zero. +Each time \fIexpr2\fP evaluates to a non-zero value, \fIlist\fP is +executed and the arithmetic expression \fIexpr3\fP is evaluated. +If any expression is omitted, it behaves as if it evaluates to 1. +The return value is the exit status of the last command in \fIlist\fP +that is executed, or false if any of the expressions is invalid. +.TP \fBselect\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP The list of words following \fBin\fP is expanded, generating a list of items. The set of expanded words is printed on the standard @@ -701,7 +720,7 @@ is the exit status of the last command executed in .IR list , or zero if no commands were executed. .TP -\fBcase\fP \fIword\fP \fBin\fP [ ( \fIpattern\fP [ \fB|\fP \fIpattern\fP ] \ +\fBcase\fP \fIword\fP \fBin\fP [ [(] \fIpattern\fP [ \fB|\fP \fIpattern\fP ] \ ... ) \fIlist\fP ;; ] ... \fBesac\fP A \fBcase\fP command first expands \fIword\fP, and tries to match it against each \fIpattern\fP in turn, using the same matching rules @@ -784,8 +803,14 @@ parameter expansion. Each of the \fImetacharacters\fP listed above under .SM .B DEFINITIONS -has special meaning to the shell and must be quoted if they are to -represent themselves. There are three quoting mechanisms: the +has special meaning to the shell and must be quoted if it is to +represent itself. +.PP +When the command history expansion facilities are being used, the +\fIhistory expansion\fP character, usually \fB!\fP, must be quoted +to prevent history expansion. +.PP +There are three quoting mechanisms: the .IR "escape character" , single quotes, and double quotes. .PP @@ -866,6 +891,9 @@ vertical tab .TP .B \e\e backslash +.TP +.B \e' +single quote .TP .B \e\fInnn\fP the character whose ASCII code is the octal value \fInnn\fP @@ -877,7 +905,7 @@ the character whose ASCII code is the hexadecimal value \fInnn\fP .PD .RE .LP -The translated result is single-quoted, as if the dollar sign had +The expanded result is single-quoted, as if the dollar sign had not been present. .PP A double-quoted string preceded by a dollar sign (\fB$\fP) will cause @@ -920,8 +948,8 @@ If .I value is not given, the variable is assigned the null string. All .I values -undergo tilde expansion, parameter and variable expansion, string -expansion, command substitution, arithmetic expansion, and quote +undergo tilde expansion, parameter and variable expansion, +command substitution, arithmetic expansion, and quote removal (see .SM .B EXPANSION @@ -1087,7 +1115,16 @@ shell startup. This variable is readonly. .TP .B GROUPS An array variable containing the list of groups of which the current -user is a member. This variable is readonly. +user is a member. +Assignments to +.SM +.B GROUPS +have no effect and are silently discarded. +If +.SM +.B GROUPS +is unset, it loses its special properties, even if it is +subsequently reset. .TP .B BASH Expands to the full file name used to invoke this instance of @@ -1180,6 +1217,19 @@ If is unset, it loses its special properties, even if it is subsequently reset. .TP +.B FUNCNAME +The name of any currently-executing shell function. +This variable exists only when a shell function is executing. +Assignments to +.SM +.B FUNCNAME +have no effect and are silently discarded. +If +.SM +.B FUNCNAME +is unset, it loses its special properties, even if it is +subsequently reset. +.TP .B DIRSTACK An array variable (see .B Arrays @@ -1267,6 +1317,37 @@ If this variable is in the environment when starts up, each shell option in the list will be enabled before reading any startup files. This variable is read-only. +.TP +.B COMP_WORDS +An array variable (see \fBArrays\fP below) consisting of the individual +words in the current command line. +This variable is available only in shell functions invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). +.TP +.B COMP_CWORD +An index into \fB${COMP_WORDS}\fP of the word containing the current +cursor position. +This variable is available only in shell functions invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). +.TP +.B COMP_LINE +The current command line. +This variable is available only in shell functions and external +commands invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). +.TP +.B COMP_POINT +The index of the current cursor position relative to the beginning of +the current command. +If the current cursor position is at the end of the current command, +the value of this variable is equal to \fB${#COMP_LINE}\fP. +This variable is available only in shell functions and external +commands invoked by the +programmable completion facilities (see \fBProgrammable Completion\fP +below). .PD .PP The following variables are used by the shell. In some cases, @@ -1351,11 +1432,11 @@ the current mailfile. Example: .RS .PP -\fBMAILPATH\fP='/usr/spool/mail/bfox?"You have mail":~/shell\-mail?"$_ has mail!"' +\fBMAILPATH\fP='/var/mail/bfox?"You have mail":~/shell\-mail?"$_ has mail!"' .PP .B Bash supplies a default value for this variable, but the location of the user -mail files that it uses is system dependent (e.g., /usr/spool/mail/\fB$USER\fP). +mail files that it uses is system dependent (e.g., /var/mail/\fB$USER\fP). .RE .TP .B PS1 @@ -1494,6 +1575,9 @@ matching. This variable determines the locale used to translate double-quoted strings preceded by a \fB$\fP. .TP +.B LC_NUMERIC +This variable determines the locale category used for number formatting. +.TP .B PROMPT_COMMAND If set, the value is executed as a command prior to issuing each primary prompt. @@ -1564,8 +1648,8 @@ If set to a value of .IR ignorespace , lines which begin with a .B space -character are not entered on the history list. If set to -a value of +character are not entered on the history list. +If set to a value of .IR ignoredups , lines matching the last history line are not entered. A value of @@ -1585,14 +1669,14 @@ not tested, and are added to the history regardless of the value of .B HISTIGNORE A colon-separated list of patterns used to decide which command lines should be saved on the history list. Each pattern is anchored at the -beginning of the line and must fully specify the line (no implicit +beginning of the line and must match the complete line (no implicit `\fB*\fP' is appended). Each pattern is tested against the line after the checks specified by .B HISTCONTROL are applied. In addition to the normal shell pattern matching characters, `\fB&\fP' matches the previous history line. `\fB&\fP' may be escaped using a -backslash. The backslash is removed before attempting a match. +backslash; the backslash is removed before attempting a match. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of .BR HISTIGNORE . @@ -1602,12 +1686,10 @@ The two or three characters which control history expansion and tokenization (see .SM .B HISTORY EXPANSION -below). The first character is the -.IR "history expansion character" , +below). The first character is the \fIhistory expansion\fP character, the character which signals the start of a history expansion, normally `\fB!\fP'. -The second character is the -.IR "quick substitution" +The second character is the \fIquick substitution\fP character, which is used as shorthand for re-running the previous command entered, substituting one string for another in the command. The default is `\fB^\fP'. @@ -1622,10 +1704,23 @@ parser to treat the rest of the line as a comment. Contains the name of a file in the same format as .FN /etc/hosts that should be read when the shell needs to complete a -hostname. The file may be changed interactively; the next -time hostname completion is attempted +hostname. +The list of possible hostname completions may be changed while the +shell is running; +the next time hostname completion is attempted after the +value is changed, .B bash -adds the contents of the new file to the already existing database. +adds the contents of the new file to the existing list. +If +.SM +.B HOSTFILE +is set, but has no value, \fBbash\fP attempts to read +.FN /etc/hosts +to obtain the list of possible hostname completions. +When +.SM +.B HOSTFILE +is unset, the hostname list is cleared. .TP .B auto_resume This variable controls how the shell interacts with the user and @@ -1655,6 +1750,11 @@ be a prefix of a stopped job's name; this provides functionality analogous to the .B % job identifier. +.TP +.B COMPREPLY +An array variable from which \fBbash\fP reads the possible completions +generated by a shell function invoked by the programmable completion +facility (see \fBProgrammable Completion\fP below). .PD .SS Arrays .B Bash @@ -1720,7 +1820,7 @@ referencing element zero. .PP The .B unset -builtin is used to destroy arrays. \fBunset\fP \fBname\fP[\fIsubscript\fP] +builtin is used to destroy arrays. \fBunset\fP \fIname\fP[\fIsubscript\fP] destroys the array element at index \fIsubscript\fP. \fBunset\fP \fIname\fP, where \fIname\fP is an array, or \fBunset\fP \fIname\fP[\fIsubscript\fP], where @@ -1805,6 +1905,8 @@ and closing braces, and at least one unquoted comma. Any incorrectly formed brace expansion is left unchanged. A \fB{\fP or \fB,\fP may be quoted with a backslash to prevent its being considered part of a brace expression. +To avoid conflicts with parameter expansion, the string \fB${\fP +is not considered eligible for brace expansion. .PP This construct is typically used as shorthand when the common prefix of the strings to be generated is longer than in the @@ -1934,9 +2036,11 @@ If the first character of \fIparameter\fP is an exclamation point, a level of variable indirection is introduced. \fBBash\fP uses the value of the variable formed from the rest of \fIparameter\fP as the name of the variable; this variable is then -expanded and that value used in the rest of the substitution, rather +expanded and that value is used in the rest of the substitution, rather than the value of \fIparameter\fP itself. This is known as \fIindirect expansion\fP. +The exception to this is the expansion of ${!\fIprefix\fP*} +described below. .PP In each of the cases below, \fIword\fP is subject to tilde expansion, parameter expansion, command substitution, and arithmetic expansion. @@ -1993,10 +2097,10 @@ ${\fIparameter\fP\fB:\fP\fIoffset\fP} ${\fIparameter\fP\fB:\fP\fIoffset\fP\fB:\fP\fIlength\fP} .PD \fBSubstring Expansion.\fP -Expands to up to \fIlength\fP characters of \fIparameter\fP, -starting at the characters specified by \fIoffset\fP. +Expands to up to \fIlength\fP characters of \fIparameter\fP +starting at the character specified by \fIoffset\fP. If \fIlength\fP is omitted, expands to the substring of -\fIparameter\fP, starting at the character specified by \fIoffset\fP. +\fIparameter\fP starting at the character specified by \fIoffset\fP. \fIlength\fP and \fIoffset\fP are arithmetic expressions (see .SM .B @@ -2013,6 +2117,13 @@ members of the array beginning with ${\fIparameter\fP[\fIoffset\fP]}. Substring indexing is zero-based unless the positional parameters are used, in which case the indexing starts at 1. .TP +${\fB!\fP\fIprefix\fP\fB*\fP} +Expands to the names of variables whose names begin with \fIprefix\fP, +separated by the first character of the +.SM +.B IFS +special variable. +.TP ${\fB#\fP\fIparameter\fP} The length in characters of the value of \fIparameter\fP is substituted. If @@ -2206,7 +2317,7 @@ the file will provide input for \fIlist\fP. If the \fB<(\fP\fIlist\^\fP\fB)\fP form is used, the file passed as an argument should be read to obtain the output of \fIlist\fP. .PP -When available, \fIprocess substitution\fP is performed +When available, process substitution is performed simultaneously with parameter and variable expansion, command substitution, and arithmetic expansion. @@ -2272,8 +2383,7 @@ is null, no word splitting occurs. .PP Explicit null arguments (\^\f3"\^"\fP or \^\f3'\^'\fP\^) are retained. Unquoted implicit null arguments, resulting from the expansion of -.I parameters -that have no values, are removed. +parameters that have no values, are removed. If a parameter with no value is expanded within double quotes, a null argument results and is retained. .PP @@ -2289,7 +2399,6 @@ option has been set, scans each word for the characters .BR * , .BR ? , -.BR ( , and .BR [ . If one of these characters appears, then the word is @@ -2453,7 +2562,7 @@ the syntax \fB[.\fP\fIsymbol\fP\fB.]\fP matches the collating symbol .PP If the \fBextglob\fP shell option is enabled using the \fBshopt\fP builtin, several extended pattern matching operators are recognized. -In the following description, a \fIpattern\-list\fP is a list of one +In the following description, a \fIpattern-list\fP is a list of one or more patterns separated by a \fB|\fP. Composite patterns may be formed using one or more of the following sub-patterns: @@ -2511,7 +2620,7 @@ the redirection refers to the standard output (file descriptor The word following the redirection operator in the following descriptions, unless otherwise noted, is subjected to brace expansion, tilde expansion, parameter expansion, command substitution, arithmetic -expansion, quote removal, and pathname expansion. +expansion, quote removal, pathname expansion, and word splitting. If it expands to more than one word, .B bash reports an error. @@ -2537,6 +2646,36 @@ because the standard error was duplicated as standard output before the standard output was redirected to .IR dirlist . .PP +\fBBash\fP handles several filenames specially when they are used in +redirections, as described in the following table: +.RS +.PP +.PD 0 +.TP +.B /dev/fd/\fIfd\fP +If \fIfd\fP is a valid integer, file descriptor \fIfd\fP is duplicated. +.TP +.B /dev/stdin +File descriptor 0 is duplicated. +.TP +.B /dev/stdout +File descriptor 1 is duplicated. +.TP +.B /dev/stderr +File descriptor 2 is duplicated. +.TP +.B /dev/tcp/\fIhost\fP/\fIport\fP +If \fIhost\fP is a valid hostname or Internet address, and \fIport\fP +is an integer port number, \fBbash\fP attempts to open a TCP connection +to the corresponding socket. +.TP +.B /dev/udp/\fIhost\fP/\fIport\fP +If \fIhost\fP is a valid hostname or Internet address, and \fIport\fP +is an integer port number, \fBbash\fP attempts to open a UDP connection +to the corresponding socket. +.PD +.RE +.PP A failure to open or create a file causes the redirection to fail. .SS Redirecting Input .PP @@ -2578,7 +2717,7 @@ and the .B noclobber option to the .B set -builtin has been enabled, the redirection will fail if the filename +builtin has been enabled, the redirection will fail if the file whose name results from the expansion of \fIword\fP exists and is a regular file. If the redirection operator is @@ -2657,8 +2796,8 @@ The format of here-documents is as follows: .fi .RE .PP -No parameter expansion, command substitution, pathname -expansion, or arithmetic expansion is performed on +No parameter expansion, command substitution, arithmetic expansion, +or pathname expansion is performed on .IR word . If any characters in .I word @@ -2670,7 +2809,7 @@ and the lines in the here-document are not expanded. If \fIword\fP is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion. In the latter -case, the pair +case, the character sequence .B \e<newline> is ignored, and .B \e @@ -2746,11 +2885,9 @@ or on file descriptor 0 if .I n is not specified. If the file does not exist, it is created. .SH ALIASES -Aliases allow a string to be substituted for a word when it is used +\fIAliases\fP allow a string to be substituted for a word when it is used as the first word of a simple command. -The shell maintains a list of -.I aliases -that may be set and unset with the +The shell maintains a list of aliases that may be set and unset with the .B alias and .B unalias @@ -2786,7 +2923,10 @@ command, and removed with the command. .PP There is no mechanism for using arguments in the replacement text. -If arguments are needed, a shell function should be used. +If arguments are needed, a shell function should be used (see +.SM +.B FUNCTIONS +below). .PP Aliases are not expanded when the shell is not interactive, unless the @@ -2828,15 +2968,24 @@ A shell function, defined as described above under .SM .BR "SHELL GRAMMAR" , stores a series of commands for later execution. +When the name of a shell function is used as a simple command name, +the list of commands associated with that function name is executed. Functions are executed in the context of the current shell; no new process is created to interpret them (contrast this with the execution of a shell script). When a function is executed, the arguments to the function become the positional parameters -during its execution. The special parameter +during its execution. +The special parameter .B # is updated to reflect the change. Positional parameter 0 -is unchanged. All other aspects of the shell execution +is unchanged. +The +.SM +.B FUNCNAME +variable is set to the name of the function while the function +is executing. +All other aspects of the shell execution environment are identical between a function and its caller with the exception that the .SM @@ -2891,12 +3040,20 @@ certain circumstances (see the \fBlet\fP builtin command and \fBArithmetic Expansion\fP). Evaluation is done in long integers with no check for overflow, though division by 0 is trapped and flagged as an error. +The operators and their precedence and associativity are the same +as in the C language. The following list of operators is grouped into levels of equal-precedence operators. The levels are listed in order of decreasing precedence. .PP .PD 0 .TP +.B \fIid\fP++ \fIid\fP\-\- +variable post-increment and post-decrement +.TP +.B ++\fIid\fP \-\-\fIid\fP +variable pre-increment and pre-decrement +.TP .B \- + unary minus and plus .TP @@ -2941,12 +3098,18 @@ conditional evaluation .TP .B = *= /= %= += \-= <<= >>= &= ^= |= assignment +.TP +.B \fIexpr1\fP , \fIexpr2\fP +comma .PD .PP Shell variables are allowed as operands; parameter expansion is -performed before the expression is evaluated. -The value of a parameter is coerced to a long integer within -an expression. A shell variable need not have its integer attribute +performed before the expression is evaluated. +Within an expression, shell variables may also be referenced by name +without using the parameter expansion syntax. +The value of a variable is evaluated as an arithmetic expression +when it is referenced. +A shell variable need not have its integer attribute turned on to be used in an expression. .PP Constants with a leading 0 are interpreted as octal numbers. @@ -2954,7 +3117,7 @@ A leading 0x or 0X denotes hexadecimal. Otherwise, numbers take the form [\fIbase#\fP]n, where \fIbase\fP is a decimal number between 2 and 64 representing the arithmetic base, and \fIn\fP is a number in that base. -If \fIbase\fP is omitted, then base 10 is used. +If \fIbase#\fP is omitted, then base 10 is used. The digits greater than 9 are represented by the lowercase letters, the uppercase letters, _, and @, in that order. If \fIbase\fP is less than or equal to 36, lowercase and uppercase @@ -2970,7 +3133,10 @@ the \fBtest\fP and \fB[\fP builtin commands to test file attributes and perform string and arithmetic comparisons. Expressions are formed from the following unary or binary primaries. If any \fIfile\fP argument to one of the primaries is of the form -/dev/fd/\fIn\fP, then file descriptor \fIn\fP is checked. +\fI/dev/fd/n\fP, then file descriptor \fIn\fP is checked. +If the \fIfile\fP argument to one of the primaries is one of +\fI/dev/stdin\fP, \fI/dev/stdout\fP, or \fI/dev/stderr\fP, file +descriptor 0, 1, or 2, respectively, is checked. .sp 1 .PD 0 .TP @@ -3162,7 +3328,7 @@ searches each element of the .B PATH for a directory containing an executable file by that name. .B Bash -uses a hash table to remember the full file names of executable +uses a hash table to remember the full pathnames of executable files (see .B hash under @@ -3276,8 +3442,8 @@ This is a list of \fIname\fP\-\fIvalue\fP pairs, of the form .IR "name\fR=\fPvalue" . .PP -The shell allows you to manipulate the environment in several -ways. On invocation, the shell scans its own environment and +The shell provides several ways to manipulate the environment. +On invocation, the shell scans its own environment and creates a parameter for each name found, automatically marking it for .I export @@ -3328,8 +3494,8 @@ command in its environment. For the shell's purposes, a command which exits with a zero exit status has succeeded. An exit status of zero indicates success. A non-zero exit status indicates failure. -When a command terminates on a fatal signal, \fBbash\fP uses -the value of 128+\fBsignal\fP as the exit status. +When a command terminates on a fatal signal \fIN\fP, \fBbash\fP uses +the value of 128+\fIN\fP as the exit status. .PP If a command is not found, the child process created to execute it returns a status of 127. If a command is found @@ -3467,7 +3633,7 @@ uses the abstraction as the basis for job control. .PP To facilitate the implementation of the user interface to job -control, the system maintains the notion of a \fIcurrent terminal +control, the operating system maintains the notion of a \fIcurrent terminal process group ID\fP. Members of this process group (processes whose process group ID is equal to the current terminal process group ID) receive keyboard-generated signals such as @@ -3491,13 +3657,13 @@ If the operating system on which is running supports job control, .B bash -allows you to use it. +contains facilities to use it. Typing the .I suspend character (typically .BR ^Z , Control-Z) while a process is running -causes that process to be stopped and returns you to +causes that process to be stopped and returns control to .BR bash . Typing the .I "delayed suspend" @@ -3622,6 +3788,12 @@ the hostname up to the first `.' .B \eH the hostname .TP +.B \ej +the number of jobs currently managed by the shell +.TP +.B \el +the basename of the shell's terminal device name +.TP .B \en newline .TP @@ -3693,8 +3865,8 @@ list, which may include commands restored from the history file below), while the command number is the position in the sequence of commands executed during the current shell session. After the string is decoded, it is expanded via -parameter expansion, command substitution, arithmetic expansion, -string expansion, and quote removal, subject to the value of the +parameter expansion, command substitution, arithmetic +expansion, and quote removal, subject to the value of the .B promptvars shell option (see the description of the .B shopt @@ -3806,6 +3978,7 @@ The following symbolic character names are recognized: .IR SPACE , and .IR TAB . +.PP In addition to command names, readline allows keys to be bound to a string that is inserted when the key is pressed (a \fImacro\fP). .SS "Readline Key Bindings" @@ -3980,8 +4153,7 @@ If set to \fBnone\fP, readline never rings the bell. If set to If set to \fBaudible\fP, readline attempts to ring the terminal's bell. .TP .B comment\-begin (``#'') -The string that is inserted when the -.B readline +The string that is inserted when the readline .B insert\-comment command is executed. This command is bound to @@ -4007,7 +4179,7 @@ on the terminal. .B convert\-meta (On) If set to \fBOn\fP, readline will convert characters with the eighth bit set to an ASCII key sequence -by stripping the eighth bit and prepending an +by stripping the eighth bit and prefixing an escape character (in effect, using escape as the \fImeta prefix\fP). .TP .B disable\-completion (Off) @@ -4178,7 +4350,7 @@ As each character of the search string is typed, readline displays the next entry from the history matching the string typed so far. An incremental search requires only as many characters as needed to find the desired history entry. -The characters present in the value of the \fIisearch-terminators\fP +The characters present in the value of the \fBisearch-terminators\fP variable are used to terminate an incremental search. If that variable has not been assigned a value the Escape and Control-J characters will terminate an incremental search. @@ -4186,6 +4358,7 @@ Control-G will abort an incremental search and restore the original line. When the search is terminated, the history entry containing the search string becomes the current line. +.PP To find other matching entries in the history list, type Control-S or Control-R as appropriate. This will search backward or forward in the history for the next @@ -4203,6 +4376,10 @@ typed by the user or be part of the contents of the current line. The following is a list of the names of the commands and the default key sequences to which they are bound. Command names without an accompanying key sequence are unbound by default. +In the following descriptions, \fIpoint\fP refers to the current cursor +position, and \fImark\fP refers to a cursor position saved by the +\fBset\-mark\fP command. +The text between the point and mark is referred to as the \fIregion\fP. .SS Commands for Moving .PP .PD 0 @@ -4224,7 +4401,7 @@ Move forward to the end of the next word. Words are composed of alphanumeric characters (letters and digits). .TP .B backward\-word (M\-b) -Move back to the start of this, or the previous, word. Words are +Move back to the start of the current or previous word. Words are composed of alphanumeric characters (letters and digits). .TP .B clear\-screen (C\-l) @@ -4280,8 +4457,7 @@ a string supplied by the user. .TP .B history\-search\-forward Search forward through the history for the string of characters -between the start of the current line and the current cursor -position (the \fIpoint\fP). +between the start of the current line and the point. This is a non-incremental search. .TP .B history\-search\-backward @@ -4379,12 +4555,14 @@ Insert the character typed. .TP .B transpose\-chars (C\-t) Drag the character before point forward over the character at point. -Point moves forward as well. If point is at the end of the line, then -transpose the two characters before point. Negative arguments don't work. +Point moves forward as well. +If point is at the end of the line, then transpose the two characters +before point. +Negative arguments have no effect. .TP .B transpose\-words (M\-t) -Drag the word behind the cursor past the word in front of the cursor -moving the cursor over that word as well. +Drag the word before point past the word after point, +moving the point over that word as well. .TP .B upcase\-word (M\-u) Uppercase the current (or following) word. With a negative argument, @@ -4403,7 +4581,7 @@ capitalize the previous word, but do not move point. .PD 0 .TP .B kill\-line (C\-k) -Kill the text from the current cursor position to the end of the line. +Kill the text from point to the end of the line. .TP .B backward\-kill\-line (C\-x Rubout) Kill backward to the beginning of the line. @@ -4411,31 +4589,30 @@ Kill backward to the beginning of the line. .B unix\-line\-discard (C\-u) Kill backward from point to the beginning of the line. The killed text is saved on the kill-ring. -\" There is no real difference between this and backward-kill-line +.\" There is no real difference between this and backward-kill-line .TP .B kill\-whole\-line -Kill all characters on the current line, no matter where the -cursor is. +Kill all characters on the current line, no matter where point is. .TP .B kill\-word (M\-d) -Kill from the cursor to the end of the current word, or if between -words, to the end of the next word. Word boundaries are the same as -those used by \fBforward\-word\fP. +Kill from point to the end of the current word, or if between +words, to the end of the next word. +Word boundaries are the same as those used by \fBforward\-word\fP. .TP .B backward\-kill\-word (M\-Rubout) -Kill the word behind the cursor. Word boundaries are the same as -those used by \fBbackward\-word\fP. +Kill the word behind point. +Word boundaries are the same as those used by \fBbackward\-word\fP. .TP .B unix\-word\-rubout (C\-w) -Kill the word behind the cursor, using white space as a word boundary. +Kill the word behind point, using white space as a word boundary. The word boundaries are different from \fBbackward\-kill\-word\fP. +The killed text is saved on the kill-ring. .TP .B delete\-horizontal\-space (M\-\e) Delete all spaces and tabs around point. .TP .B kill\-region -Kill the text between the point and \fImark\fP (saved cursor position). -This text is referred to as the \fIregion\fP. +Kill the text in the current region. .TP .B copy\-region\-as\-kill Copy the text in the region to the kill buffer. @@ -4515,9 +4692,9 @@ by default. .TP .B delete\-char\-or\-list Deletes the character under the cursor if not at the beginning or -end of the line (like \fBdelete-char\fP). +end of the line (like \fBdelete\-char\fP). If at the end of the line, behaves identically to -\fBpossible-completions\fP. +\fBpossible\-completions\fP. This command is unbound by default. .TP .B complete\-filename (M\-/) @@ -4568,7 +4745,7 @@ the text against lines from the history list for possible completion matches. .TP .B complete\-into\-braces (M\-{) -Perform filename completion and return the list of possible completions +Perform filename completion and insert the list of possible completions enclosed within braces so the list is available to the shell (see .B Brace Expansion above). @@ -4641,11 +4818,11 @@ A character is read and point is moved to the previous occurrence of that character. A negative count searches for subsequent occurrences. .TP .B insert\-comment (M\-#) -The value of the -.B readline +The value of the readline .B comment\-begin variable is inserted at the beginning of the current line, and the line -is accepted as if a newline had been typed. This makes the current line +is accepted as if a newline had been typed. The default value of +\fBcomment\-begin\fP causes this command to make the current line a shell comment. .TP .B glob\-expand\-word (C\-x *) @@ -4679,6 +4856,129 @@ of an \fIinputrc\fP file. Display version information about the current instance of .BR bash . .PD +.SS Programmable Completion +.PP +When word completion is attempted for an argument to a command for +which a completion specification (a \fIcompspec\fP) has been defined +using the \fBcomplete\fP builtin (see +.SM +.B "SHELL BUILTIN COMMANDS" +below), the programmable completion facilities are invoked. +.PP +First, the command name is identified. +If a compspec has been defined for that command, the +compspec is used to generate the list of possible completions for the word. +If the command word is a full pathname, a compspec for the full +pathname is searched for first. +If no compspec is found for the full pathname, an attempt is made to +find a compspec for the portion following the final slash. +.PP +Once a compspec has been found, it is used to generate the list of +matching words. +If a compspec is not found, the default \fBbash\fP completion as +described above under \fBCompleting\fP is performed. +.PP +First, the actions specified by the compspec are used. +Only matches which are prefixed by the word being completed are +returned. +When the +.B \-f +or +.B \-d +option is used for filename or directory name completion, the shell +variable +.SM +.B FIGNORE +is used to filter the matches. +.PP +Any completions specified by a filename expansion pattern to the +\fB\-G\fP option are generated next. +The words generated by the pattern need not match the word +being completed. +The +.SM +.B GLOBIGNORE +shell variable is not used to filter the matches, but the +.SM +.B FIGNORE +variable is used. +.PP +Next, the string specified as the argument to the \fB\-W\fP option +is considered. +The string is first split using the characters in the +.SM +.B IFS +special variable as delimiters. +Shell quoting is honored. +Each word is then expanded using +brace expansion, tilde expansion, parameter and variable expansion, +command substitution, arithmetic expansion, and pathname expansion, +as described above under +.SM +.BR EXPANSION . +The results are split using the rules described above under +\fBWord Splitting\fP. +The results of the expansion are prefix-matched against the word being +completed, and the matching words become the possible completions. +.PP +After these matches have been generated, any shell function or command +specified with the \fB\-F\fP and \fB\-C\fP options is invoked. +When the command or function is invoked, the +.SM +.B COMP_LINE +and +.SM +.B COMP_POINT +variables are assigned values as described above under +\fBShell Variables\fP. +If a shell function is being invoked, the +.SM +.B COMP_WORDS +and +.SM +.B COMP_CWORD +variables are also set. +When the function or command is invoked, the first argument is the +name of the command whose arguments are being completed, the +second argument is the word being completed, and the third argument +is the word preceding the word being completed on the current command line. +No filtering of the generated completions against the word being completed +is performed; the function or command has complete freedom in generating +the matches. +.PP +Any function specified with \fB\-F\fP is invoked first. +The function may use any of the shell facilities, including the +\fBcompgen\fP builtin described below, to generate the matches. +It must put the possible completions in the +.SM +.B COMPREPLY +array variable. +.PP +Next, any command specified with the \fB\-C\fP option is invoked +in an environment equivalent to command substitution. +It should print a list of completions, one per line, to the +standard output. +Backslash may be used to escape a newline, if necessary. +.PP +After all of the possible completions are generated, any filter +specified with the \fB\-X\fP option is applied to the list. +The filter is a pattern as used for pathname expansion; a \fB&\fP +in the pattern is replaced with the text of the word being completed. +A literal \fB&\fP may be escaped with a backslash; the backslash +is removed before attempting a match. +Any completion that matches the pattern will be removed from the list. +A leading \fB!\fP negates the pattern; in this case any completion +not matching the pattern will be removed. +.PP +Finally, any prefix and suffix specified with the \fB\-P\fP and \fB\-S\fP +options are added to each member of the completion list, and the result is +returned to the readline completion code as the list of possible +completions. +.PP +If a compspec is found, whatever it generates is returned to the completion +code as the full set of possible completions. +The default \fBbash\fP completions are not attempted, and the readline +default of filename completion is disabled. .SH HISTORY When the .B \-o history @@ -4686,10 +4986,13 @@ option to the .B set builtin is enabled, the shell provides access to the \fIcommand history\fP, -the list of commands previously typed. The text of the last +the list of commands previously typed. +The value of the \fBHISTSIZE\fP variable is used as the +number of commands to save in a history list. +The text of the last .SM .B HISTSIZE -commands (default 500) is saved in a history list. The shell +commands (default 500) is saved. The shell stores each command in the history list prior to parameter and variable expansion (see .SM @@ -4701,23 +5004,25 @@ values of the shell variables and .SM .BR HISTCONTROL . +.PP On startup, the history is initialized from the file named by the variable .SM .B HISTFILE (default \fI~/.bash_history\fP). +The file named by the value of .SM .B HISTFILE is truncated, if necessary, to contain no more than +the number of lines specified by the value of .SM -.B HISTFILESIZE -lines. +.BR HISTFILESIZE . When an interactive shell exits, the last .SM -.B HISTSIZE +.B $HISTSIZE lines are copied from the history list to .SM -.BR HISTFILE . +.BR $HISTFILE . If the .B histappend shell option is enabled @@ -4750,9 +5055,9 @@ below) may be used to list or edit and re-execute a portion of the history list. The .B history -builtin can be used to display or modify the history list and +builtin may be used to display or modify the history list and manipulate the history file. -When using the command-line editing, search commands +When using command-line editing, search commands are available in each editing mode that provide access to the history list. .PP @@ -5125,6 +5430,8 @@ job control. .TP \fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fB\-f\fP \fIfilename\fP .TP +\fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fB\-x\fP \fIkeyseq\fP:\fIshell\-command\fP +.TP \fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fIkeyseq\fP:\fIfunction\-name\fP .PD Display current @@ -5188,6 +5495,10 @@ Unbind all keys bound to the named \fIfunction\fP. .TP .B \-r \fIkeyseq\fP Remove any current binding for \fIkeyseq\fP. +.TP +.B \-x \fIkeyseq\fP:\fIshell\-command\fP +Cause \fIshell\-command\fP to be executed whenever \fIkeyseq\fP is +entered. .PD .PP The return value is 0 unless an unrecognized option is given or an @@ -5308,6 +5619,176 @@ cannot be found, the exit status is 127. Otherwise, the exit status of the builtin is the exit status of .IR command . .TP +\fBcompgen\fP [\fIoption\fP] [\fIword\fP] +Generate possible completion matches for \fIword\fP according to +the \fIoption\fPs, which may be any option accepted by the +.B complete +builtin with the exception of \fB\-p\fP and \fB\-r\fP, and write +the matches to the standard output. +When using the \fB\-F\fP or \fB\-C\fP options, the various shell variables +set by the programmable completion facilities, while available, will not +have useful values. +.sp 1 +The matches will be generated in the same way as if the programmable +completion code had generated them directly from a completion specification +with the same flags. +If \fIword\fP is specified, only those completions matching \fIword\fP +will be displayed. +.sp 1 +The return value is true unless an invalid option is supplied, or no +matches were generated. +.TP +.PD 0 +\fBcomplete\fP [\fB\-abcdefjkvu\fP] [\fB\-A\fP \fIaction\fP] [\fB\-G\fP \fIglobpat\fP] [\fB\-W\fP \fIwordlist\fP] [\fB\-P\fP \fIprefix\fP] [\fB\-S\fP \fIsuffix\fP] +.br +[\fB\-X\fP \fIfilterpat\fP] [\fB\-F\fP \fIfunction\fP] [\fB\-C\fP \fIcommand\fP] \fIname\fP [\fIname ...\fP] +.TP +\fBcomplete\fP \fB\-pr\fP [\fIname\fP ...] +.PD +Specify how arguments to each \fIname\fP should be completed. +If the \fB\-p\fP option is supplied, or if no options are supplied, +existing completion specifications are printed in a way that allows +them to be reused as input. +The \fB\-r\fP option removes a completion specification for +each \fIname\fP, or, if no \fIname\fPs are supplied, all +completion specifications. +.sp 1 +The process of applying these completion specifications when word completion +is attempted is described above under \fBProgrammable Completion\fP. +.sp 1 +Other options, if specified, have the following meanings. +The arguments to the \fB\-G\fP, \fB\-W\fP, and \fB\-X\fP options +(and, if necessary, the \fB\-P\fP and \fB\-S\fP options) +should be quoted to protect them from expansion before the +.B complete +builtin is invoked. +.RS +.PD 0 +.TP 8 +\fB\-A\fP \fIaction\fP +The \fIaction\fP may be one of the following to generate a list of possible +completions: +.RS +.TP 8 +.B alias +Alias names. May also be specified as \fB\-a\fP. +.TP 8 +.B arrayvar +Array variable names. +.TP 8 +.B binding +\fBReadline\fP key binding names. +.TP 8 +.B builtin +Names of shell builtin commands. May also be specified as \fB\-b\fP. +.TP 8 +.B command +Command names. May also be specified as \fB\-c\fP. +.TP 8 +.B directory +Directory names. May also be specified as \fB\-d\fP. +.TP 8 +.B disabled +Names of disabled shell builtins. +.TP 8 +.B enabled +Names of enabled shell builtins. +.TP 8 +.B export +Names of exported shell variables. May also be specified as \fB\-e\fP. +.TP 8 +.B file +File names. May also be specified as \fB\-f\fP. +.TP 8 +.B function +Names of shell functions. +.TP 8 +.B helptopic +Help topics as accepted by the \fBhelp\fP builtin. +.TP 8 +.B hostname +Hostnames, as taken from the file specified by the +.SM +.B HOSTFILE +shell variable. +.TP 8 +.B job +Job names, if job control is active. May also be specified as \fB\-j\fP. +.TP 8 +.B keyword +Shell reserved words. May also be specified as \fB\-k\fP. +.TP 8 +.B running +Names of running jobs, if job control is active. +.TP 8 +.B setopt +Valid arguments for the \fB\-o\fP option to the \fBset\fP builtin. +.TP 8 +.B shopt +Shell option names as accepted by the \fBshopt\fP builtin. +.TP 8 +.B signal +Signal names. +.TP 8 +.B stopped +Names of stopped jobs, if job control is active. +.TP 8 +.B user +User names. May also be specified as \fB\-u\fP. +.TP 8 +.B variable +Names of all shell variables. May also be specified as \fB\-v\fP. +.RE +.TP 8 +\fB\-G\fP \fIglobpat\fP +The filename expansion pattern \fIglobpat\fP is expanded to generate +the possible completions. +.TP 8 +\fB\-W\fP \fIwordlist\fP +The \fIwordlist\fP is split using the characters in the +.SM +.B IFS +special variable as delimiters, and each resultant word is expanded. +The possible completions are the members of the resultant list which +match the word being completed. +.TP 8 +\fB\-C\fP \fIcommand\fP +\fIcommand\fP is executed in a subshell environment, and its output is +used as the possible completions. +.TP 8 +\fB\-F\fP \fIfunction\fP +The shell function \fIfunction\fP is executed in the current shell +environment. +When it finishes, the possible completions are retrieved from the value +of the +.SM +.B COMPREPLY +array variable. +.TP 8 +\fB\-X\fP \fIfilterpat\fP +\fIfilterpat\fP is a pattern as used for filename expansion. +It is applied to the list of possible completions generated by the +preceding options and arguments, and each completion matching +\fIfilterpat\fP is removed from the list. +A leading \fB!\fP in \fIfilterpat\fP negates the pattern; in this +case, any completion not matching \fIfilterpat\fP is removed. +.TP 8 +\fB\-P\fP \fIprefix\fP +\fIprefix\fP is added at the beginning of each possible completion +after all other options have been applied. +.TP 8 +\fB\-S\fP \fIsuffix\fP +\fIsuffix\fP is appended to each possible completion +after all other options have been applied. +.PD +.PP +The return value is true unless an invalid option is supplied, an option +other than \fB\-p\fP or \fB\-r\fP is supplied without a \fIname\fP +argument, an attempt is made to remove a completion specification for +a \fIname\fP for which no specification exists, or +an error occurs adding a completion specification. +.RE +.TP \fBcontinue\fP [\fIn\fP] Resume the next iteration of the enclosing .BR for , @@ -5385,7 +5866,9 @@ makes each \fIname\fP local, as with the .B local command. The return value is 0 unless an invalid option is encountered, -an attempt is made to define a function using "\-f foo=bar", +an attempt is made to define a function using +.if n ``\-f foo=bar'', +.if t \f(CW\-f foo=bar\fP, an attempt is made to assign a value to a readonly variable, an attempt is made to assign a value to an array variable without using the compound assignment syntax (see @@ -5393,7 +5876,7 @@ using the compound assignment syntax (see above), one of the \fInames\fP is not a valid shell variable name, an attempt is made to turn off readonly status for a readonly variable, an attempt is made to turn off array status for an array variable, -or an attempt is made to display a non-existent function with \-f. +or an attempt is made to display a non-existent function with \fB\-f\fP. .RE .TP .B dirs [\fB\-clpv\fP] [+\fIn\fP] [\-\fIn\fP] @@ -5481,6 +5964,9 @@ the following backslash-escaped characters is enabled. The .B \-E option disables the interpretation of these escape characters, even on systems where they are interpreted by default. +The \fBxpg_echo\fP shell option to the may be used to +dynamically determine whether or not \fBecho\fP expands these +escape characters by default. .B echo does not interpret .B \-\- @@ -5533,7 +6019,7 @@ the character whose ASCII code is the hexadecimal value \fInnn\fP \fBenable\fP [\fB\-adnps\fP] [\fB\-f\fP \fIfilename\fP] [\fIname\fP ...] Enable and disable builtin shell commands. Disabling a builtin allows a disk command which has the same name -as a shell builtin to be executed with specifying a full pathname, +as a shell builtin to be executed without specifying a full pathname, even though the shell normally searches for builtins before disk commands. If \fB\-n\fP is used, each \fIname\fP is disabled; otherwise, @@ -5566,7 +6052,7 @@ If \fB\-s\fP is supplied, the output is restricted to the POSIX \fIspecial\fP builtins. The return value is 0 unless a .I name -is not a shell builtin or there is a problem loading a new builtin +is not a shell builtin or there is an error loading a new builtin from a shared object. .TP \fBeval\fP [\fIarg\fP ...] @@ -5590,7 +6076,7 @@ become the arguments to \fIcommand\fP. If the .B \-l option is supplied, -the shell places a dash in the zeroth arg passed to +the shell places a dash at the beginning of the zeroth arg passed to .IR command . This is what .IR login (1) @@ -5679,7 +6165,8 @@ command number). If .I last is not specified it is set to the current command for listing (so that -.B fc \-l \-10 +.if n ``fc \-l \-10'' +.if t \f(CWfc \-l \-10\fP prints the last 10 commands) and to .I first otherwise. @@ -5771,9 +6258,11 @@ specifies a job that was started without job control. .B getopts is used by shell procedures to parse positional parameters. .I optstring -contains the option letters to be recognized; if a letter +contains the option characters to be recognized; if a character is followed by a colon, the option is expected to have an argument, which should be separated from it by white space. +The colon and question mark characters may not be used as +option characters. Each time it is invoked, .B getopts places the next option in the shell variable @@ -5888,7 +6377,7 @@ The return status is true unless a .I name is not found or an invalid option is supplied. .TP -\fBhelp\fP [\fIpattern\fP] +\fBhelp\fP [\fB\-s\fP] [\fIpattern\fP] Display helpful information about builtin commands. If .I pattern is specified, @@ -5896,11 +6385,18 @@ is specified, gives detailed help on all commands matching .IR pattern ; otherwise help for all the builtins and shell control structures -is printed. The return status is 0 unless no command matches +is printed. +The \fB\-s\fP option restricts the information displayed to a short +usage synopsis. +The return status is 0 unless no command matches .IR pattern . .TP .PD 0 -\fBhistory\fP [\fB\-c\fP] [\fIn\fP] +\fBhistory [\fIn\fP] +.TP +\fBhistory\fP \fB\-c\fP +.TP +\fBhistory \-d\fP \fIoffset\fP .TP \fBhistory\fP \fB\-anrw\fP [\fIfilename\fP] .TP @@ -5924,6 +6420,12 @@ is used. Options, if supplied, have the following meanings: .RS .PD 0 .TP +.B \-c +Clear the history list by deleting all the entries. +.TP +\fB\-d\fP \fIoffset\fP +Delete the history entry at position \fIoffset\fP. +.TP .B \-a Append the ``new'' history lines (history lines entered since the beginning of the current \fBbash\fP session) to the history file. @@ -5942,9 +6444,6 @@ and use them as the current history. Write the current history to the history file, overwriting the history file's contents. .TP -.B \-c -Clear the history list by deleting all the entries. -.TP .B \-p Perform history substitution on the following \fIargs\fP and display the result on the standard output. @@ -5960,8 +6459,10 @@ history list is removed before the are added. .PD .PP -The return value is 0 unless an invalid option is encountered or an -error occurs while reading or writing the history file. +The return value is 0 unless an invalid option is encountered, an +error occurs while reading or writing the history file, an invalid +\fIoffset\fP is supplied as an argument to \fB\-d\fP, or the +history expansion supplied as an argument to \fB\-p\fP fails. .RE .TP .PD 0 @@ -6077,11 +6578,12 @@ evaluates to 0, .B let returns 1; 0 is returned otherwise. .TP -\fBlocal\fP [\fIname\fP[=\fIvalue\fP] ...] +\fBlocal\fP [\fIoption\fP] [\fIname\fP[=\fIvalue\fP] ...] For each argument, a local variable named .I name is created, and assigned .IR value . +The \fIoption\fP can be any of the options accepted by \fBdeclare\fP. When .B local is used within a function, it causes the variable @@ -6094,9 +6596,10 @@ an error to use .B local when not within a function. The return status is 0 unless .B local -is used outside a function, or an invalid +is used outside a function, an invalid .I name -is supplied. +is supplied, or +\fIname\fP is a readonly variable. .TP .B logout Exit a login shell. @@ -6114,15 +6617,25 @@ Arguments, if supplied, have the following meanings: Removes the \fIn\fPth entry counting from the left of the list shown by .BR dirs , -starting with zero. For example: ``popd +0'' -removes the first directory, ``popd +1'' the second. +starting with zero. For example: +.if n ``popd +0'' +.if t \f(CWpopd +0\fP +removes the first directory, +.if n ``popd +1'' +.if t \f(CWpopd +1\fP +the second. .TP \fB\-\fP\fIn\fP Removes the \fIn\fPth entry counting from the right of the list shown by .BR dirs , -starting with zero. For example: ``popd -0'' -removes the last directory, ``popd -1'' the next to last. +starting with zero. For example: +.if n ``popd -0'' +.if t \f(CWpopd -0\fP +removes the last directory, +.if n ``popd -1'' +.if t \f(CWpopd -1\fP +the next to last. .TP .B \-n Suppresses the normal change of directory when removing directories @@ -6156,7 +6669,8 @@ In addition to the standard \fIprintf\fP(1) formats, %b causes The \fIformat\fP is reused as necessary to consume all of the \fIarguments\fP. If the \fIformat\fP requires more \fIarguments\fP than are supplied, the extra format specifications behave as if a zero value or null string, as -appropriate, had been supplied. +appropriate, had been supplied. The return value is zero on success, +non-zero on failure. .TP .PD 0 \fBpushd\fP [\fB\-n\fP] [\fIdir\fP] @@ -6188,7 +6702,7 @@ starting with zero) is at the top. Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. .TP -.B dir +.I dir Adds .I dir to the directory stack at the top, making it the @@ -6213,8 +6727,8 @@ fails. .RE .TP \fBpwd\fP [\fB\-LP\fP] -Print the absolute file name of the current working directory. -The file name printed contains no symbolic links if the +Print the absolute pathname of the current working directory. +The pathname printed contains no symbolic links if the .B \-P option is supplied or the .B \-o physical @@ -6223,12 +6737,12 @@ option to the builtin command is enabled. If the .B \-L -option is used, symbolic links are followed. +option is used, the pathname printed may contain symbolic links. The return status is 0 unless an error occurs while reading the name of the current directory or an invalid option is supplied. .TP -\fBread\fP [\fB\-er\fP] [\fB\-a\fP \fIaname\fP] [\fB\-p\fP \fIprompt\fP] [\fIname\fP ...] +\fBread\fP [\fB\-ers\fP] [\fB\-t\fP \fItimeout\fP] [\fB\-a\fP \fIaname\fP] [\fB\-p\fP \fIprompt\fP] [\fB\-n\fP \fInchars\fP] [\fB\-d\fP \fIdelim\fP] [\fIname\fP ...] One line is read from the standard input, and the first word is assigned to the first .IR name , @@ -6249,18 +6763,7 @@ Options, if supplied, have the following meanings: .RS .PD 0 .TP -.B \-r -Backslash does not act as an escape character. -The backslash is considered to be part of the line. -In particular, a backslash-newline pair may not be used as a line -continuation. -.TP -.B \-p -Display \fIprompt\fP, without a -trailing newline, before attempting to read any input. The prompt -is displayed only if input is coming from a terminal. -.TP -.B \-a +.B \-a \fIaname\fP The words are assigned to sequential indices of the array variable .IR aname , @@ -6269,6 +6772,10 @@ starting at 0. is unset before any new values are assigned. Other \fIname\fP arguments are ignored. .TP +.B \-d \fIdelim\fP +The first character of \fIdelim\fP is used to terminate the input line, +rather than newline. +.TP .B \-e If the standard input is coming from a terminal, @@ -6277,6 +6784,31 @@ is coming from a terminal, .SM .B READLINE above) is used to obtain the line. +.TP +.B \-n \fInchars\fP +\fBread\fP returns after reading \fInchars\fP characters rather than +waiting for a complete line of input. +.TP +.B \-p \fIprompt\fP +Display \fIprompt\fP, without a +trailing newline, before attempting to read any input. The prompt +is displayed only if input is coming from a terminal. +.TP +.B \-r +Backslash does not act as an escape character. +The backslash is considered to be part of the line. +In particular, a backslash-newline pair may not be used as a line +continuation. +.TP +.B \-s +Silent mode. If input is coming from a terminal, characters are +not echoed. +.TP +.B \-t \fItimeout\fP +Cause \fBread\fP to time out and return failure if a complete line of +input is not read within \fItimeout\fP seconds. +This option has no effect if \fBread\fP is not reading input from the +terminal or a pipe. .PD .PP If no @@ -6284,7 +6816,8 @@ If no are supplied, the line read is assigned to the variable .SM .BR REPLY . -The return code is zero, unless end-of-file is encountered. +The return code is zero, unless end-of-file is encountered or \fBread\fP +times out. .RE .TP \fBreadonly\fP [\fB\-apf\fP] [\fIname\fP ...] @@ -6308,7 +6841,8 @@ arguments are given, or if the option is supplied, a list of all readonly names is printed. The .B \-p -option causes output to be displayed in a format thatmay be reused as input. +option causes output to be displayed in a format that +may be reused as input. The return status is 0 unless an invalid option is encountered, one of the .I names @@ -6523,12 +7057,16 @@ the standard output. Turn on .I privileged mode. In this mode, the +.SM .B $ENV and +.SM .B $BASH_ENV files are not processed, shell functions are not inherited from the -environment, and the \fBSHELLOPTS\fP variable, if it appears in the -environment, is ignored. +environment, and the +.SM +.B SHELLOPTS +variable, if it appears in the environment, is ignored. If the shell is started with the effective user (group) id not equal to the real user (group) id, and the \fB\-p\fP option is not supplied, these actions are taken and the effective user id is set to the real user id. @@ -6812,6 +7350,14 @@ If set, and a file that \fBbash\fP is checking for mail has been accessed since the last time it was checked, the message ``The mail in \fImailfile\fP has been read'' is displayed. .TP 8 +.B no_empty_cmd_completion +If set, and +.B readline +is being used, +.B bash +will not attempt to search the \fBPATH\fP for possible completions when +completion is attempted on an empty line. +.TP 8 .B nocaseglob If set, .B bash @@ -6829,6 +7375,11 @@ files (see above) to expand to a null string, rather than themselves. .TP 8 +.B progcomp +If set, the programmable completion facilities (see +\fBProgrammable Completion\fP above) are enabled. +This option is enabled by default. +.TP 8 .B promptvars If set, prompt strings undergo variable and parameter expansion after being expanded as described in @@ -6858,6 +7409,10 @@ If set, the .B PATH to find the directory containing the file supplied as an argument. This option is enabled by default. +.TP 8 +.B xpg_echo +If set, the \fBecho\fP builtin expands backslash-escape sequences +by default. .RE .TP \fBsuspend\fP [\fB\-f\fP] @@ -6989,13 +7544,12 @@ is the null string the signal specified by each is ignored by the shell and by the commands it invokes. If .I arg -is +is not present and .B \-p -then the trap commands associated with -each +has been supplied, then the trap commands associated with each .I sigspec -are displayed. If no arguments are supplied or if -only +are displayed. +If no arguments are supplied or if only .B \-p is given, .B trap @@ -7188,10 +7742,7 @@ to that accepted by .IR chmod (1). If .I mode -is omitted, or if the -.B \-S -option is supplied, the -current value of the mask is printed. +is omitted, the current value of the mask is printed. The .B \-S option causes the mask to be printed in symbolic form; the @@ -7205,7 +7756,7 @@ The return status is 0 if the mode was successfully changed or if no \fImode\fP argument was supplied, and false otherwise. .TP \fBunalias\fP [\-\fBa\fP] [\fIname\fP ...] -Remove \fIname\fPs from the list of defined aliases. If +Remove each \fIname\fP from the list of defined aliases. If .B \-a is supplied, all alias definitions are removed. The return value is true unless a supplied @@ -7240,6 +7791,10 @@ If any of .BR LINENO , .SM .BR HISTCMD , +.SM +.BR FUNCNAME , +.SM +.BR GROUPS , or .SM .B DIRSTACK @@ -7265,6 +7820,8 @@ process or job waited for. .\" bash_builtins .if \n(zZ=1 .ig zZ .SH "RESTRICTED SHELL" +.\" rbash.1 +.zY .PP If .B bash @@ -7298,6 +7855,12 @@ as an argument to the .B . builtin command .IP \(bu +Specifying a filename containing a slash as an argument to the +.B \-p +option to the +.B hash +builtin command +.IP \(bu importing function definitions from the shell environment at startup .IP \(bu parsing the value of \fBSHELLOPTS\fP from the shell environment at startup @@ -7334,10 +7897,12 @@ above), .B rbash turns off any restrictions in the shell spawned to execute the script. +.\" end of rbash.1 +.if \n(zY=1 .ig zY .SH "SEE ALSO" .PD 0 .TP -\fIBash Features\fP, Brian Fox and Chet Ramey +\fIBash Reference Manual\fP, Brian Fox and Chet Ramey .TP \fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey .TP @@ -7375,7 +7940,7 @@ Individual \fIreadline\fP initialization file .SH AUTHORS Brian Fox, Free Software Foundation .br -bfox@gnu.ai.MIT.Edu +bfox@gnu.org .PP Chet Ramey, Case Western Reserve University .br @@ -7451,3 +8016,4 @@ reporting until some time after the command is entered. .PP Array variables may not (yet) be exported. .zZ +.zY diff --git a/doc/bashref.info b/doc/bashref.info index 01450d0..3b2b6da 100644 --- a/doc/bashref.info +++ b/doc/bashref.info @@ -1,4 +1,4 @@ -This is Info file bashref.info, produced by Makeinfo version 1.67 from +This is Info file bashref.info, produced by Makeinfo version 1.68 from the input file /usr/homes/chet/src/bash/src/doc/bashref.texi. INFO-DIR-SECTION Utilities @@ -9,9 +9,9 @@ END-INFO-DIR-ENTRY This text is a brief description of the features that are present in the Bash shell. -This is Edition 2.3, last updated 20 January 1999, +This is Edition 2.4, last updated 14 March 2000, of `The GNU Bash Reference Manual', -for `Bash', Version 2.03. +for `Bash', Version 2.04. Copyright (C) 1991-1999 Free Software Foundation, Inc. @@ -38,8 +38,8 @@ Bash Features This text is a brief description of the features that are present in the Bash shell. - This is Edition 2.3, last updated 20 January 1999, of `The GNU Bash -Reference Manual', for `Bash', Version 2.03. + This is Edition 2.4, last updated 14 March 2000, of `The GNU Bash +Reference Manual', for `Bash', Version 2.04. Copyright (C) 1991, 1993, 1996 Free Software Foundation, Inc. @@ -63,8 +63,9 @@ on shell behavior. * Basic Shell Features:: The shell "building blocks". -* Bourne Shell Features:: Features similar to those found in the - Bourne shell. +* Shell Builtin Commands:: Commands that are a part of the shell. + +* Shell Variables:: Variables used or set by Bash. * Bash Features:: Features found only in Bash. @@ -81,6 +82,10 @@ on shell behavior. * Reporting Bugs:: How to report bugs in Bash. +* Major Differences From The Bourne Shell:: A terse list of the differences + between Bash and historical + versions of /bin/sh. + * Builtin Index:: Index of Bash builtin commands. * Reserved Word Index:: Index of Bash reserved words. @@ -111,23 +116,23 @@ File: bashref.info, Node: What is Bash?, Next: What is a shell?, Up: Introduc What is Bash? ============= - Bash is the shell, or command language interpreter, that will appear -in the GNU operating system. The name is an acronym for the -`Bourne-Again SHell', a pun on Steve Bourne, the author of the direct -ancestor of the current Unix shell `/bin/sh', which appeared in the -Seventh Edition Bell Labs Research version of Unix. + Bash is the shell, or command language interpreter, for the GNU +operating system. The name is an acronym for the `Bourne-Again SHell', +a pun on Stephen Bourne, the author of the direct ancestor of the +current Unix shell `/bin/sh', which appeared in the Seventh Edition +Bell Labs Research version of Unix. - Bash is an `sh'-compatible shell that incorporates useful features -from the Korn shell `ksh' and the C shell `csh'. It is intended to be -a conformant implementation of the IEEE POSIX Shell and Tools -specification (IEEE Working Group 1003.2). It offers functional + Bash is largely compatible with `sh' and incorporates useful +features from the Korn shell `ksh' and the C shell `csh'. It is +intended to be a conformant implementation of the IEEE POSIX Shell and +Tools specification (IEEE Working Group 1003.2). It offers functional improvements over `sh' for both interactive and programming use. - While the GNU operating system will include a version of `csh', Bash -will be the default shell. Like other GNU software, Bash is quite -portable. It currently runs on nearly every version of Unix and a few -other operating systems - independently-supported ports exist for -MS-DOS, OS/2, Windows 95, and Windows NT. + While the GNU operating system provides other shells, including a +version of `csh', Bash is the default shell. Like other GNU software, +Bash is quite portable. It currently runs on nearly every version of +Unix and a few other operating systems - independently-supported ports +exist for MS-DOS, OS/2, Windows 95/98, and Windows NT. File: bashref.info, Node: What is a shell?, Prev: What is Bash?, Up: Introduction @@ -137,35 +142,41 @@ What is a shell? At its base, a shell is simply a macro processor that executes commands. A Unix shell is both a command interpreter, which provides -the user interface to the rich set of Unix utilities, and a programming +the user interface to the rich set of GNU utilities, and a programming language, allowing these utilitites to be combined. Files containing commands can be created, and become commands themselves. These new -commands have the same status as system commands in directories like +commands have the same status as system commands in directories such as `/bin', allowing users or groups to establish custom environments. - A shell allows execution of Unix commands, both synchronously and + A shell allows execution of GNU commands, both synchronously and asynchronously. The shell waits for synchronous commands to complete before accepting more input; asynchronous commands continue to execute in parallel with the shell while it reads and executes additional commands. The "redirection" constructs permit fine-grained control of -the input and output of those commands, and the shell allows control -over the contents of their environment. Unix shells also provide a -small set of built-in commands ("builtins") implementing functionality -impossible (e.g., `cd', `break', `continue', and `exec'), or -inconvenient (`history', `getopts', `kill', or `pwd', for example) to -obtain via separate utilities. Shells may be used interactively or -non-interactively: they accept input typed from the keyboard or from a -file. All of the shell builtins are described in subsequent sections. +the input and output of those commands. Moreover, the shell allows +control over the contents of commands' environments. Shells may be +used interactively or non-interactively: they accept input typed from +the keyboard or from a file. + + Shells also provide a small set of built-in commands ("builtins") +implementing functionality impossible or inconvenient to obtain via +separate utilities. For example, `cd', `break', `continue', and +`exec') cannot be implemented outside of the shell because they +directly manipulate the shell itself. The `history', `getopts', +`kill', or `pwd' builtins, among others, could be implemented in +separate utilities, but they are more convenient to use as builtin +commands. All of the shell builtins are described in subsequent +sections. While executing commands is essential, most of the power (and complexity) of shells is due to their embedded programming languages. Like any high-level language, the shell provides variables, flow control constructs, quoting, and functions. - Shells have begun offering features geared specifically for -interactive use rather than to augment the programming language. These -interactive features include job control, command line editing, history -and aliases. Each of these features is described in this manual. + Shells offer features geared specifically for interactive use rather +than to augment the programming language. These interactive features +include job control, command line editing, history and aliases. Each +of these features is described in this manual. File: bashref.info, Node: Definitions, Next: Basic Shell Features, Prev: Introduction, Up: Top @@ -241,12 +252,12 @@ Definitions A synonym for `exit status'. `signal' - A mechanism by which a process may be notified by the kernal of an + A mechanism by which a process may be notified by the kernel of an event occurring in the system. `special builtin' A shell builtin command that has been classified as special by the - POSIX.2 standard. + POSIX 1003.2 standard. `token' A sequence of characters considered a single unit by the shell. @@ -256,7 +267,7 @@ Definitions A `token' that is not an `operator'. -File: bashref.info, Node: Basic Shell Features, Next: Bourne Shell Features, Prev: Definitions, Up: Top +File: bashref.info, Node: Basic Shell Features, Next: Shell Builtin Commands, Prev: Definitions, Up: Top Basic Shell Features ******************** @@ -298,6 +309,20 @@ Shell Syntax * Comments:: How to specify comments. + When the shell reads input, it proceeds through a sequence of +operations. If the input indicates the beginning of a comment, the +shell ignores the comment symbol (`#'), and the rest of that line. + + Otherwise, roughly speaking, the shell reads its input and divides +the input into words and operators, employing the quoting rules to +select which meanings to assign various words and characters. + + The shell then parses these tokens into commands and other +constructs, removes the special meaning of certain words or characters, +expands others, redirects input and output as needed, executes the +specified command, waits for the command's exit status, and makes that +exit status available for further inspection or processing. + File: bashref.info, Node: Shell Operation, Next: Quoting, Up: Shell Syntax @@ -321,7 +346,7 @@ reads and executes a command. Basically, the shell does the following: 4. Performs the various shell expansions (*note Shell Expansions::.), breaking the expanded tokens into lists of filenames (*note - Filename Expansion::.) and commands and arguments. + Filename Expansion::.) and commands and arguments. 5. Performs any necessary redirections (*note Redirections::.) and removes the redirection operators and their operands from the @@ -356,10 +381,13 @@ or words to the shell. Quoting can be used to disable special treatment for special characters, to prevent reserved words from being recognized as such, and to prevent parameter expansion. - Each of the shell metacharacters (*note Definitions::.) has special + Each of the shell metacharacters (*note Definitions::.) has special meaning to the shell and must be quoted if it is to represent itself. -There are three quoting mechanisms: the ESCAPE CHARACTER, single -quotes, and double quotes. +When the command history expansion facilities are being used, the +HISTORY EXPANSION character, usually `!', must be quoted to prevent +history expansion. *Note Bash History Facilities:: for more details +concerning history expansion. There are three quoting mechanisms: the +ESCAPE CHARACTER, single quotes, and double quotes. File: bashref.info, Node: Escape Character, Next: Single Quotes, Up: Quoting @@ -380,9 +408,9 @@ File: bashref.info, Node: Single Quotes, Next: Double Quotes, Prev: Escape Ch Single Quotes ............. - Enclosing characters in single quotes preserves the literal value of -each character within the quotes. A single quote may not occur between -single quotes, even when preceded by a backslash. + Enclosing characters in single quotes (`'') preserves the literal +value of each character within the quotes. A single quote may not occur +between single quotes, even when preceded by a backslash. File: bashref.info, Node: Double Quotes, Next: ANSI-C Quoting, Prev: Single Quotes, Up: Quoting @@ -390,16 +418,16 @@ File: bashref.info, Node: Double Quotes, Next: ANSI-C Quoting, Prev: Single Q Double Quotes ............. - Enclosing characters in double quotes preserves the literal value of -all characters within the quotes, with the exception of `$', ``', and -`\'. The characters `$' and ``' retain their special meaning within -double quotes (*note Shell Expansions::.). The backslash retains its -special meaning only when followed by one of the following characters: -`$', ``', `"', `\', or `newline'. Within double quotes, backslashes -that are followed by one of these characters are removed. Backslashes -preceding characters without a special meaning are left unmodified. A -double quote may be quoted within double quotes by preceding it with a -backslash. + Enclosing characters in double quotes (`"') preserves the literal +value of all characters within the quotes, with the exception of `$', +``', and `\'. The characters `$' and ``' retain their special meaning +within double quotes (*note Shell Expansions::.). The backslash +retains its special meaning only when followed by one of the following +characters: `$', ``', `"', `\', or `newline'. Within double quotes, +backslashes that are followed by one of these characters are removed. +Backslashes preceding characters without a special meaning are left +unmodified. A double quote may be quoted within double quotes by +preceding it with a backslash. The special parameters `*' and `@' have special meaning when in double quotes (*note Shell Parameter Expansion::.). @@ -442,6 +470,9 @@ present, are decoded as follows: `\\' backslash +`\'' + single quote + `\NNN' the character whose `ASCII' code is the octal value NNN (one to three digits) @@ -450,7 +481,8 @@ present, are decoded as follows: the character whose `ASCII' code is the hexadecimal value NNN (one to three digits) -The result is single-quoted, as if the dollar sign had not been present. +The expanded result is single-quoted, as if the dollar sign had not +been present. File: bashref.info, Node: Locale Translation, Prev: ANSI-C Quoting, Up: Quoting @@ -475,8 +507,8 @@ Bash Builtins::.), a word beginning with `#' causes that word and all remaining characters on that line to be ignored. An interactive shell without the `interactive_comments' option enabled does not allow comments. The `interactive_comments' option is on by default in -interactive shells. *Note Is This Shell Interactive?::, for a -description of what makes a shell interactive. +interactive shells. *Note Interactive Shells::, for a description of +what makes a shell interactive. File: bashref.info, Node: Shell Commands, Next: Shell Functions, Prev: Shell Syntax, Up: Basic Shell Features @@ -484,6 +516,14 @@ File: bashref.info, Node: Shell Commands, Next: Shell Functions, Prev: Shell Shell Commands ============== + A simple shell command such as `echo a b c' consists of the command +itself followed by arguments, separated by spaces. + + More complex shell commands are composed of simple commands arranged +together in a variety of ways: in a pipeline in which the output of one +command becomes the input of a second, in a loop or conditional +construct, or in some other grouping. + * Menu: * Simple Commands:: The most common type of command. @@ -503,11 +543,12 @@ Simple Commands A simple command is the kind of command encountered most often. It's just a sequence of words separated by `blank's, terminated by one of the shell's control operators (*note Definitions::.). The first -word generally specifies a command to be executed. +word generally specifies a command to be executed, with the rest of the +words being that command's arguments. The return status (*note Exit Status::.) of a simple command is its -exit status as provided by the POSIX.1 `waitpid' function, or 128+N if -the command was terminated by signal N. +exit status as provided by the POSIX 1003.1 `waitpid' function, or +128+N if the command was terminated by signal N. File: bashref.info, Node: Pipelines, Next: Lists, Prev: Simple Commands, Up: Shell Commands @@ -560,9 +601,10 @@ followed by `;' and `&', which have equal precedence. If a command is terminated by the control operator `&', the shell executes the command asynchronously in a subshell. This is known as executing the command in the BACKGROUND. The shell does not wait for -the command to finish, and the return status is 0 (true). The standard -input for asynchronous commands, in the absence of any explicit -redirections, is redirected from `/dev/null'. +the command to finish, and the return status is 0 (true). When job +control is not active (*note Job Control::.), the standard input for +asynchronous commands, in the absence of any explicit redirections, is +redirected from `/dev/null'. Commands separated by a `;' are executed sequentially; the shell waits for each command to terminate in turn. The return status is the @@ -570,15 +612,15 @@ exit status of the last command executed. The control operators `&&' and `||' denote AND lists and OR lists, respectively. An AND list has the form - COMMAND && COMMAND2 + COMMAND1 && COMMAND2 -COMMAND2 is executed if, and only if, COMMAND returns an exit status of -zero. +COMMAND2 is executed if, and only if, COMMAND1 returns an exit status +of zero. An OR list has the form - COMMAND || COMMAND2 + COMMAND1 || COMMAND2 -COMMAND2 is executed if, and only if, COMMAND returns a non-zero exit +COMMAND2 is executed if, and only if, COMMAND1 returns a non-zero exit status. The return status of AND and OR lists is the exit status of the last @@ -592,7 +634,7 @@ Looping Constructs Bash supports the following looping constructs. - Note that wherever you see a `;' in the description of a command's + Note that wherever a `;' appears in the description of a command's syntax, it may be replaced with one or more newlines. `until' @@ -618,10 +660,25 @@ syntax, it may be replaced with one or more newlines. for NAME [in WORDS ...]; do COMMANDS; done Expand WORDS, and execute COMMANDS once for each member in the resultant list, with NAME bound to the current member. If `in - WORDS' is not present, `in "$@"' is assumed. The return status is - the exit status of the last command that executes. If there are - no items in the expansion of WORDS, no commands are executed, and - the return status is zero. + WORDS' is not present, the `for' command executes the COMMANDS + once for each positional parameter that is set, as if `in "$@"' + had been specified (*note Special Parameters::.). The return + status is the exit status of the last command that executes. If + there are no items in the expansion of WORDS, no commands are + executed, and the return status is zero. + + An alternate form of the `for' command is also supported: + + for (( EXPR1 ; EXPR2 ; EXPR3 )) ; do COMMANDS ; done + First, the arithmetic expression EXPR1 is evaluated according to + the rules described below (*note Shell Arithmetic::.). The + arithmetic expression EXPR2 is then evaluated repeatedly until it + evaluates to zero. Each time EXPR2 evaluates to a non-zero value, + COMMANDS are executed and the arithmetic expression EXPR3 is + evaluated. If any expression is omitted, it behaves as if it + evaluates to 1. The return value is the exit status of the last + command in LIST that is executed, or false if any of the + expressions is invalid. The `break' and `continue' builtins (*note Bourne Shell Builtins::.) may be used to control loop execution. @@ -767,8 +824,8 @@ Conditional Constructs `EXPRESSION1 || EXPRESSION2' True if either EXPRESSION1 or EXPRESSION2 is true. - The && and || commands do not execute EXPRESSION2 if the value of - EXPRESSION1 is sufficient to determine the return value of the + The `&&' and `||' commands do not execute EXPRESSION2 if the value + of EXPRESSION1 is sufficient to determine the return value of the entire conditional expression. @@ -815,7 +872,9 @@ Shell Functions Shell functions are a way to group commands for later execution using a single name for the group. They are executed just like a -"regular" command. Shell functions are executed in the current shell +"regular" command. When the name of a shell function is used as a +simple command name, the list of commands associated with that function +name is executed. Shell functions are executed in the current shell context; no new process is created to interpret them. Functions are declared using this syntax: @@ -828,11 +887,18 @@ COMMAND-LIST between { and }. This list is executed whenever NAME is specified as the name of a command. The exit status of a function is the exit status of the last command executed in the body. + Note that for historical reasons, the curly braces that surround the +body of the function must be separated from the body by `blank's or +newlines. This is because the braces are reserved words and are only +recognized as such when they are separated by whitespace. Also, the +COMMAND-LIST must be terminated with a semicolon or a newline. + When a function is executed, the arguments to the function become the positional parameters during its execution (*note Positional Parameters::.). The special parameter `#' that expands to the number of positional parameters is updated to reflect the change. Positional -parameter `0' is unchanged. +parameter `0' is unchanged. The `FUNCNAME' variable is set to the name +of the function while the function is executing. If the builtin command `return' is executed in a function, the function completes and execution resumes with the next command after @@ -892,8 +958,10 @@ Positional Parameters other than the single digit `0'. Positional parameters are assigned from the shell's arguments when it is invoked, and may be reassigned using the `set' builtin command. Positional parameter `N' may be -referenced as `${N}'. Positional parameters may not be assigned to -with assignment statements. The positional parameters are temporarily +referenced as `${N}', or as `$N' when `N' consists of a single digit. +Positional parameters may not be assigned to with assignment statements. +The `set' and `shift' builtins are used to set and unset them (*note +Shell Builtin Commands::.). The positional parameters are temporarily replaced when a shell function is executed (*note Shell Functions::.). When a positional parameter consisting of more than a single digit @@ -933,9 +1001,9 @@ only be referenced; assignment to them is not allowed. pipeline. `-' - Expands to the current option flags as specified upon invocation, - by the `set' builtin command, or those set by the shell itself - (such as the `-i' option). + (A hyphen.) Expands to the current option flags as specified upon + invocation, by the `set' builtin command, or those set by the + shell itself (such as the `-i' option). `$' Expands to the process ID of the shell. In a `()' subshell, it @@ -955,12 +1023,13 @@ only be referenced; assignment to them is not allowed. used to invoke Bash, as given by argument zero. `_' - At shell startup, set to the absolute filename of the shell or - shell script being executed as passed in the argument list. - Subsequently, expands to the last argument to the previous command, - after expansion. Also set to the full pathname of each command - executed and placed in the environment exported to that command. - When checking mail, this parameter holds the name of the mail file. + (An underscore.) At shell startup, set to the absolute filename + of the shell or shell script being executed as passed in the + argument list. Subsequently, expands to the last argument to the + previous command, after expansion. Also set to the full pathname + of each command executed and placed in the environment exported to + that command. When checking mail, this parameter holds the name + of the mail file. File: bashref.info, Node: Shell Expansions, Next: Redirections, Prev: Shell Parameters, Up: Basic Shell Features @@ -1014,7 +1083,7 @@ single word to a single word. The only exceptions to this are the expansions of `"$@"' (*note Special Parameters::.) and `"${NAME[@]}"' (*note Arrays::.). - After all expansions, `quote removal' (*note Quote Removal::.) is + After all expansions, `quote removal' (*note Quote Removal::.) is performed. @@ -1028,7 +1097,7 @@ generated. This mechanism is similar to FILENAME EXPANSION (*note Filename Expansion::.), but the file names generated need not exist. Patterns to be brace expanded take the form of an optional PREAMBLE, followed by a series of comma-separated strings between a pair of -braces, followed by an optional POSTSCRIPT. The preamble is prepended +braces, followed by an optional POSTSCRIPT. The preamble is prefixed to each string contained within the braces, and the postscript is then appended to each resulting string, expanding left to right. @@ -1040,7 +1109,9 @@ are not sorted; left to right order is preserved. For example, Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result. It is strictly textual. Bash does not apply any syntactic interpretation -to the context of the expansion or the text between the braces. +to the context of the expansion or the text between the braces. To +avoid conflicts with parameter expansion, the string `${' is not +considered eligible for brace expansion. A correctly-formed brace expansion must contain unquoted opening and closing braces, and at least one unquoted comma. Any incorrectly @@ -1144,13 +1215,17 @@ of variable indirection is introduced. Bash uses the value of the variable formed from the rest of PARAMETER as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of PARAMETER itself. This is -known as `indirect expansion'. +known as `indirect expansion'. The exception to this is the expansion +of ${!PREFIX*} described below. In each of the cases below, WORD is subject to tilde expansion, parameter expansion, command substitution, and arithmetic expansion. -When not performing substring expansion, Bash tests for a parameter + + When not performing substring expansion, Bash tests for a parameter that is unset or null; omitting the colon results in a test only for a -parameter that is unset. +parameter that is unset. Put another way, if the colon is included, +the operator tests for both existence and that the value is not null; +if the colon is omitted, the operator tests only for existence. `${PARAMETER:-WORD}' If PARAMETER is unset or null, the expansion of WORD is @@ -1174,9 +1249,9 @@ parameter that is unset. `${PARAMETER:OFFSET}' `${PARAMETER:OFFSET:LENGTH}' - Expands to up to LENGTH characters of PARAMETER, starting at the + Expands to up to LENGTH characters of PARAMETER starting at the character specified by OFFSET. If LENGTH is omitted, expands to - the substring of PARAMETER, starting at the character specified by + the substring of PARAMETER starting at the character specified by OFFSET. LENGTH and OFFSET are arithmetic expressions (*note Shell Arithmetic::.). This is referred to as Substring Expansion. @@ -1190,6 +1265,10 @@ parameter that is unset. the positional parameters are used, in which case the indexing starts at 1. +`${!PREFIX*}' + Expands to the names of variables whose names begin with PREFIX, + separated by the first character of the `IFS' special variable. + `${#PARAMETER}' The length in characters of the expanded value of PARAMETER is substituted. If PARAMETER is `*' or `@', the value substituted is @@ -1250,7 +1329,8 @@ Command Substitution -------------------- Command substitution allows the output of a command to replace the -command name. There are two forms: +command itself. Command substitution occurs when a command is enclosed +as follows: $(COMMAND) or @@ -1316,7 +1396,9 @@ some file in `/dev/fd'. The name of this file is passed as an argument to the current command as the result of the expansion. If the `>(LIST)' form is used, writing to the file will provide input for LIST. If the `<(LIST)' form is used, the file passed as an argument -should be read to obtain the output of LIST. +should be read to obtain the output of LIST. Note that no space may +appear between the `<' or `>' and the left parenthesis, otherwise the +construct would be interpreted as a redirection. When available, process substitution is performed simultaneously with parameter and variable expansion, command substitution, and arithmetic @@ -1346,7 +1428,7 @@ characters is also treated as a delimiter. If the value of `IFS' is null, no word splitting occurs. Explicit null arguments (`""' or `''') are retained. Unquoted -implicit null arguments, resulting from the expansion of PARAMETERs +implicit null arguments, resulting from the expansion of parameters that have no values, are removed. If a parameter with no value is expanded within double quotes, a null argument results and is retained. @@ -1363,17 +1445,17 @@ Filename Expansion * Pattern Matching:: How the shell matches patterns. After word splitting, unless the `-f' option has been set (*note The -Set Builtin::.), Bash scans each word for the characters `*', `?', `(', -and `['. If one of these characters appears, then the word is regarded -as a PATTERN, and replaced with an alphabetically sorted list of file +Set Builtin::.), Bash scans each word for the characters `*', `?', and +`['. If one of these characters appears, then the word is regarded as +a PATTERN, and replaced with an alphabetically sorted list of file names matching the pattern. If no matching file names are found, and the shell option `nullglob' is disabled, the word is left unchanged. If the `nullglob' option is set, and no matches are found, the word is removed. If the shell option `nocaseglob' is enabled, the match is performed without regard to the case of alphabetic characters. - When a pattern is used for filename generation, the character `.' at -the start of a filename or immediately following a slash must be + When a pattern is used for filename generation, the character `.' +at the start of a filename or immediately following a slash must be matched explicitly, unless the shell option `dotglob' is set. When matching a file name, the slash character must always be matched explicitly. In other cases, the `.' character is not treated specially. @@ -1384,7 +1466,7 @@ description of the `nocaseglob', `nullglob', and `dotglob' options. The `GLOBIGNORE' shell variable may be used to restrict the set of filenames matching a pattern. If `GLOBIGNORE' is set, each matching filename that also matches one of the patterns in `GLOBIGNORE' is -removed from the list of matches. The filenames `.' and `..' are +removed from the list of matches. The filenames `.' and `..' are always ignored, even when `GLOBIGNORE' is set. However, setting `GLOBIGNORE' has the effect of enabling the `dotglob' shell option, so all other filenames beginning with a `.' will match. To get the old @@ -1421,7 +1503,7 @@ quoted if they are to be matched literally. Within `[' and `]', CHARACTER CLASSES can be specified using the syntax `[:'CLASS`:]', where CLASS is one of the following classes - defined in the POSIX.2 standard: + defined in the POSIX 1003.2 standard: alnum alpha ascii blank cntrl digit graph lower print punct space upper xdigit @@ -1432,7 +1514,7 @@ quoted if they are to be matched literally. collation weight (as defined by the current locale) as the character C. - Within `[' and `]', the syntax `[.'SYMBOL`.]' matches the + Within `[' and `]', the syntax `[.'SYMBOL`.]' matches the collating symbol SYMBOL. If the `extglob' shell option is enabled using the `shopt' builtin, @@ -1488,21 +1570,46 @@ refers to the standard output (file descriptor 1). The word following the redirection operator in the following descriptions, unless otherwise noted, is subjected to brace expansion, tilde expansion, parameter expansion, command substitution, arithmetic -expansion, quote removal, and filename expansion. If it expands to -more than one word, Bash reports an error. +expansion, quote removal, filename expansion, and word splitting. If +it expands to more than one word, Bash reports an error. Note that the order of redirections is significant. For example, the command ls > DIRLIST 2>&1 -directs both standard output and standard error to the file DIRLIST, -while the command +directs both standard output (file descriptor 1) and standard error +(file descriptor 2) to the file DIRLIST, while the command ls 2>&1 > DIRLIST directs only the standard output to file DIRLIST, because the standard error was duplicated as standard output before the standard output was redirected to DIRLIST. + Bash handles several filenames specially when they are used in +redirections, as described in the following table: + +`/dev/fd/FD' + If FD is a valid integer, file descriptor FD is duplicated. + +`/dev/stdin' + File descriptor 0 is duplicated. + +`/dev/stdout' + File descriptor 1 is duplicated. + +`/dev/stderr' + File descriptor 2 is duplicated. + +`/dev/tcp/HOST/PORT' + If HOST is a valid hostname or Internet address, and PORT is an + integer port number, Bash attempts to open a TCP connection to the + corresponding socket. + +`/dev/udp/HOST/PORT' + If HOST is a valid hostname or Internet address, and PORT is an + integer port number, Bash attempts to open a UDP connection to the + corresponding socket. + A failure to open or create a file causes the redirection to fail. Redirecting Input @@ -1529,7 +1636,7 @@ to zero size. If the redirection operator is `>', and the `noclobber' option to the `set' builtin has been enabled, the redirection will fail if the -filename whose name results from the expansion of WORD exists and is a +file whose name results from the expansion of WORD exists and is a regular file. If the redirection operator is `>|', or the redirection operator is `>' and the `noclobber' option is not enabled, the redirection is attempted even if the file named by WORD exists. @@ -1576,14 +1683,14 @@ as the standard input for a command. HERE-DOCUMENT DELIMITER - No parameter expansion, command substitution, filename expansion, or -arithmetic expansion is performed on WORD. If any characters in WORD + No parameter expansion, command substitution, arithmetic expansion, +or filename expansion is performed on WORD. If any characters in WORD are quoted, the DELIMITER is the result of quote removal on WORD, and the lines in the here-document are not expanded. If WORD is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion. In the latter case, -the pair `\newline' is ignored, and `\' must be used to quote the -characters `\', `$', and ``'. +the character sequence `\newline' is ignored, and `\' must be used to +quote the characters `\', `$', and ``'. If the redirection operator is `<<-', then all leading tab characters are stripped from input lines and the line containing @@ -1703,7 +1810,7 @@ taken. 1. If the command name contains no slashes, the shell attempts to locate it. If there exists a shell function by that name, that - function is invoked as described above in *Note Shell Functions::. + function is invoked as described in *Note Shell Functions::. 2. If the name does not match a function, the shell searches for it in the list of shell builtins. If a match is found, that builtin @@ -1809,7 +1916,7 @@ Environment ENVIRONMENT. This is a list of name-value pairs, of the form `name=value'. - Bash allows you to manipulate the environment in several ways. On + Bash provides several ways to manipulate the environment. On invocation, the shell scans its own environment and creates a parameter for each name found, automatically marking it for EXPORT to child processes. Executed commands inherit the environment. The `export' @@ -1936,39 +2043,62 @@ invoked to interpret the script, with the exception that the locations of commands remembered by the parent (see the description of `hash' in *Note Bourne Shell Builtins::) are retained by the child. - Most versions of Unix make this a part of the kernel's command -execution mechanism. If the first line of a script begins with the two -characters `#!', the remainder of the line specifies an interpreter for -the program. The arguments to the interpreter consist of a single -optional argument following the interpreter name on the first line of -the script file, followed by the name of the script file, followed by -the rest of the arguments. Bash will perform this action on operating -systems that do not handle it themselves. Note that some older -versions of Unix limit the interpreter name and argument to a maximum -of 32 characters. + Most versions of Unix make this a part of the operating system's +command execution mechanism. If the first line of a script begins with +the two characters `#!', the remainder of the line specifies an +interpreter for the program. Thus, you can specify Bash, `awk', Perl, +or some other interpreter and write the rest of the script file in that +language. + + The arguments to the interpreter consist of a single optional +argument following the interpreter name on the first line of the script +file, followed by the name of the script file, followed by the rest of +the arguments. Bash will perform this action on operating systems that +do not handle it themselves. Note that some older versions of Unix +limit the interpreter name and argument to a maximum of 32 characters. + + Bash scripts often begin with `#! /bin/bash' (assuming that Bash has +been installed in `/bin'), since this ensures that Bash will be used to +interpret the script, even if it is executed under another shell. -File: bashref.info, Node: Bourne Shell Features, Next: Bash Features, Prev: Basic Shell Features, Up: Top +File: bashref.info, Node: Shell Builtin Commands, Next: Shell Variables, Prev: Basic Shell Features, Up: Top -Bourne Shell Style Features -*************************** +Shell Builtin Commands +********************** * Menu: * Bourne Shell Builtins:: Builtin commands inherited from the Bourne Shell. -* Bourne Shell Variables:: Variables which Bash uses in the same way - as the Bourne Shell. -* Other Bourne Shell Features:: Addtional aspects of Bash which behave in - the same way as the Bourne Shell. +* Bash Builtins:: Table of builtins specific to Bash. +* The Set Builtin:: This builtin is so overloaded it + deserves its own section. +* Special Builtins:: Builtin commands classified specially by + POSIX.2. - This section briefly summarizes things which Bash inherits from the -Bourne Shell: builtins, variables, and other features. It also lists -the significant differences between Bash and the Bourne Shell. Many of -the builtins have been extended by POSIX or Bash. + Builtin commands are contained within the shell itself. When the +name of a builtin command is used as the first word of a simple command +(*note Simple Commands::.), the shell executes the command directly, +without invoking another program. Builtin commands are necessary to +implement functionality impossible or inconvenient to obtain with +separate utilities. + + This section briefly the builtins which Bash inherits from the +Bourne Shell, as well as the builtin commands which are unique to or +have been extended in Bash. + + Several builtin commands are described in other chapters: builtin +commands which provide the Bash interface to the job control facilities +(*note Job Control Builtins::.), the directory stack (*note Directory +Stack Builtins::.), the command history (*note Bash History +Builtins::.), and the programmable completion facilities (*note +Programmable Completion Builtins::.). + + Many of the builtins have been extended by POSIX or Bash. -File: bashref.info, Node: Bourne Shell Builtins, Next: Bourne Shell Variables, Up: Bourne Shell Features +File: bashref.info, Node: Bourne Shell Builtins, Next: Bash Builtins, Up: Shell Builtin Commands Bourne Shell Builtins ===================== @@ -1977,22 +2107,23 @@ Bourne Shell Builtins Shell. These commands are implemented as specified by the POSIX 1003.2 standard. -`:' +`: (a colon)' : [ARGUMENTS] Do nothing beyond expanding ARGUMENTS and performing redirections. The return status is zero. -`.' +`. (a period)' . FILENAME [ARGUMENTS] Read and execute commands from the FILENAME argument in the current shell context. If FILENAME does not contain a slash, the - `$PATH' variable is used to find FILENAME. The current directory + `PATH' variable is used to find FILENAME. The current directory is searched if FILENAME is not found in `$PATH'. If any ARGUMENTS are supplied, they become the positional parameters when FILENAME is executed. Otherwise the positional parameters are unchanged. The return status is the exit status of the last command executed, or zero if no commands are executed. If FILENAME is not found, or - cannot be read, the return status is non-zero. + cannot be read, the return status is non-zero. This builtin is + equivalent to `source'. `break' break [N] @@ -2031,17 +2162,18 @@ standard. exec [-cl] [-a NAME] [COMMAND [ARGUMENTS]] If COMMAND is supplied, it replaces the shell without creating a new process. If the `-l' option is supplied, the shell places a - dash in the zeroth arg passed to COMMAND. This is what the - `login' program does. The `-c' option causes COMMAND to be - executed with an empty environment. If `-a' is supplied, the - shell passes NAME as the zeroth argument to COMMAND. If no + dash at the beginning of the zeroth arg passed to COMMAND. This + is what the `login' program does. The `-c' option causes COMMAND + to be executed with an empty environment. If `-a' is supplied, + the shell passes NAME as the zeroth argument to COMMAND. If no COMMAND is specified, redirections may be used to affect the current shell environment. If there are no redirection errors, the return status is zero; otherwise the return status is non-zero. `exit' exit [N] - Exit the shell, returning a status of N to the shell's parent. + Exit the shell, returning a status of N to the shell's parent. If + N is omitted, the exit status is that of the last command executed. Any trap on `EXIT' is executed before the shell terminates. `export' @@ -2060,18 +2192,19 @@ standard. `getopts' getopts OPTSTRING NAME [ARGS] `getopts' is used by shell scripts to parse positional parameters. - OPTSTRING contains the option letters to be recognized; if a letter - is followed by a colon, the option is expected to have an - argument, which should be separated from it by white space. Each - time it is invoked, `getopts' places the next option in the shell - variable NAME, initializing NAME if it does not exist, and the - index of the next argument to be processed into the variable - `OPTIND'. `OPTIND' is initialized to 1 each time the shell or a - shell script is invoked. When an option requires an argument, - `getopts' places that argument into the variable `OPTARG'. The - shell does not reset `OPTIND' automatically; it must be manually - reset between multiple calls to `getopts' within the same shell - invocation if a new set of parameters is to be used. + OPTSTRING contains the option characters to be recognized; if a + character is followed by a colon, the option is expected to have an + argument, which should be separated from it by white space. The + colon (`:') and question mark (`?') may not be used as option + characters. Each time it is invoked, `getopts' places the next + option in the shell variable NAME, initializing NAME if it does + not exist, and the index of the next argument to be processed into + the variable `OPTIND'. `OPTIND' is initialized to 1 each time the + shell or a shell script is invoked. When an option requires an + argument, `getopts' places that argument into the variable + `OPTARG'. The shell does not reset `OPTIND' automatically; it + must be manually reset between multiple calls to `getopts' within + the same shell invocation if a new set of parameters is to be used. When the end of options is encountered, `getopts' exits with a return value greater than zero. `OPTIND' is set to the index of @@ -2112,12 +2245,12 @@ standard. `pwd' pwd [-LP] - Print the current working directory. If the `-P' option is - supplied, the path printed will not contain symbolic links. If - the `-L' option is supplied, the path printed may contain symbolic - links. The return status is zero unless an error is encountered - while determining the name of the current directory or an invalid - option is supplied. + Print the absolute pathname of the current working directory. If + the `-P' option is supplied, the pathname printed will not contain + symbolic links. If the `-L' option is supplied, the pathname + printed may contain symbolic links. The return status is zero + unless an error is encountered while determining the name of the + current directory or an invalid option is supplied. `readonly' readonly [-apf] [NAME] ... @@ -2134,12 +2267,15 @@ standard. `return' return [N] - Cause a shell function to exit with the return value N. This may - also be used to terminate execution of a script being executed - with the `.' builtin, returning either N or the exit status of the + Cause a shell function to exit with the return value N. If N is + not supplied, the return value is the exit status of the last + command executed in the function. This may also be used to + terminate execution of a script being executed with the `.' (or + `source') builtin, returning either N or the exit status of the last command executed within the script as the exit status of the script. The return status is false if `return' is used outside a - function and not during the execution of a script by `.'. + function and not during the execution of a script by `.' or + `source'. `shift' shift [N] @@ -2148,8 +2284,9 @@ standard. Parameters represented by the numbers `$#' to N+1 are unset. N must be a non-negative number less than or equal to `$#'. If N is zero or greater than `$#', the positional parameters are not - changed. The return status is zero unless N is greater than `$#' - or less than zero, non-zero otherwise. + changed. If N is not supplied, it is assumed to be 1. The return + status is zero unless N is greater than `$#' or less than zero, + non-zero otherwise. `test' `[' @@ -2157,6 +2294,9 @@ standard. must be a separate argument. Expressions are composed of the primaries described below in *Note Bash Conditional Expressions::. + When the `[' form is used, the last argument to the command must + be a `]'. + Expressions may be combined using the following operators, listed in decreasing order of precedence. @@ -2225,16 +2365,17 @@ standard. specified signals are reset to the values they had when the shell was started. If ARG is the null string, then the signal specified by each SIGSPEC is ignored by the shell and commands it invokes. - If ARG is `-p', the shell displays the trap commands associated - with each SIGSPEC. If no arguments are supplied, or only `-p' is - given, `trap' prints the list of commands associated with each - signal number in a form that may be reused as shell input. Each - SIGSPEC is either a signal name such as `SIGINT' (with or without - the `SIG' prefix) or a signal number. If a SIGSPEC is `0' or - `EXIT', ARG is executed when the shell exits. If a SIGSPEC is - `DEBUG', the command ARG is executed after every simple command. - The `-l' option causes the shell to print a list of signal names - and their corresponding numbers. + If ARG is not present and `-p' has been supplied, the shell + displays the trap commands associated with each SIGSPEC. If no + arguments are supplied, or only `-p' is given, `trap' prints the + list of commands associated with each signal number in a form that + may be reused as shell input. Each SIGSPEC is either a signal + name such as `SIGINT' (with or without the `SIG' prefix) or a + signal number. If a SIGSPEC is `0' or `EXIT', ARG is executed + when the shell exits. If a SIGSPEC is `DEBUG', the command ARG is + executed after every simple command. The `-l' option causes the + shell to print a list of signal names and their corresponding + numbers. Signals ignored upon entry to the shell cannot be trapped or reset. Trapped signals are reset to their original values in a child @@ -2256,6 +2397,10 @@ standard. the mode is successfully changed or if no MODE argument is supplied, and non-zero otherwise. + Note that when the mode is interpreted as an octal number, each + number of the umask is subtracted from `7'. Thus, a umask of `022' + results in permissions of `755'. + `unset' unset [-fv] [NAME] Each variable or function NAME is removed. If no options are @@ -2266,628 +2411,37 @@ standard. zero unless a NAME does not exist or is readonly. -File: bashref.info, Node: Bourne Shell Variables, Next: Other Bourne Shell Features, Prev: Bourne Shell Builtins, Up: Bourne Shell Features - -Bourne Shell Variables -====================== - - Bash uses certain shell variables in the same way as the Bourne -shell. In some cases, Bash assigns a default value to the variable. - -`CDPATH' - A colon-separated list of directories used as a search path for - the `cd' builtin command. - -`HOME' - The current user's home directory; the default for the `cd' builtin - command. The value of this variable is also used by tilde - expansion (*note Tilde Expansion::.). - -`IFS' - A list of characters that separate fields; used when the shell - splits words as part of expansion. - -`MAIL' - If this parameter is set to a filename and the `MAILPATH' variable - is not set, Bash informs the user of the arrival of mail in the - specified file. - -`MAILPATH' - A colon-separated list of filenames which the shell periodically - checks for new mail. Each list entry can specify the message that - is printed when new mail arrives in the mail file by separating - the file name from the message with a `?'. When used in the text - of the message, `$_' expands to the name of the current mail file. - -`OPTARG' - The value of the last option argument processed by the `getopts' - builtin. - -`OPTIND' - The index of the last option argument processed by the `getopts' - builtin. - -`PATH' - A colon-separated list of directories in which the shell looks for - commands. - -`PS1' - The primary prompt string. The default value is `\s-\v\$ '. - -`PS2' - The secondary prompt string. The default value is `> '. - - -File: bashref.info, Node: Other Bourne Shell Features, Prev: Bourne Shell Variables, Up: Bourne Shell Features - -Other Bourne Shell Features -=========================== - -* Menu: - -* Major Differences From The Bourne Shell:: Major differences between - Bash and 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 subsequent sections. - - -File: bashref.info, Node: Major Differences From The Bourne Shell, Up: Other Bourne Shell Features - -Major Differences From The SVR4.2 Bourne Shell ----------------------------------------------- - - * Bash is POSIX-conformant, even where the POSIX specification - differs from traditional `sh' behavior. - - * Bash has multi-character invocation options (*note Invoking - Bash::.). - - * Bash has command-line editing (*note Command Line Editing::.) and - the `bind' builtin. - - * Bash has command history (*note Bash History Facilities::.) and the - `history' and `fc' builtins to manipulate it. - - * Bash implements `csh'-like history expansion (*note History - Interaction::.). - - * Bash has one-dimensional array variables (*note 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 (*note 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 (*note Locale - Translation::.). - - * Bash implements the `!' keyword to negate the return value of a - pipeline (*note Pipelines::.). Very useful when an `if' statement - needs to act only if a test fails. - - * Bash has the `time' reserved word and command timing (*note - Pipelines::.). The display of the timing statistics may be - controlled with the `TIMEFORMAT' variable. - - * Bash includes the `select' compound command, which allows the - generation of simple menus (*note Conditional Constructs::.). - - * Bash includes the `[[' compound command, which makes conditional - testing part of the shell grammar (*note Conditional - Constructs::.). - - * Bash includes brace expansion (*note Brace Expansion::.) and tilde - expansion (*note Tilde Expansion::.). - - * Bash implements command aliases and the `alias' and `unalias' - builtins (*note Aliases::.). - - * Bash provides shell arithmetic, the `((' compound command (*note - Conditional Constructs::.), and arithmetic expansion (*note 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 (*note Shell Parameter Expansion::.). - - * The expansion `${#xx}', which returns the length of `${xx}', is - supported (*note 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 (*note Shell Parameter Expansion::.). - - * The expansion `${var/[/]'PATTERN`[/'REPLACEMENT`]}', which matches - PATTERN and replaces it with REPLACEMENT in the value of `var', is - available (*note Shell Parameter Expansion::.). - - * Bash has INDIRECT variable expansion using `${!word}' (*note Shell - Parameter Expansion::.). - - * Bash can expand positional parameters beyond `$9' using `${NUM}'. - - * The POSIX `$()' form of command substitution is implemented (*note - Command Substitution::.), and preferred to the Bourne shell's ```' - (which is also implemented for backwards compatibility). - - * Bash has process substitution (*note 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'). *Note Bash Variables::, for details. - - * The `IFS' variable is used to split only the results of expansion, - not all words (*note Word Splitting::.). This closes a - longstanding shell security hole. - - * Bash implements the full set of POSIX.2 filename expansion - operators, including CHARACTER CLASSES, EQUIVALENCE CLASSES, and - COLLATING SYMBOLS (*note Filename Expansion::.). - - * Bash implements extended pattern matching features when the - `extglob' shell option is enabled (*note 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. - - * Variable assignments preceding commands affect only that command, - even builtins and functions (*note 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. - - * 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 (*note Redirections::.). - - * The `noclobber' option is available to avoid overwriting existing - files with output redirection (*note The Set Builtin::.). The - `>|' redirection operator may be used to override `noclobber'. - - * The Bash `cd' and `pwd' builtins (*note Bourne Shell Builtins::.) - each take `-L' and `-P' builtins 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 (*note Bash - Builtins::.). - - * The `command' builtin allows selective disabling of functions when - command lookup is performed (*note Bash Builtins::.). - - * Individual builtins may be enabled or disabled using the `enable' - builtin (*note Bash Builtins::.). - - * 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 - (*note Bourne Shell Builtins::.). - - * Shell functions may be exported to children via the environment - using `export -f' (*note 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' (*note Bourne Shell - Builtins::.). - - * Bash includes a `help' builtin for quick reference to shell - facilities (*note Bash Builtins::.). - - * The `printf' builtin is available to display formatted output - (*note Bash Builtins::.). - - * The Bash `read' builtin (*note Bash Builtins::.) will read a line - ending in `\' with the `-r' option, and will use the `REPLY' - variable as a default if no 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 `return' builtin may be used to abort execution of scripts - executed with the `.' or `source' builtins (*note Bourne Shell - Builtins::.). - - * Bash includes the `shopt' builtin, for finer control of shell - optional capabilities (*note Bash Builtins::.). - - * Bash has much more optional behavior controllable with the `set' - builtin (*note The Set Builtin::.). - - * The `test' builtin (*note 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 (*note 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. - - * The Bash `type' builtin is more extensive and gives more - information about the names it finds (*note Bash Builtins::.). - - * 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 (*note Bourne Shell Builtins::.). - - * Bash implements a `csh'-like directory stack, and provides the - `pushd', `popd', and `dirs' builtins to manipulate it (*note 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 (*note Printing a Prompt::.). - - * The Bash restricted mode is more useful (*note 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 (*note 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 *Note Bash Features::. - -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.2 special builtins fails, and only - for certain failures, as enumerated in the POSIX.2 standard. - - * The SVR4.2 shell behaves differently when invoked as `jsh' (it - turns on job control). - - -File: bashref.info, Node: Bash Features, Next: Job Control, Prev: Bourne Shell Features, Up: Top - -Bash Features -************* - - This section describes features unique to Bash. - -* Menu: - -* Invoking Bash:: Command line options that you can give - to Bash. -* Bash Startup Files:: When and how Bash executes scripts. -* Is This Shell Interactive?:: Determining the state of a running Bash. -* Bash Builtins:: Table of builtins specific to Bash. -* The Set Builtin:: This builtin is so overloaded it - deserves its own section. -* Bash Conditional Expressions:: Primitives used in composing expressions for - the `test' builtin. -* Bash Variables:: List of variables that exist in Bash. -* Shell Arithmetic:: Arithmetic on shell variables. -* Aliases:: Substituting one command for another. -* Arrays:: Array Variables. -* The Directory Stack:: History of visited directories. -* Printing a Prompt:: Controlling the PS1 string. -* The Restricted Shell:: A more controlled mode of shell execution. -* Bash POSIX Mode:: Making Bash behave more closely to what - the POSIX standard specifies. - - -File: bashref.info, Node: Invoking Bash, Next: Bash Startup Files, Up: Bash Features - -Invoking Bash -============= - - bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o OPTION] [ARGUMENT ...] - bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o OPTION] -c STRING [ARGUMENT ...] - bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o OPTION] [ARGUMENT ...] - - In addition to the single-character shell command-line options -(*note The Set Builtin::.), there are several multi-character options -that you can use. These options must appear on the command line before -the single-character options in order for them to be recognized. - -`--dump-po-strings' - Equivalent to `-D', but the output is in the GNU `gettext' PO - (portable object) file format. - -`--dump-strings' - Equivalent to `-D'. - -`--help' - Display a usage message on standard output and exit sucessfully. - -`--login' - Make this shell act as if it were directly invoked by login. This - is equivalent to `exec -l bash' but can be issued from another - shell, such as `csh'. `exec bash --login' will replace the - current shell with a Bash login shell. - -`--noediting' - Do not use the GNU Readline library (*note Command Line Editing::.) - to read interactive command lines. - -`--noprofile' - Don't load the system-wide startup file `/etc/profile' or any of - the personal initialization files `~/.bash_profile', - `~/.bash_login', or `~/.profile' when Bash is invoked as a login - shell. - -`--norc' - Don't read the `~/.bashrc' initialization file in an interactive - shell. This is on by default if the shell is invoked as `sh'. - -`--posix' - Change the behavior of Bash where the default operation differs - from the POSIX 1003.2 standard to match the standard. This is - intended to make Bash behave as a strict superset of that - standard. *Note Bash POSIX Mode::, for a description of the Bash - POSIX mode. - -`--rcfile FILENAME' - Execute commands from FILENAME (instead of `~/.bashrc') in an - interactive shell. - -`--restricted' - Make the shell a restricted shell (*note The Restricted Shell::.). - -`--verbose' - Equivalent to `-v'. - -`--version' - Show version information for this instance of Bash on the standard - output and exit successfully. - - There are several single-character options that may be supplied at -invocation which are not available with the `set' builtin. - -`-c STRING' - Read and execute commands from STRING after processing the - options, then exit. Any remaining arguments are assigned to the - positional parameters, starting with `$0'. - -`-i' - Force the shell to run interactively. - -`-r' - Make the shell a restricted shell (*note The Restricted Shell::.). - -`-s' - If this option is present, or if no arguments remain after option - processing, then commands are read from the standard input. This - option allows the positional parameters to be set when invoking an - interactive shell. - -`-D' - A list of all double-quoted strings preceded by `$' is printed on - the standard ouput. These are the strings that are subject to - language translation when the current locale is not `C' or `POSIX' - (*note Locale Translation::.). This implies the `-n' option; no - commands will be executed. - -`--' - A `--' signals the end of options and disables further option - processing. Any arguments after the `--' are treated as filenames - and arguments. - - An *interactive* shell is one whose input and output are both -connected to terminals (as determined by `isatty(3)'), or one started -with the `-i' option. - - If arguments remain after option processing, and neither the `-c' -nor the `-s' option has been supplied, the first argument is assumed to -be the name of a file containing shell commands (*note Shell -Scripts::.). When Bash is invoked in this fashion, `$0' is set to the -name of the file, and the positional parameters are set to the -remaining arguments. Bash reads and executes commands from this file, -then exits. Bash's exit status is the exit status of the last command -executed in the script. If no commands are executed, the exit status -is 0. - - -File: bashref.info, Node: Bash Startup Files, Next: Is This Shell Interactive?, Prev: Invoking Bash, Up: Bash Features - -Bash Startup Files -================== - - This section describs how Bash executes its startup files. If any -of the files exist but cannot be read, Bash reports an error. Tildes -are expanded in file names as described above under Tilde Expansion -(*note Tilde Expansion::.). - - When Bash is invoked as an interactive login shell, or as a -non-interactive shell with the `--login' option, it first reads and -executes commands from the file `/etc/profile', if that file exists. -After reading that file, it looks for `~/.bash_profile', -`~/.bash_login', and `~/.profile', in that order, and reads and -executes commands from the first one that exists and is readable. The -`--noprofile' option may be used when the shell is started to inhibit -this behavior. - - When a login shell exits, Bash reads and executes commands from the -file `~/.bash_logout', if it exists. - - When an interactive shell that is not a login shell is started, Bash -reads and executes commands from `~/.bashrc', if that file exists. -This may be inhibited by using the `--norc' option. The `--rcfile -FILE' option will force Bash to read and execute commands from FILE -instead of `~/.bashrc'. - - So, typically, your `~/.bash_profile' contains the line - `if [ -f `~/.bashrc' ]; then . `~/.bashrc'; fi' - -after (or before) any login-specific initializations. - - When Bash is started non-interactively, to run a shell script, for -example, it looks for the variable `BASH_ENV' in the environment, -expands its value if it appears there, and uses the expanded value as -the name of a file to read and execute. Bash behaves as if the -following command were executed: - `if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi' - -but the value of the `PATH' variable is not used to search for the file -name. - - If Bash is invoked with the name `sh', it tries to mimic the startup -behavior of historical versions of `sh' as closely as possible, while -conforming to the POSIX standard as well. - - When invoked as an interactive login shell, or as a non-interactive -shell with the `--login' option, it first attempts to read and execute -commands from `/etc/profile' and `~/.profile', in that order. The -`--noprofile' option may be used to inhibit this behavior. When -invoked as an interactive shell with the name `sh', Bash looks for the -variable `ENV', expands its value if it is defined, and uses the -expanded value as the name of a file to read and execute. Since a -shell invoked as `sh' does not attempt to read and execute commands -from any other startup files, the `--rcfile' option has no effect. A -non-interactive shell invoked with the name `sh' does not attempt to -read any other startup files. - - When invoked as `sh', Bash enters POSIX mode after the startup files -are read. - - When Bash is started in POSIX mode, as with the `--posix' command -line option, it follows the POSIX standard for startup files. In this -mode, interactive shells expand the `ENV' variable and commands are -read and executed from the file whose name is the expanded value. No -other startup files are read. - - Bash attempts to determine when it is being run by the remote shell -daemon, usually `rshd'. If Bash determines it is being run by rshd, it -reads and executes commands from `~/.bashrc', if that file exists and -is readable. It will not do this if invoked as `sh'. The `--norc' -option may be used to inhibit this behavior, and the `--rcfile' option -may be used to force another file to be read, but `rshd' does not -generally invoke the shell with those options or allow them to be -specified. - - If Bash is started with the effective user (group) id not equal to -the real user (group) id, and the `-p' option is not supplied, no -startup files are read, shell functions are not inherited from the -environment, the `SHELLOPTS' variable, if it appears in the -environment, is ignored, and the effective user id is set to the real -user id. If the `-p' option is supplied at invocation, the startup -behavior is the same, but the effective user id is not reset. - - -File: bashref.info, Node: Is This Shell Interactive?, Next: Bash Builtins, Prev: Bash Startup Files, Up: Bash Features - -Is This Shell Interactive? -========================== - - As defined in *Note Invoking Bash::, an interactive shell is one -whose input and output are both connected to terminals (as determined -by `isatty(3)'), or one started with the `-i' option. - - To determine within a startup script whether Bash is running -interactively or not, examine the variable `$PS1'; it is unset in -non-interactive shells, and set in interactive shells. Thus: - - if [ -z "$PS1" ]; then - echo This shell is not interactive - else - echo This shell is interactive - fi - - Alternatively, startup scripts may test the value of the `-' special -parameter. It contains `i' when the shell is interactive. For example: - - case "$-" in - *i*) echo This shell is interactive ;; - *) echo This shell is not interactive ;; - esac - - -File: bashref.info, Node: Bash Builtins, Next: The Set Builtin, Prev: Is This Shell Interactive?, Up: Bash Features +File: bashref.info, Node: Bash Builtins, Next: The Set Builtin, Prev: Bourne Shell Builtins, Up: Shell Builtin Commands Bash Builtin Commands ===================== This section describes builtin commands which are unique to or have -been extended in Bash. +been extended in Bash. Some of these commands are specified in the +POSIX 1003.2 standard. + +`alias' + alias [`-p'] [NAME[=VALUE] ...] + + Without arguments or with the `-p' option, `alias' prints the list + of aliases on the standard output in a form that allows them to be + reused as input. If arguments are supplied, an alias is defined + for each NAME whose VALUE is given. If no VALUE is given, the name + and value of the alias is printed. Aliases are described in *Note + Aliases::. `bind' bind [-m KEYMAP] [-lpsvPSV] bind [-m KEYMAP] [-q FUNCTION] [-u FUNCTION] [-r KEYSEQ] bind [-m KEYMAP] -f FILENAME + bind [-m KEYMAP] -x KEYSEQ:SHELL-COMMAND bind [-m KEYMAP] KEYSEQ:FUNCTION-NAME - Display current Readline (*note Command Line Editing::.) key and + Display current Readline (*note Command Line Editing::.) key and function bindings, or bind a key sequence to a Readline function - or macro. The binding syntax accepted is identical to that of - `.inputrc' (*note Readline Init File::.), but each binding must be - passed as a separate argument: e.g., + or macro. The binding syntax accepted is identical to that of a + Readline initialization file (*note Readline Init File::.), but + each binding must be passed as a separate argument: e.g., `"\C-x\C-r":re-read-init-file'. Options, if supplied, have the following meanings: @@ -2903,21 +2457,24 @@ been extended in Bash. `-p' Display Readline function names and bindings in such a way - that they can be re-read. + that they can be used as input or in a Readline + initialization file. `-P' List current Readline function names and bindings. `-v' Display Readline variable names and values in such a way that - they can be re-read. + they can be used as input or in a Readline initialization + file. `-V' List current Readline variable names and values. `-s' Display Readline key sequences bound to macros and the - strings they output in such a way that they can be re-read. + strings they output in such a way that they can be used as + input or in a Readline initialization file. `-S' Display Readline key sequences bound to macros and the @@ -2935,6 +2492,9 @@ been extended in Bash. `-r KEYSEQ' Remove any current binding for KEYSEQ. + `-x KEYSEQ:SHELL-COMMAND' + Cause SHELL-COMMAND to be executed whenever KEYSEQ is entered. + The return status is zero unless an invalid option is supplied or an error occurs. @@ -3019,6 +2579,8 @@ been extended in Bash. interpretation of the following backslash-escaped characters is enabled. The `-E' option disables the interpretation of these escape characters, even on systems where they are interpreted by + default. The `xpg_echo' shell option may be used to dynamically + determine whether or not `echo' expands these escape characters by default. `echo' interprets the following escape sequences: `\a' alert (bell) @@ -3062,7 +2624,7 @@ been extended in Bash. enable [-n] [-p] [-f FILENAME] [-ads] [NAME ...] Enable and disable builtin shell commands. Disabling a builtin allows a disk command which has the same name as a shell builtin - to be executed with specifying a full pathname, even though the + to be executed without specifying a full pathname, even though the shell normally searches for builtins before disk commands. If `-n' is used, the NAMEs become disabled. Otherwise NAMEs are enabled. For example, to use the `test' binary found via `$PATH' @@ -3081,17 +2643,19 @@ been extended in Bash. If there are no options, a list of the shell builtins is displayed. The `-s' option restricts `enable' to the POSIX special builtins. If `-s' is used with `-f', the new builtin becomes a special - builtin. + builtin (*note Special Builtins::.). The return status is zero unless a NAME is not a shell builtin or there is an error loading a new builtin from a shared object. `help' - help [PATTERN] + help [-s] [PATTERN] Display helpful information about builtin commands. If PATTERN is specified, `help' gives detailed help on all commands matching - PATTERN, otherwise a list of the builtins is printed. The return - status is zero unless no command matches PATTERN. + PATTERN, otherwise a list of the builtins is printed. The `-s' + option restricts the information displayed to a short usage + synopsis. The return status is zero unless no command matches + PATTERN. `let' let EXPRESSION [EXPRESSION] @@ -3101,12 +2665,14 @@ been extended in Bash. evaluates to 0, `let' returns 1; otherwise 0 is returned. `local' - local NAME[=VALUE] + local [OPTION] NAME[=VALUE] For each argument, a local variable named NAME is created, and - assigned VALUE. `local' can only be used within a function; it - makes the variable NAME have a visible scope restricted to that - function and its children. The return status is zero unless - `local' is used outside a function or an invalid NAME is supplied. + assigned VALUE. The OPTION can be any of the options accepted by + `declare'. `local' can only be used within a function; it makes + the variable NAME have a visible scope restricted to that function + and its children. The return status is zero unless `local' is + used outside a function, an invalid NAME is supplied, or NAME is a + readonly variable. `logout' logout [N] @@ -3129,10 +2695,11 @@ been extended in Bash. The FORMAT is reused as necessary to consume all of the ARGUMENTS. If the FORMAT requires more ARGUMENTS than are supplied, the extra format specifications behave as if a zero value or null string, as - appropriate, had been supplied. + appropriate, had been supplied. The return value is zero on + success, non-zero on failure. `read' - read [-a ANAME] [-p PROMPT] [-er] [NAME ...] + read [-ers] [-a ANAME] [-p PROMPT] [-t TIMEOUT] [-n NCHARS] [-d DELIM] [NAME ...] One line is read from the standard input, and the first word is assigned to the first NAME, the second word to the second NAME, and so on, with leftover words and their intervening separators @@ -3143,19 +2710,8 @@ been extended in Bash. may be used to remove any special meaning for the next character read and for line continuation. If no names are supplied, the line read is assigned to the variable `REPLY'. The return code is - zero, unless end-of-file is encountered. Options, if supplied, - have the following meanings: - - `-r' - If this option is given, backslash does not act as an escape - character. The backslash is considered to be part of the - line. In particular, a backslash-newline pair may not be - used as a line continuation. - - `-p PROMPT' - Display PROMPT, without a trailing newline, before attempting - to read any input. The prompt is displayed only if input is - coming from a terminal. + zero, unless end-of-file is encountered or `read' times out. + Options, if supplied, have the following meanings: `-a ANAME' The words are assigned to sequential indices of the array @@ -3163,10 +2719,39 @@ been extended in Bash. ANAME before the assignment. Other NAME arguments are ignored. + `-d DELIM' + The first character of DELIM is used to terminate the input + line, rather than newline. + `-e' Readline (*note Command Line Editing::.) is used to obtain the line. + `-n NCHARS' + `read' returns after reading NCHARS characters rather than + waiting for a complete line of input. + + `-p PROMPT' + Display PROMPT, without a trailing newline, before attempting + to read any input. The prompt is displayed only if input is + coming from a terminal. + + `-r' + If this option is given, backslash does not act as an escape + character. The backslash is considered to be part of the + line. In particular, a backslash-newline pair may not be + used as a line continuation. + + `-s' + Silent mode. If input is coming from a terminal, characters + are not echoed. + + `-t TIMEOUT' + Cause `read' to time out and return failure if a complete + line of input is not read within TIMEOUT seconds. This + option has no effect if `read' is not reading input from the + terminal or a pipe. + `shopt' shopt [-pqsu] [-o] [OPTNAME ...] Toggle the values of variables controlling optional shell behavior. @@ -3242,8 +2827,8 @@ been extended in Bash. fails. `expand_aliases' - If set, aliases are expanded as described below< under Aliases - (*note Aliases::.). This option is enabled by default for + If set, aliases are expanded as described below under Aliases, + *Note Aliases::. This option is enabled by default for interactive shells. `extglob' @@ -3290,6 +2875,11 @@ been extended in Bash. accessed since the last time it was checked, the message `"The mail in MAILFILE has been read"' is displayed. + `no_empty_cmd_completion' + If set, and Readline is being used, Bash will not attempt to + search the `PATH' for possible completions when completion is + attempted on an empty line. + `nocaseglob' If set, Bash matches filenames in a case-insensitive fashion when performing filename expansion. @@ -3298,6 +2888,11 @@ been extended in Bash. If set, Bash allows filename patterns which match no files to expand to a null string, rather than themselves. + `progcomp' + If set, the programmable completion facilities (*note + Programmable Completion::.) are enabled. This option is + enabled by default. + `promptvars' If set, prompt strings undergo variable and parameter expansion after being expanded (*note Printing a Prompt::.). @@ -3320,6 +2915,10 @@ been extended in Bash. the directory containing the file supplied as an argument. This option is enabled by default. + `xpg_echo' + If set, the `echo' builtin expands backslash-escape sequences + by default. + The return status when listing options is zero if all OPTNAMES are enabled, non-zero otherwise. When setting or unsetting options, the return status is zero unless an OPTNAME is not a valid shell @@ -3417,8 +3016,14 @@ been extended in Bash. non-numeric argument other than `unlimited' is supplied as a LIMIT, or an error occurs while setting a new limit. +`unalias' + unalias [-a] [NAME ... ] + + Remove each NAME from the list of aliases. If `-a' is supplied, + all aliases are removed. Aliases are described in *Note Aliases::. + -File: bashref.info, Node: The Set Builtin, Next: Bash Conditional Expressions, Prev: Bash Builtins, Up: Bash Features +File: bashref.info, Node: The Set Builtin, Next: Special Builtins, Prev: Bash Builtins, Up: Shell Builtin Commands The Set Builtin =============== @@ -3631,127 +3236,104 @@ The Set Builtin supplied. -File: bashref.info, Node: Bash Conditional Expressions, Next: Bash Variables, Prev: The Set Builtin, Up: Bash Features +File: bashref.info, Node: Special Builtins, Prev: The Set Builtin, Up: Shell Builtin Commands -Bash Conditional Expressions -============================ - - Conditional expressions are used by the `[[' compound command and -the `test' and `[' builtin commands. - - Expressions may be unary or binary. Unary expressions are often -used to examine the status of a file. There are string operators and -numeric comparison operators as well. If any FILE argument to one of -the primaries is of the form `/dev/fd/N', then file descriptor N is -checked. - -`-a FILE' - True if FILE exists. - -`-b FILE' - True if FILE exists and is a block special file. - -`-c FILE' - True if FILE exists and is a character special file. - -`-d FILE' - True if FILE exists and is a directory. - -`-e FILE' - True if FILE exists. - -`-f FILE' - True if FILE exists and is a regular file. - -`-g FILE' - True if FILE exists and its set-group-id bit is set. - -`-h FILE' - True if FILE exists and is a symbolic link. +Special Builtins +================ -`-k FILE' - True if FILE exists and its "sticky" bit is set. + For historical reasons, the POSIX 1003.2 standard has classified +several builtin commands as *special*. When Bash is executing in POSIX +mode, the special builtins differ from other builtin commands in three +respects: -`-p FILE' - True if FILE exists and is a named pipe (FIFO). + 1. Special builtins are found before shell functions during command + lookup. -`-r FILE' - True if FILE exists and is readable. + 2. If a special builtin returns an error status, a non-interactive + shell exits. -`-s FILE' - True if FILE exists and has a size greater than zero. + 3. Assignment statements preceding the command stay in effect in the + shell environment after the command completes. -`-t FD' - True if file descriptor FD is open and refers to a terminal. + When Bash is not executing in POSIX mode, these builtins behave no +differently than the rest of the Bash builtin commands. The Bash POSIX +mode is described in *Note Bash POSIX Mode::. -`-u FILE' - True if FILE exists and its set-user-id bit is set. + These are the POSIX special builtins: + break : . continue eval exec exit export readonly return set + shift trap unset -`-w FILE' - True if FILE exists and is writable. + +File: bashref.info, Node: Shell Variables, Next: Bash Features, Prev: Shell Builtin Commands, Up: Top -`-x FILE' - True if FILE exists and is executable. +Shell Variables +*************** -`-O FILE' - True if FILE exists and is owned by the effective user id. +* Menu: -`-G FILE' - True if FILE exists and is owned by the effective group id. +* Bourne Shell Variables:: Variables which Bash uses in the same way + as the Bourne Shell. +* Bash Variables:: List of variables that exist in Bash. -`-L FILE' - True if FILE exists and is a symbolic link. + This chapter describes the shell variables that Bash uses. Bash +automatically assigns default values to a number of variables. -`-S FILE' - True if FILE exists and is a socket. + +File: bashref.info, Node: Bourne Shell Variables, Next: Bash Variables, Up: Shell Variables -`-N FILE' - True if FILE exists and has been modified since it was last read. +Bourne Shell Variables +====================== -`FILE1 -nt FILE2' - True if FILE1 is newer (according to modification date) than FILE2. + Bash uses certain shell variables in the same way as the Bourne +shell. In some cases, Bash assigns a default value to the variable. -`FILE1 -ot FILE2' - True if FILE1 is older than FILE2. +`CDPATH' + A colon-separated list of directories used as a search path for + the `cd' builtin command. -`FILE1 -ef FILE2' - True if FILE1 and FILE2 have the same device and inode numbers. +`HOME' + The current user's home directory; the default for the `cd' builtin + command. The value of this variable is also used by tilde + expansion (*note Tilde Expansion::.). -`-o OPTNAME' - True if shell option OPTNAME is enabled. The list of options - appears in the description of the `-o' option to the `set' builtin - (*note The Set Builtin::.). +`IFS' + A list of characters that separate fields; used when the shell + splits words as part of expansion. -`-z STRING' - True if the length of STRING is zero. +`MAIL' + If this parameter is set to a filename and the `MAILPATH' variable + is not set, Bash informs the user of the arrival of mail in the + specified file. -`-n STRING' -`STRING' - True if the length of STRING is non-zero. +`MAILPATH' + A colon-separated list of filenames which the shell periodically + checks for new mail. Each list entry can specify the message that + is printed when new mail arrives in the mail file by separating + the file name from the message with a `?'. When used in the text + of the message, `$_' expands to the name of the current mail file. -`STRING1 == STRING2' - True if the strings are equal. `=' may be used in place of `=='. +`OPTARG' + The value of the last option argument processed by the `getopts' + builtin. -`STRING1 != STRING2' - True if the strings are not equal. +`OPTIND' + The index of the last option argument processed by the `getopts' + builtin. -`STRING1 < STRING2' - True if STRING1 sorts before STRING2 lexicographically in the - current locale. +`PATH' + A colon-separated list of directories in which the shell looks for + commands. -`STRING1 > STRING2' - True if STRING1 sorts after STRING2 lexicographically in the - current locale. +`PS1' + The primary prompt string. The default value is `\s-\v\$ '. + *Note Printing a Prompt::, for the complete list of escape + sequences that are expanded before `PS1' is displayed. -`ARG1 OP ARG2' - `OP' is one of `-eq', `-ne', `-lt', `-le', `-gt', or `-ge'. These - arithmetic binary operators return true if ARG1 is equal to, not - equal to, less than, less than or equal to, greater than, or - greater than or equal to ARG2, respectively. ARG1 and ARG2 may be - positive or negative integers. +`PS2' + The secondary prompt string. The default value is `> '. -File: bashref.info, Node: Bash Variables, Next: Shell Arithmetic, Prev: Bash Conditional Expressions, Up: Bash Features +File: bashref.info, Node: Bash Variables, Prev: Bourne Shell Variables, Up: Shell Variables Bash Variables ============== @@ -3759,6 +3341,10 @@ Bash Variables These variables are set or used by Bash, but other shells do not normally treat them specially. + A few variables used by Bash are described in different chapters: +variables for controlling the job control facilities (*note Job Control +Variables::.). + `BASH' The full pathname used to execute the current instance of Bash. @@ -3772,9 +3358,9 @@ normally treat them specially. The version number of the current instance of Bash. `BASH_VERSINFO' - A readonly array variable whose members hold version information - for this instance of Bash. The values assigned to the array - members are as follows: + A readonly array variable (*note Arrays::.) whose members hold + version information for this instance of Bash. The values + assigned to the array members are as follows: `BASH_VERSINFO[0]' The major version number (the RELEASE). @@ -3794,16 +3380,45 @@ normally treat them specially. `BASH_VERSINFO[5]' The value of `MACHTYPE'. +`COMP_WORDS' + An array variable consisting of the individual words in the + current command line. This variable is available only in shell + functions invoked by the programmable completion facilities (*note + Programmable Completion::.). + +`COMP_CWORD' + An index into `${COMP_WORDS}' of the word containing the current + cursor position. This variable is available only in shell + functions invoked by the programmable completion facilities (*note + Programmable Completion::.). + +`COMP_LINE' + The current command line. This variable is available only in + shell functions and external commands invoked by the programmable + completion facilities (*note Programmable Completion::.). + +`COMP_POINT' + The index of the current cursor position relative to the beginning + of the current command. If the current cursor position is at the + end of the current command, the value of this variable is equal to + `${#COMP_LINE}'. This variable is available only in shell + functions and external commands invoked by the programmable + completion facilities (*note Programmable Completion::.). + +`COMPREPLY' + An array variable from which Bash reads the possible completions + generated by a shell function invoked by the programmable + completion facility (*note Programmable Completion::.). + `DIRSTACK' - An array variable (*note Arrays::.) containing the current - contents of the directory stack. Directories appear in the stack - in the order they are displayed by the `dirs' builtin. Assigning - to members of this array variable may be used to modify - directories already in the stack, but the `pushd' and `popd' - builtins must be used to add and remove directories. Assignment - to this variable will not change the current directory. If - `DIRSTACK' is unset, it loses its special properties, even if it - is subsequently reset. + An array variable containing the current contents of the directory + stack. Directories appear in the stack in the order they are + displayed by the `dirs' builtin. Assigning to members of this + array variable may be used to modify directories already in the + stack, but the `pushd' and `popd' builtins must be used to add and + remove directories. Assignment to this variable will not change + the current directory. If `DIRSTACK' is unset, it loses its + special properties, even if it is subsequently reset. `EUID' The numeric effective user id of the current user. This variable @@ -3827,13 +3442,15 @@ normally treat them specially. `GROUPS' An array variable containing the list of groups of which the - current user is a member. This variable is readonly. + current user is a member. Assignments to `GROUPS' have no effect + and are silently discarded. If `GROUPS' is unset, it loses its + special properties, even if it is subsequently reset. `histchars' Up to three characters which control history expansion, quick substitution, and tokenization (*note History Interaction::.). - The first character is the "history-expansion-char", that is, the - character which signifies the start of a history expansion, + The first character is the HISTORY EXPANSION character, that is, + the character which signifies the start of a history expansion, normally `!'. The second character is the character which signifies `quick substitution' when seen as the first character on a line, normally `^'. The optional third character is the @@ -3849,25 +3466,32 @@ normally treat them specially. command. If `HISTCMD' is unset, it loses its special properties, even if it is subsequently reset. +`FUNCNAME' + The name of any currently-executing shell function. This variable + exists only when a shell function is executing. Assignments to + `FUNCNAME' have no effect and are silently discarded. If + `FUNCNAME' is unset, it loses its special properties, even if it + is subsequently reset. + `HISTCONTROL' - Set to a value of `ignorespace', it means don't enter lines which - begin with a space or tab into the history list. Set to a value - of `ignoredups', it means don't enter lines which match the last - entered line. A value of `ignoreboth' combines the two options. - Unset, or set to any other value than those above, means to save - all lines on the history list. The second and subsequent lines of - a multi-line compound command are not tested, and are added to the - history regardless of the value of `HISTCONTROL'. + A value of `ignorespace' means to not enter lines which begin with + a space or tab into the history list. A value of `ignoredups' + means to not enter lines which match the last entered line. A + value of `ignoreboth' combines the two options. Unset, or set to + any other value than those above, means to save all lines on the + history list. The second and subsequent lines of a multi-line + compound command are not tested, and are added to the history + regardless of the value of `HISTCONTROL'. `HISTIGNORE' A colon-separated list of patterns used to decide which command lines should be saved on the history list. Each pattern is - anchored at the beginning of the line and must fully specify the + anchored at the beginning of the line and must match the complete line (no implicit `*' is appended). Each pattern is tested against the line after the checks specified by `HISTCONTROL' are applied. In addition to the normal shell pattern matching characters, `&' matches the previous history line. `&' may be - escaped using a backslash. The backslash is removed before + escaped using a backslash; the backslash is removed before attempting a match. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of `HISTIGNORE'. @@ -3880,7 +3504,7 @@ normally treat them specially. `HISTFILE' The name of the file to which the command history is saved. The - default is `~/.bash_history'. + default value is `~/.bash_history'. `HISTSIZE' The maximum number of commands to remember on the history list. @@ -3890,15 +3514,19 @@ normally treat them specially. The maximum number of lines contained in the history file. When this variable is assigned a value, the history file is truncated, if necessary, to contain no more than that number of lines. The - default value is 500. The history file is also truncated to this - size after writing it when an interactive shell exits. + history file is also truncated to this size after writing it when + an interactive shell exits. The default value is 500. `HOSTFILE' Contains the name of a file in the same format as `/etc/hosts' that - should be read when the shell needs to complete a hostname. You - can change the file interactively; the next time you attempt to - complete a hostname, Bash will add the contents of the new file to - the already existing database. + should be read when the shell needs to complete a hostname. The + list of possible hostname completions may be changed while the + shell is running; the next time hostname completion is attempted + after the value is changed, Bash adds the contents of the new file + to the existing list. If `HOSTFILE' is set, but has no value, + Bash attempts to read `/etc/hosts' to obtain the list of possible + hostname completions. When `HOSTFILE' is unset, the hostname list + is cleared. `HOSTNAME' The name of the current host. @@ -3917,8 +3545,8 @@ normally treat them specially. in effect for interactive shells. `INPUTRC' - The name of the Readline startup file, overriding the default of - `~/.inputrc'. + The name of the Readline initialization file, overriding the + default of `~/.inputrc'. `LANG' Used to determine the locale category for any category not @@ -3944,6 +3572,10 @@ normally treat them specially. This variable determines the locale used to translate double-quoted strings preceded by a `$' (*note Locale Translation::.). +`LC_NUMERIC' + This variable determines the locale category used for number + formatting. + `LINENO' The line number in the script or shell function currently executing. @@ -3967,17 +3599,17 @@ normally treat them specially. A string describing the operating system Bash is running on. `PIPESTATUS' - An array variable (*note Arrays::.) containing a list of exit + An array variable (*note Arrays::.) containing a list of exit status values from the processes in the most-recently-executed foreground pipeline (which may contain only a single command). `PPID' - The process id of the shell's parent process. This variable is + The process ID of the shell's parent process. This variable is readonly. `PROMPT_COMMAND' - If present, this contains a string which is a command to execute - before the printing of each primary prompt (`$PS1'). + If set, the value is interpreted as a command to execute before + the printing of each primary prompt (`$PS1'). `PS3' The value of this variable is used as the prompt for the `select' @@ -3985,8 +3617,8 @@ normally treat them specially. prompts with `#? ' `PS4' - This is the prompt printed before the command line is echoed when - the `-x' option is set (*note The Set Builtin::.). The first + The value is the prompt printed before the command line is echoed + when the `-x' option is set (*note The Set Builtin::.). The first character of `PS4' is replicated multiple times, as necessary, to indicate multiple levels of indirection. The default is `+ '. @@ -4062,15 +3694,525 @@ normally treat them specially. `TMOUT' If set to a value greater than zero, the value is interpreted as the number of seconds to wait for input after issuing the primary - prompt. Bash terminates after that number of seconds if input does - not arrive. + prompt when the shell is interactive. Bash terminates after that + number of seconds if input does not arrive. `UID' The numeric real user id of the current user. This variable is readonly. -File: bashref.info, Node: Shell Arithmetic, Next: Aliases, Prev: Bash Variables, Up: Bash Features +File: bashref.info, Node: Bash Features, Next: Job Control, Prev: Shell Variables, Up: Top + +Bash Features +************* + + This section describes features unique to Bash. + +* Menu: + +* Invoking Bash:: Command line options that you can give + to Bash. +* Bash Startup Files:: When and how Bash executes scripts. +* Interactive Shells:: What an interactive shell is. +* Bash Conditional Expressions:: Primitives used in composing expressions for + the `test' builtin. +* Shell Arithmetic:: Arithmetic on shell variables. +* Aliases:: Substituting one command for another. +* Arrays:: Array Variables. +* The Directory Stack:: History of visited directories. +* Printing a Prompt:: Controlling the PS1 string. +* The Restricted Shell:: A more controlled mode of shell execution. +* Bash POSIX Mode:: Making Bash behave more closely to what + the POSIX standard specifies. + + +File: bashref.info, Node: Invoking Bash, Next: Bash Startup Files, Up: Bash Features + +Invoking Bash +============= + + bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o OPTION] [ARGUMENT ...] + bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o OPTION] -c STRING [ARGUMENT ...] + bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o OPTION] [ARGUMENT ...] + + In addition to the single-character shell command-line options +(*note The Set Builtin::.), there are several multi-character options +that you can use. These options must appear on the command line before +the single-character options in order for them to be recognized. + +`--dump-po-strings' + A list of all double-quoted strings preceded by `$' is printed on + the standard ouput in the GNU `gettext' PO (portable object) file + format. Equivalent to `-D' except for the output format. + +`--dump-strings' + Equivalent to `-D'. + +`--help' + Display a usage message on standard output and exit sucessfully. + +`--login' + Make this shell act as if it were directly invoked by login. This + is equivalent to `exec -l bash' but can be issued from another + shell, such as `csh'. `exec bash --login' will replace the + current shell with a Bash login shell. *Note Bash Startup + Files::, for a description of the special behavior of a login + shell. + +`--noediting' + Do not use the GNU Readline library (*note Command Line Editing::.) + to read command lines when the shell is interactive. + +`--noprofile' + Don't load the system-wide startup file `/etc/profile' or any of + the personal initialization files `~/.bash_profile', + `~/.bash_login', or `~/.profile' when Bash is invoked as a login + shell. + +`--norc' + Don't read the `~/.bashrc' initialization file in an interactive + shell. This is on by default if the shell is invoked as `sh'. + +`--posix' + Change the behavior of Bash where the default operation differs + from the POSIX 1003.2 standard to match the standard. This is + intended to make Bash behave as a strict superset of that + standard. *Note Bash POSIX Mode::, for a description of the Bash + POSIX mode. + +`--rcfile FILENAME' + Execute commands from FILENAME (instead of `~/.bashrc') in an + interactive shell. + +`--restricted' + Make the shell a restricted shell (*note The Restricted Shell::.). + +`--verbose' + Equivalent to `-v'. Print shell input lines as they're read. + +`--version' + Show version information for this instance of Bash on the standard + output and exit successfully. + + There are several single-character options that may be supplied at +invocation which are not available with the `set' builtin. + +`-c STRING' + Read and execute commands from STRING after processing the + options, then exit. Any remaining arguments are assigned to the + positional parameters, starting with `$0'. + +`-i' + Force the shell to run interactively. Interactive shells are + described in *Note Interactive Shells::. + +`-r' + Make the shell a restricted shell (*note The Restricted Shell::.). + +`-s' + If this option is present, or if no arguments remain after option + processing, then commands are read from the standard input. This + option allows the positional parameters to be set when invoking an + interactive shell. + +`-D' + A list of all double-quoted strings preceded by `$' is printed on + the standard ouput. These are the strings that are subject to + language translation when the current locale is not `C' or `POSIX' + (*note Locale Translation::.). This implies the `-n' option; no + commands will be executed. + +`--' + A `--' signals the end of options and disables further option + processing. Any arguments after the `--' are treated as filenames + and arguments. + + An *interactive* shell is one started without non-option arguments, +unless `-s' is specified, without specifying the `-c' option, and whose +input and output are both connected to terminals (as determined by +`isatty(3)'), or one started with the `-i' option. *Note Interactive +Shells:: for more information. + + If arguments remain after option processing, and neither the `-c' +nor the `-s' option has been supplied, the first argument is assumed to +be the name of a file containing shell commands (*note Shell +Scripts::.). When Bash is invoked in this fashion, `$0' is set to the +name of the file, and the positional parameters are set to the +remaining arguments. Bash reads and executes commands from this file, +then exits. Bash's exit status is the exit status of the last command +executed in the script. If no commands are executed, the exit status +is 0. + + +File: bashref.info, Node: Bash Startup Files, Next: Interactive Shells, Prev: Invoking Bash, Up: Bash Features + +Bash Startup Files +================== + + This section describs how Bash executes its startup files. If any +of the files exist but cannot be read, Bash reports an error. Tildes +are expanded in file names as described above under Tilde Expansion +(*note Tilde Expansion::.). + + Interactive shells are described in *Note Interactive Shells::. + +Invoked as an interactive login shell, or with `--login' +........................................................ + + When Bash is invoked as an interactive login shell, or as a +non-interactive shell with the `--login' option, it first reads and +executes commands from the file `/etc/profile', if that file exists. +After reading that file, it looks for `~/.bash_profile', +`~/.bash_login', and `~/.profile', in that order, and reads and +executes commands from the first one that exists and is readable. The +`--noprofile' option may be used when the shell is started to inhibit +this behavior. + + When a login shell exits, Bash reads and executes commands from the +file `~/.bash_logout', if it exists. + +Invoked as an interactive non-login shell +......................................... + + When an interactive shell that is not a login shell is started, Bash +reads and executes commands from `~/.bashrc', if that file exists. +This may be inhibited by using the `--norc' option. The `--rcfile +FILE' option will force Bash to read and execute commands from FILE +instead of `~/.bashrc'. + + So, typically, your `~/.bash_profile' contains the line + `if [ -f ~/.bashrc ]; then . ~/.bashrc; fi' + +after (or before) any login-specific initializations. + +Invoked non-interactively +......................... + + When Bash is started non-interactively, to run a shell script, for +example, it looks for the variable `BASH_ENV' in the environment, +expands its value if it appears there, and uses the expanded value as +the name of a file to read and execute. Bash behaves as if the +following command were executed: + `if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi' + +but the value of the `PATH' variable is not used to search for the file +name. + +Invoked with name `sh' +...................... + + If Bash is invoked with the name `sh', it tries to mimic the startup +behavior of historical versions of `sh' as closely as possible, while +conforming to the POSIX standard as well. + + When invoked as an interactive login shell, or as a non-interactive +shell with the `--login' option, it first attempts to read and execute +commands from `/etc/profile' and `~/.profile', in that order. The +`--noprofile' option may be used to inhibit this behavior. When +invoked as an interactive shell with the name `sh', Bash looks for the +variable `ENV', expands its value if it is defined, and uses the +expanded value as the name of a file to read and execute. Since a +shell invoked as `sh' does not attempt to read and execute commands +from any other startup files, the `--rcfile' option has no effect. A +non-interactive shell invoked with the name `sh' does not attempt to +read any other startup files. + + When invoked as `sh', Bash enters POSIX mode after the startup files +are read. + +Invoked in POSIX mode +..................... + + When Bash is started in POSIX mode, as with the `--posix' command +line option, it follows the POSIX standard for startup files. In this +mode, interactive shells expand the `ENV' variable and commands are +read and executed from the file whose name is the expanded value. No +other startup files are read. + +Invoked by remote shell daemon +.............................. + + Bash attempts to determine when it is being run by the remote shell +daemon, usually `rshd'. If Bash determines it is being run by rshd, it +reads and executes commands from `~/.bashrc', if that file exists and +is readable. It will not do this if invoked as `sh'. The `--norc' +option may be used to inhibit this behavior, and the `--rcfile' option +may be used to force another file to be read, but `rshd' does not +generally invoke the shell with those options or allow them to be +specified. + +Invoked with unequal effective and real UID/GIDs +................................................ + + If Bash is started with the effective user (group) id not equal to +the real user (group) id, and the `-p' option is not supplied, no +startup files are read, shell functions are not inherited from the +environment, the `SHELLOPTS' variable, if it appears in the +environment, is ignored, and the effective user id is set to the real +user id. If the `-p' option is supplied at invocation, the startup +behavior is the same, but the effective user id is not reset. + + +File: bashref.info, Node: Interactive Shells, Next: Bash Conditional Expressions, Prev: Bash Startup Files, Up: Bash Features + +Interactive Shells +================== + +* Menu: + +* What is an Interactive Shell?:: What determines whether a shell is Interactive. +* Is this Shell Interactive?:: How to tell if a shell is interactive. +* Interactive Shell Behavior:: What changes in a interactive shell? + + +File: bashref.info, Node: What is an Interactive Shell?, Next: Is this Shell Interactive?, Up: Interactive Shells + +What is an Interactive Shell? +----------------------------- + + An interactive shell is one started without non-option arguments, +unless `-s' is specified, without specifiying the `-c' option, and +whose input and output are both connected to terminals (as determined +by `isatty(3)'), or one started with the `-i' option. + + An interactive shell generally reads from and writes to a user's +terminal. + + The `-s' invocation option may be used to set the positional +parameters when an interactive shell is started. + + +File: bashref.info, Node: Is this Shell Interactive?, Next: Interactive Shell Behavior, Prev: What is an Interactive Shell?, Up: Interactive Shells + +Is this Shell Interactive? +-------------------------- + + To determine within a startup script whether or not Bash is running +interactively, test the value of the `-' special parameter. It +contains `i' when the shell is interactive. For example: + + case "$-" in + *i*) echo This shell is interactive ;; + *) echo This shell is not interactive ;; + esac + + Alternatively, startup scripts may examine the variable `$PS1'; it +is unset in non-interactive shells, and set in interactive shells. +Thus: + + if [ -z "$PS1" ]; then + echo This shell is not interactive + else + echo This shell is interactive + fi + + +File: bashref.info, Node: Interactive Shell Behavior, Prev: Is this Shell Interactive?, Up: Interactive Shells + +Interactive Shell Behavior +-------------------------- + + When the shell is running interactively, it changes its behavior in +several ways. + + 1. Startup files are read and executed as described in *Note Bash + Startup Files::. + + 2. Job Control (*note Job Control::.) is enabled by default. When job + control is in effect, Bash ignores the keyboard-generated job + control signals `SIGTTIN', `SIGTTOU', and `SIGTSTP'. + + 3. Bash expands and displays `$PS1' before reading the first line of + a command, and expands and displays `$PS2' before reading the + second and subsequent lines of a multi-line command. + + 4. Bash executes the value of the `PROMPT_COMMAND' variable as a + command before printing the primary prompt, `$PS1' (*note Bash + Variables::.). + + 5. Readline (*note Command Line Editing::.) is used to read commands + from the user's terminal. + + 6. Bash inspects the value of the `ignoreeof' option to `set -o' + instead of exiting immediately when it receives an `EOF' on its + standard input when reading a command (*note The Set Builtin::.). + + 7. Command history (*note Bash History Facilities::.) and history + expansion (*note History Interaction::.) are enabled by default. + Bash will save the command history to the file named by `$HISTFILE' + when an interactive shell exits. + + 8. Alias expansion (*note Aliases::.) is performed by default. + + 9. In the absence of any traps, Bash ignores `SIGTERM' (*note + Signals::.). + + 10. In the absence of any traps, `SIGINT' is caught and handled + ((*note Signals::.). `SIGINT' will interrupt some shell builtins. + + 11. An interactive login shell sends a `SIGHUP' to all jobs on exit if + the `hupoxexit' shell option has been enabled (*note Signals::.). + + 12. The `-n' invocation option is ignored, and `set -n' has no effect + (*note The Set Builtin::.). + + 13. Bash will check for mail periodically, depending on the values of + the `MAIL', `MAILPATH', and `MAILCHECK' shell variables (*note + Bash Variables::.). + + 14. Expansion errors due to references to unbound shell variables after + `set -u' has been enabled will not cause the shell to exit (*note + The Set Builtin::.). + + 15. The shell will not exit on expansion errors caused by VAR being + unset or null in `${VAR:?WORD}' expansions (*note Shell Parameter + Expansion::.). + + 16. Redirection errors encountered by shell builtins will not cause the + shell to exit. + + 17. When running in POSIX mode, a special builtin returning an error + status will not cause the shell to exit (*note Bash POSIX Mode::.). + + 18. A failed `exec' will not cause the shell to exit (*note Bourne + Shell Builtins::.). + + 19. Parser syntax errors will not cause the shell to exit. + + 20. Simple spelling correction for directory arguments to the `cd' + builtin is enabled by default (see the description of the `cdspell' + option to the `shopt' builtin in *Note Bash Builtins::). + + 21. The shell will check the value of the `TMOUT' variable and exit if + a command is not read within the specified number of seconds after + printing `$PS1' (*note Bash Variables::.). + + + +File: bashref.info, Node: Bash Conditional Expressions, Next: Shell Arithmetic, Prev: Interactive Shells, Up: Bash Features + +Bash Conditional Expressions +============================ + + Conditional expressions are used by the `[[' compound command and +the `test' and `[' builtin commands. + + Expressions may be unary or binary. Unary expressions are often +used to examine the status of a file. There are string operators and +numeric comparison operators as well. If the FILE argument to one of +the primaries is of the form `/dev/fd/N', then file descriptor N is +checked. If the FILE argument to one of the primaries is one of +`/dev/stdin', `/dev/stdout', or `/dev/stderr', file descriptor 0, 1, or +2, respectively, is checked. + +`-a FILE' + True if FILE exists. + +`-b FILE' + True if FILE exists and is a block special file. + +`-c FILE' + True if FILE exists and is a character special file. + +`-d FILE' + True if FILE exists and is a directory. + +`-e FILE' + True if FILE exists. + +`-f FILE' + True if FILE exists and is a regular file. + +`-g FILE' + True if FILE exists and its set-group-id bit is set. + +`-h FILE' + True if FILE exists and is a symbolic link. + +`-k FILE' + True if FILE exists and its "sticky" bit is set. + +`-p FILE' + True if FILE exists and is a named pipe (FIFO). + +`-r FILE' + True if FILE exists and is readable. + +`-s FILE' + True if FILE exists and has a size greater than zero. + +`-t FD' + True if file descriptor FD is open and refers to a terminal. + +`-u FILE' + True if FILE exists and its set-user-id bit is set. + +`-w FILE' + True if FILE exists and is writable. + +`-x FILE' + True if FILE exists and is executable. + +`-O FILE' + True if FILE exists and is owned by the effective user id. + +`-G FILE' + True if FILE exists and is owned by the effective group id. + +`-L FILE' + True if FILE exists and is a symbolic link. + +`-S FILE' + True if FILE exists and is a socket. + +`-N FILE' + True if FILE exists and has been modified since it was last read. + +`FILE1 -nt FILE2' + True if FILE1 is newer (according to modification date) than FILE2. + +`FILE1 -ot FILE2' + True if FILE1 is older than FILE2. + +`FILE1 -ef FILE2' + True if FILE1 and FILE2 have the same device and inode numbers. + +`-o OPTNAME' + True if shell option OPTNAME is enabled. The list of options + appears in the description of the `-o' option to the `set' builtin + (*note The Set Builtin::.). + +`-z STRING' + True if the length of STRING is zero. + +`-n STRING' +`STRING' + True if the length of STRING is non-zero. + +`STRING1 == STRING2' + True if the strings are equal. `=' may be used in place of `=='. + +`STRING1 != STRING2' + True if the strings are not equal. + +`STRING1 < STRING2' + True if STRING1 sorts before STRING2 lexicographically in the + current locale. + +`STRING1 > STRING2' + True if STRING1 sorts after STRING2 lexicographically in the + current locale. + +`ARG1 OP ARG2' + `OP' is one of `-eq', `-ne', `-lt', `-le', `-gt', or `-ge'. These + arithmetic binary operators return true if ARG1 is equal to, not + equal to, less than, less than or equal to, greater than, or + greater than or equal to ARG2, respectively. ARG1 and ARG2 may be + positive or negative integers. + + +File: bashref.info, Node: Shell Arithmetic, Next: Aliases, Prev: Bash Conditional Expressions, Up: Bash Features Shell Arithmetic ================ @@ -4079,9 +4221,17 @@ Shell Arithmetic the shell expansions or by the `let' builtin. Evaluation is done in long integers with no check for overflow, -though division by 0 is trapped and flagged as an error. The following -list of operators is grouped into levels of equal-precedence operators. -The levels are listed in order of decreasing precedence. +though division by 0 is trapped and flagged as an error. The operators +and their precedence and associativity are the same as in the C +language. The following list of operators is grouped into levels of +equal-precedence operators. The levels are listed in order of +decreasing precedence. + +`ID++ ID--' + variable post-increment and post-decrement + +`++ID --ID' + variable pre-increment and pre-decrement `- +' unary minus and plus @@ -4128,20 +4278,24 @@ The levels are listed in order of decreasing precedence. `= *= /= %= += -= <<= >>= &= ^= |=' assignment +`expr1 , expr2' + comma + Shell variables are allowed as operands; parameter expansion is -performed before the expression is evaluated. The value of a parameter -is coerced to a long integer within an expression. A shell variable -need not have its integer attribute turned on to be used in an -expression. +performed before the expression is evaluated. Within an expression, +shell variables may also be referenced by name without using the +parameter expansion syntax. The value of a variable is evaluated as an +arithmetic expression when it is referenced. A shell variable need not +have its integer attribute turned on to be used in an expression. Constants with a leading 0 are interpreted as octal numbers. A leading `0x' or `0X' denotes hexadecimal. Otherwise, numbers take the form [BASE`#']N, where BASE is a decimal number between 2 and 64 representing the arithmetic base, and N is a number in that base. If -BASE is omitted, then base 10 is used. The digits greater than 9 are -represented by the lowercase letters, the uppercase letters, `_', and -`@', in that order. If BASE is less than or equal to 36, lowercase and -uppercase letters may be used interchangably to represent numbers +BASE`#' is omitted, then base 10 is used. The digits greater than 9 +are represented by the lowercase letters, the uppercase letters, `_', +and `@', in that order. If BASE is less than or equal to 36, lowercase +and uppercase letters may be used interchangably to represent numbers between 10 and 35. Operators are evaluated in order of precedence. Sub-expressions in @@ -4154,13 +4308,9 @@ File: bashref.info, Node: Aliases, Next: Arrays, Prev: Shell Arithmetic, Up: Aliases ======= -* Menu: - -* Alias Builtins:: Builtins commands to maniuplate aliases. - - Aliases allow a string to be substituted for a word when it is used + ALIASES allow a string to be substituted for a word when it is used as the first word of a simple command. The shell maintains a list of -ALIASES that may be set and unset with the `alias' and `unalias' +aliases that may be set and unset with the `alias' and `unalias' builtin commands. The first word of each simple command, if unquoted, is checked to see @@ -4201,28 +4351,7 @@ not available until after that function is executed. To be safe, always put alias definitions on a separate line, and do not use `alias' in compound commands. - For almost every purpose, aliases are superseded by shell functions. - - -File: bashref.info, Node: Alias Builtins, Up: Aliases - -Alias Builtins --------------- - -`alias' - alias [`-p'] [NAME[=VALUE] ...] - - Without arguments or with the `-p' option, `alias' prints the list - of aliases on the standard output in a form that allows them to be - reused as input. If arguments are supplied, an alias is defined - for each NAME whose VALUE is given. If no VALUE is given, the name - and value of the alias is printed. - -`unalias' - unalias [-a] [NAME ... ] - - Remove each NAME from the list of aliases. If `-a' is supplied, - all aliases are removed. + For almost every purpose, shell functions are preferred over aliases. File: bashref.info, Node: Arrays, Next: The Directory Stack, Prev: Aliases, Up: Bash Features @@ -4278,9 +4407,9 @@ is the number of elements in the array. Referencing an array variable without a subscript is equivalent to referencing element zero. The `unset' builtin is used to destroy arrays. `unset' -`name[SUBSCRIPT]' destroys the array element at index SUBSCRIPT. -`unset' NAME, where NAME is an array, removes the entire array. A -subscript of `*' or `@' also removes the entire array. +NAME[SUBSCRIPT] destroys the array element at index SUBSCRIPT. `unset' +NAME, where NAME is an array, removes the entire array. A subscript of +`*' or `@' also removes the entire array. The `declare', `local', and `readonly' builtins each accept a `-a' option to specify an array. The `read' builtin accepts a `-a' option @@ -4295,6 +4424,11 @@ File: bashref.info, Node: The Directory Stack, Next: Printing a Prompt, Prev: The Directory Stack =================== +* Menu: + +* Directory Stack Builtins:: Bash builtin commands to manipulate + the directory stack. + The directory stack is a list of recently-visited directories. The `pushd' builtin adds directories to the stack as it changes the current directory, and the `popd' builtin removes specified directories from @@ -4304,8 +4438,14 @@ The `dirs' builtin displays the contents of the directory stack. The contents of the directory stack are also visible as the value of the `DIRSTACK' shell variable. + +File: bashref.info, Node: Directory Stack Builtins, Up: The Directory Stack + +Directory Stack Builtins +------------------------ + `dirs' - dirs [+N | -N] [-clvp] + dirs [+N | -N] [-clpv] Display the list of currently remembered directories. Directories are added to the list with the `pushd' command; the `popd' command removes directories from the list. @@ -4389,8 +4529,9 @@ Controlling the Prompt ====================== The value of the variable `PROMPT_COMMAND' is examined just before -Bash prints each primary prompt. If it is set and non-null, then the -value is executed just as if it had been typed on the command line. +Bash prints each primary prompt. If `PROMPT_COMMAND' is set and has a +non-null value, then the value is executed just as if it had been typed +on the command line. In addition, the following table describes the special characters which can appear in the prompt variables: @@ -4410,6 +4551,12 @@ which can appear in the prompt variables: `\H' The hostname. +`\j' + The number of jobs currently managed by the shell. + +`\l' + The basename of the shell's terminal device name. + `\n' A newline. @@ -4466,6 +4613,16 @@ which can appear in the prompt variables: `\]' End a sequence of non-printing characters. + The command number and the history number are usually different: the +history number of a command is its position in the history list, which +may include commands restored from the history file (*note Bash History +Facilities::.), while the command number is the position in the +sequence of commands executed during the current shell session. + + After the string is decoded, it is expanded via parameter expansion, +command substitution, arithmetic expansion, and quote removal, subject +to the value of the `promptvars' shell option (*note Bash Builtins::.). + File: bashref.info, Node: The Restricted Shell, Next: Bash POSIX Mode, Prev: Printing a Prompt, Up: Bash Features @@ -4487,6 +4644,9 @@ with the exception that the following are disallowed: * Specifying a filename containing a slash as an argument to the `.' builtin command. + * Specifying a filename containing a slash as an argument to the `-p' + option to the `hash' builtin command. + * Importing function definitions from the shell environment at startup. @@ -4513,8 +4673,8 @@ Bash POSIX Mode Starting Bash with the `--posix' command-line option or executing `set -o posix' while Bash is running will cause Bash to conform more -closely to the POSIX.2 standard by changing the behavior to match that -specified by POSIX.2 in areas where the Bash default differs. +closely to the POSIX 1003.2 standard by changing the behavior to match +that specified by POSIX in areas where the Bash default differs. The following list is what's changed when `POSIX mode' is in effect: @@ -4529,7 +4689,7 @@ specified by POSIX.2 in areas where the Bash default differs. 4. Reserved words may not be aliased. - 5. The POSIX.2 `PS1' and `PS2' expansions of `!' to the history + 5. The POSIX 1003.2 `PS1' and `PS2' expansions of `!' to the history number and `!!' to `!' are enabled, and parameter expansion is performed on the values of `PS1' and `PS2' regardless of the setting of the `promptvars' option. @@ -4537,8 +4697,8 @@ specified by POSIX.2 in areas where the Bash default differs. 6. Interactive comments are enabled by default. (Bash has them on by default anyway.) - 7. The POSIX.2 startup files are executed (`$ENV') rather than the - normal Bash files. + 7. The POSIX 1003.2 startup files are executed (`$ENV') rather than + the normal Bash files. 8. Tilde expansion is only performed on assignments preceding a command name, rather than on all assignment statements on the line. @@ -4558,49 +4718,52 @@ specified by POSIX.2 in areas where the Bash default differs. 13. Redirection operators do not perform filename expansion on the word in the redirection unless the shell is interactive. - 14. Function names must be valid shell `name's. That is, they may not + 14. Redirection operators do not perform word splitting on the word in + the redirection. + + 15. Function names must be valid shell `name's. That is, they may not contain characters other than letters, digits, and underscores, and may not start with a digit. Declaring a function with an invalid name causes a fatal syntax error in non-interactive shells. - 15. POSIX.2 `special' builtins are found before shell functions during - command lookup. + 16. POSIX 1003.2 `special' builtins are found before shell functions + during command lookup. - 16. If a POSIX.2 special builtin returns an error status, a + 17. If a POSIX 1003.2 special builtin returns an error status, a non-interactive shell exits. The fatal errors are those listed in the POSIX.2 standard, and include things like passing incorrect options, redirection errors, variable assignment errors for assignments preceding the command name, and so on. - 17. If the `cd' builtin finds a directory to change to using + 18. If the `cd' builtin finds a directory to change to using `$CDPATH', the value it assigns to the `PWD' variable does not contain any symbolic links, as if `cd -P' had been executed. - 18. If `$CDPATH' is set, the `cd' builtin will not implicitly append + 19. If `$CDPATH' is set, the `cd' builtin will not implicitly append the current directory to it. This means that `cd' will fail if no valid directory name can be constructed from any of the entries in `$CDPATH', even if the a directory with the same name as the name given as an argument to `cd' exists in the current directory. - 19. A non-interactive shell exits with an error status if a variable + 20. A non-interactive shell exits with an error status if a variable assignment error occurs when no command name follows the assignment statements. A variable assignment error occurs, for example, when trying to assign a value to a readonly variable. - 20. A non-interactive shell exits with an error status if the iteration + 21. A non-interactive shell exits with an error status if the iteration variable in a `for' statement or the selection variable in a `select' statement is a readonly variable. - 21. Process substitution is not available. + 22. Process substitution is not available. - 22. Assignment statements preceding POSIX.2 special builtins persist - in the shell environment after the builtin completes. + 23. Assignment statements preceding POSIX 1003.2 special builtins + persist in the shell environment after the builtin completes. - 23. The `export' and `readonly' builtin commands display their output - in the format required by POSIX.2. + 24. The `export' and `readonly' builtin commands display their output + in the format required by POSIX 1003.2. - There is other POSIX.2 behavior that Bash does not implement. + There is other POSIX 1003.2 behavior that Bash does not implement. Specifically: 1. Assignment statements affect the execution environment of all @@ -4645,17 +4808,17 @@ the processes in a single pipeline are members of the same job. Bash uses the JOB abstraction as the basis for job control. To facilitate the implementation of the user interface to job -control, the system maintains the notion of a current terminal process -group ID. Members of this process group (processes whose process group -ID is equal to the current terminal process group ID) receive -keyboard-generated signals such as `SIGINT'. These processes are said -to be in the foreground. Background processes are those whose process -group ID differs from the terminal's; such processes are immune to -keyboard-generated signals. Only foreground processes are allowed to -read from or write to the terminal. Background processes which attempt -to read from (write to) the terminal are sent a `SIGTTIN' (`SIGTTOU') -signal by the terminal driver, which, unless caught, suspends the -process. +control, the operating system maintains the notion of a current terminal +process group ID. Members of this process group (processes whose +process group ID is equal to the current terminal process group ID) +receive keyboard-generated signals such as `SIGINT'. These processes +are said to be in the foreground. Background processes are those whose +process group ID differs from the terminal's; such processes are immune +to keyboard-generated signals. Only foreground processes are allowed +to read from or write to the terminal. Background processes which +attempt to read from (write to) the terminal are sent a `SIGTTIN' +(`SIGTTOU') signal by the terminal driver, which, unless caught, +suspends the process. If the operating system on which Bash is running supports job control, Bash contains facilities to use it. Typing the SUSPEND @@ -4671,18 +4834,22 @@ the additional side effect of causing pending output and typeahead to be discarded. There are a number of ways to refer to a job in the shell. The -character `%' introduces a job name. Job number `n' may be referred to -as `%n'. A job may also be referred to using a prefix of the name used -to start it, or using a substring that appears in its command line. -For example, `%ce' refers to a stopped `ce' job. Using `%?ce', on the -other hand, refers to any job containing the string `ce' in its command -line. If the prefix or substring matches more than one job, Bash -reports an error. The symbols `%%' and `%+' refer to the shell's -notion of the current job, which is the last job stopped while it was -in the foreground or started in the background. The previous job may -be referenced using `%-'. In output pertaining to jobs (e.g., the -output of the `jobs' command), the current job is always flagged with a -`+', and the previous job with a `-'. +character `%' introduces a job name. + + Job number `n' may be referred to as `%n'. The symbols `%%' and +`%+' refer to the shell's notion of the current job, which is the last +job stopped while it was in the foreground or started in the +background. The previous job may be referenced using `%-'. In output +pertaining to jobs (e.g., the output of the `jobs' command), the +current job is always flagged with a `+', and the previous job with a +`-'. + + A job may also be referred to using a prefix of the name used to +start it, or using a substring that appears in its command line. For +example, `%ce' refers to a stopped `ce' job. Using `%?ce', on the other +hand, refers to any job containing the string `ce' in its command line. +If the prefix or substring matches more than one job, Bash reports an +error. Simply naming a job can be used to bring it into the foreground: `%1' is a synonym for `fg %1', bringing job 1 from the background into @@ -4726,7 +4893,7 @@ Job Control Builtins JOBSPEC specifies a job that was started without job control. `jobs' - jobs [-lpnrs] [JOBSPEC] + jobs [-lnprs] [JOBSPEC] jobs -x COMMAND [ARGUMENTS] The first form lists the active jobs. The options have the @@ -4774,7 +4941,7 @@ Job Control Builtins invalid option is encountered. `wait' - wait [JOBSPEC|PID] + wait [JOBSPEC or PID] Wait until the child process specified by process ID PID or job specification JOBSPEC exits and return the exit status of the last command waited for. If a job spec is given, all processes in the @@ -4827,336 +4994,14 @@ Job Control Variables analogous to the `%' job ID. -File: bashref.info, Node: Using History Interactively, Next: Command Line Editing, Prev: Job Control, Up: Top - -Using History Interactively -*************************** - - This chapter describes how to use the GNU History Library -interactively, from a user's standpoint. It should be considered a -user's guide. For information on using the GNU History Library in -other programs, see the GNU Readline Library Manual. - -* Menu: - -* Bash History Facilities:: How Bash lets you manipulate your command - history. -* Bash History Builtins:: The Bash builtin commands that manipulate - the command history. -* History Interaction:: What it feels like using History as a user. - - -File: bashref.info, Node: Bash History Facilities, Next: Bash History Builtins, Up: Using History Interactively - -Bash History Facilities -======================= - - When the `-o history' option to the `set' builtin is enabled (*note -The Set Builtin::.), the shell provides access to the COMMAND HISTORY, -the list of commands previously typed. The text of the last `HISTSIZE' -commands (default 500) is saved in a history list. The shell stores -each command in the history list prior to parameter and variable -expansion but after history expansion is performed, subject to the -values of the shell variables `HISTIGNORE' and `HISTCONTROL'. When the -shell starts up, the history is initialized from the file named by the -`HISTFILE' variable (default `~/.bash_history'). `HISTFILE' is -truncated, if necessary, to contain no more than the number of lines -specified by the value of the `HISTFILESIZE' variable. When an -interactive shell exits, the last `HISTSIZE' lines are copied from the -history list to `HISTFILE'. If the `histappend' shell option is set -(*note Bash Builtins::.), the lines are appended to the history file, -otherwise the history file is overwritten. If `HISTFILE' is unset, or -if the history file is unwritable, the history is not saved. After -saving the history, the history file is truncated to contain no more -than `$HISTFILESIZE' lines. If `HISTFILESIZE' is not set, no -truncation is performed. - - The builtin command `fc' may be used to list or edit and re-execute -a portion of the history list. The `history' builtin can be used to -display or modify the history list and manipulate the history file. -When using the command-line editing, search commands are available in -each editing mode that provide access to the history list. - - The shell allows control over which commands are saved on the history -list. The `HISTCONTROL' and `HISTIGNORE' variables may be set to cause -the shell to save only a subset of the commands entered. The `cmdhist' -shell option, if enabled, causes the shell to attempt to save each line -of a multi-line command in the same history entry, adding semicolons -where necessary to preserve syntactic correctness. The `lithist' shell -option causes the shell to save the command with embedded newlines -instead of semicolons. *Note Bash Builtins::, for a description of -`shopt'. - - -File: bashref.info, Node: Bash History Builtins, Next: History Interaction, Prev: Bash History Facilities, Up: Using History Interactively - -Bash History Builtins -===================== - - Bash provides two builtin commands that allow you to manipulate the -history list and history file. - -`fc' - `fc [-e ENAME] [-nlr] [FIRST] [LAST]' - `fc -s [PAT=REP] [COMMAND]' - - Fix Command. In the first form, a range of commands from FIRST to - LAST is selected from the history list. Both FIRST and LAST may - be specified as a string (to locate the most recent command - beginning with that string) or as a number (an index into the - history list, where a negative number is used as an offset from the - current command number). If LAST is not specified it is set to - FIRST. If FIRST is not specified it is set to the previous - command for editing and -16 for listing. If the `-l' flag is - given, the commands are listed on standard output. The `-n' flag - suppresses the command numbers when listing. The `-r' flag - reverses the order of the listing. Otherwise, the editor given by - ENAME is invoked on a file containing those commands. If ENAME is - not given, the value of the following variable expansion is used: - `${FCEDIT:-${EDITOR:-vi}}'. This says to use the value of the - `FCEDIT' variable if set, or the value of the `EDITOR' variable if - that is set, or `vi' if neither is set. When editing is complete, - the edited commands are echoed and executed. - - In the second form, COMMAND is re-executed after each instance of - PAT in the selected command is replaced by REP. - - A useful alias to use with the `fc' command is `r='fc -s'', so - that typing `r cc' runs the last command beginning with `cc' and - typing `r' re-executes the last command (*note Aliases::.). - -`history' - history [-c] [N] - history [-anrw] [FILENAME] - history -ps ARG - - Display the history list with line numbers. Lines prefixed with - with a `*' have been modified. An argument of N says to list only - the last N lines. Options, if supplied, have the following - meanings: - - `-w' - Write out the current history to the history file. - - `-r' - Read the current history file and append its contents to the - history list. - - `-a' - Append the new history lines (history lines entered since the - beginning of the current Bash session) to the history file. - - `-n' - Append the history lines not already read from the history - file to the current history list. These are lines appended - to the history file since the beginning of the current Bash - session. - - `-c' - Clear the history list. This may be combined with the other - options to replace the history list completely. - - `-s' - The ARGs are added to the end of the history list as a single - entry. - - `-p' - Perform history substitution on the ARGs and display the - result on the standard output, without storing the results in - the history list. - - When the `-w', `-r', `-a', or `-n' option is used, if FILENAME is - given, then it is used as the history file. If not, then the - value of the `HISTFILE' variable is used. - - -File: bashref.info, Node: History Interaction, Prev: Bash History Builtins, Up: Using History Interactively - -History Expansion -================= - - The History library provides a history expansion feature that is -similar to the history expansion provided by `csh'. This section -describes the syntax used to manipulate the history information. - - History expansions introduce words from the history list into the -input stream, making it easy to repeat commands, insert the arguments -to a previous command into the current input line, or fix errors in -previous commands quickly. - - History expansion takes place in two parts. The first is to -determine which line from the history list should be used during -substitution. The second is to select portions of that line for -inclusion into the current one. The line selected from the history is -called the "event", and the portions of that line that are acted upon -are called "words". Various "modifiers" are available to manipulate -the selected words. The line is broken into words in the same fashion -that Bash does, so that several words surrounded by quotes are -considered one word. History expansions are introduced by the -appearance of the history expansion character, which is `!' by default. -Only `\' and `'' may be used to escape the history expansion character. - - Several shell options settable with the `shopt' builtin (*note Bash -Builtins::.) may be used to tailor the behavior of history expansion. -If the `histverify' shell option is enabled, and Readline is being -used, history substitutions are not immediately passed to the shell -parser. Instead, the expanded line is reloaded into the Readline -editing buffer for further modification. If Readline is being used, -and the `histreedit' shell option is enabled, a failed history -expansion will be reloaded into the Readline editing buffer for -correction. The `-p' option to the `history' builtin command may be -used to see what a history expansion will do before using it. The `-s' -option to the `history' builtin may be used to add commands to the end -of the history list without actually executing them, so that they are -available for subsequent recall. This is most useful in conjunction -with Readline. - - The shell allows control of the various characters used by the -history expansion mechanism with the `histchars' variable. - -* Menu: - -* Event Designators:: How to specify which history line to use. -* Word Designators:: Specifying which words are of interest. -* Modifiers:: Modifying the results of substitution. - - -File: bashref.info, Node: Event Designators, Next: Word Designators, Up: History Interaction - -Event Designators ------------------ - - An event designator is a reference to a command line entry in the -history list. - -`!' - Start a history substitution, except when followed by a space, tab, - the end of the line, `=' or `('. - -`!N' - Refer to command line N. - -`!-N' - Refer to the command N lines back. - -`!!' - Refer to the previous command. This is a synonym for `!-1'. - -`!STRING' - Refer to the most recent command starting with STRING. - -`!?STRING[?]' - Refer to the most recent command containing STRING. The trailing - `?' may be omitted if the STRING is followed immediately by a - newline. - -`^STRING1^STRING2^' - Quick Substitution. Repeat the last command, replacing STRING1 - with STRING2. Equivalent to `!!:s/STRING1/STRING2/'. - -`!#' - The entire command line typed so far. - - -File: bashref.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction - -Word Designators ----------------- - - Word designators are used to select desired words from the event. A -`:' separates the event specification from the word designator. It may -be omitted if the word designator begins with a `^', `$', `*', `-', or -`%'. Words are numbered from the beginning of the line, with the first -word being denoted by 0 (zero). Words are inserted into the current -line separated by single spaces. - -`0 (zero)' - The `0'th word. For many applications, this is the command word. - -`N' - The Nth word. - -`^' - The first argument; that is, word 1. - -`$' - The last argument. - -`%' - The word matched by the most recent `?STRING?' search. - -`X-Y' - A range of words; `-Y' abbreviates `0-Y'. - -`*' - All of the words, except the `0'th. This is a synonym for `1-$'. - It is not an error to use `*' if there is just one word in the - event; the empty string is returned in that case. - -`X*' - Abbreviates `X-$' - -`X-' - Abbreviates `X-$' like `X*', but omits the last word. - - If a word designator is supplied without an event specification, the -previous command is used as the event. - - -File: bashref.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction - -Modifiers ---------- - - After the optional word designator, you can add a sequence of one or -more of the following modifiers, each preceded by a `:'. - -`h' - Remove a trailing pathname component, leaving only the head. - -`t' - Remove all leading pathname components, leaving the tail. - -`r' - Remove a trailing suffix of the form `.SUFFIX', leaving the - basename. - -`e' - Remove all but the trailing suffix. - -`p' - Print the new command but do not execute it. - -`q' - Quote the substituted words, escaping further substitutions. - -`x' - Quote the substituted words as with `q', but break into words at - spaces, tabs, and newlines. - -`s/OLD/NEW/' - Substitute NEW for the first occurrence of OLD in the event line. - Any delimiter may be used in place of `/'. The delimiter may be - quoted in OLD and NEW with a single backslash. If `&' appears in - NEW, it is replaced by OLD. A single backslash will quote the - `&'. The final delimiter is optional if it is the last character - on the input line. - -`&' - Repeat the previous substitution. - -`g' - Cause changes to be applied over the entire event line. Used in - conjunction with `s', as in `gs/OLD/NEW/', or with `&'. - - File: bashref.info, Node: Command Line Editing, Next: Installing Bash, Prev: Using History Interactively, Up: Top Command Line Editing ******************** This chapter describes the basic features of the GNU command line -editing interface. +editing interface. Command line editing is provided by the Readline +library, which is used by several different programs, including Bash. * Menu: @@ -5168,6 +5013,11 @@ editing interface. * Readline vi Mode:: A short description of how to make Readline behave like the vi editor. +* Programmable Completion:: How to specify the possible completions for + a specific command. +* Programmable Completion Builtins:: Builtin commands to specify how to + complete arguments for a particular command. + File: bashref.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing @@ -5181,10 +5031,18 @@ keystrokes. produced when the <k> key is pressed while the Control key is depressed. The text <M-k> is read as `Meta-K' and describes the character -produced when the meta key (if you have one) is depressed, and the <k> -key is pressed. If you do not have a meta key, the identical keystroke -can be generated by typing <ESC> first, and then typing <k>. Either -process is known as "metafying" the <k> key. +produced when the Meta key (if you have one) is depressed, and the <k> +key is pressed. The Meta key is labeled <ALT> on many keyboards. On +keyboards with two keys labeled <ALT> (usually to either side of the +space bar), the <ALT> on the left side is generally set to work as a +Meta key. The <ALT> key on the right may also be configured to work as +a Meta key or may be configured as some other modifier, such as a +Compose key for typing accented characters. + + If you do not have a Meta or <ALT> key, or another key working as a +Meta key, the identical keystroke can be generated by typing <ESC> +first, and then typing <k>. Either process is known as "metafying" the +<k> key. The text <M-C-k> is read as `Meta-Control-k' and describes the character produced by "metafying" <C-k>. @@ -5192,7 +5050,9 @@ character produced by "metafying" <C-k>. In addition, several keys have their own names. Specifically, <DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves when seen in this text, or in an init file (*note Readline Init -File::.). +File::.). If your keyboard lacks a <LFD> key, typing <C-j> will +produce the desired character. The <RET> key may be labeled <Return> +or <Enter> on some keyboards. File: bashref.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing @@ -5230,18 +5090,17 @@ typed character appears where the cursor was, and then the cursor moves one space to the right. If you mistype a character, you can use your erase character to back up and delete the mistyped character. - Sometimes you may miss typing a character that you wanted to type, -and not notice your error until you have typed several other -characters. In that case, you can type <C-b> to move the cursor to the -left, and then correct your mistake. Afterwards, you can move the -cursor to the right with <C-f>. + Sometimes you may mistype a character, and not notice the error +until you have typed several other characters. In that case, you can +type <C-b> to move the cursor to the left, and then correct your +mistake. Afterwards, you can move the cursor to the right with <C-f>. When you add text in the middle of a line, you will notice that characters to the right of the cursor are `pushed over' to make room for the text that you have inserted. Likewise, when you delete text behind the cursor, characters to the right of the cursor are `pulled back' to fill in the blank space created by the removal of the text. A -list of the basic bare essentials for editing the text of an input line +list of the bare essentials for editing the text of an input line follows. <C-b> @@ -5250,7 +5109,7 @@ follows. <C-f> Move forward one character. -<DEL> +<DEL> or <Backspace> Delete the character to the left of the cursor. <C-d> @@ -5259,21 +5118,25 @@ follows. Printing characters Insert the character into the line at the cursor. -<C-_> +<C-_> or <C-x C-u> Undo the last editing command. You can undo all the way back to an empty line. +(Depending on your configuration, the <Backspace> key be set to delete +the character to the left of the cursor and the <DEL> key set to delete +the character underneath the cursor, like <C-d>, rather than the +character to the left of the cursor.) + File: bashref.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction Readline Movement Commands -------------------------- - The above table describes the most basic possible keystrokes that -you need in order to do editing of the input line. For your -convenience, many other commands have been added in addition to <C-b>, -<C-f>, <C-d>, and <DEL>. Here are some commands for moving more rapidly -about the line. + The above table describes the most basic keystrokes that you need in +order to do editing of the input line. For your convenience, many +other commands have been added in addition to <C-b>, <C-f>, <C-d>, and +<DEL>. Here are some commands for moving more rapidly about the line. <C-a> Move to the start of the line. @@ -5303,9 +5166,12 @@ Readline Killing Commands "Killing" text means to delete the text from the line, but to save it away for later use, usually by "yanking" (re-inserting) it back into -the line. If the description for a command says that it `kills' text, -then you can be sure that you can get the text back in a different (or -the same) place later. +the line. (`Cut' and `paste' are more recent jargon for `kill' and +`yank'.) + + If the description for a command says that it `kills' text, then you +can be sure that you can get the text back in a different (or the same) +place later. When you use a kill command, the text is saved in a "kill-ring". Any number of consecutive kills save all of the killed text together, so @@ -5320,12 +5186,14 @@ available to be yanked back later, when you are typing another line. line. <M-d> - Kill from the cursor to the end of the current word, or if between - words, to the end of the next word. + Kill from the cursor to the end of the current word, or, if between + words, to the end of the next word. Word boundaries are the same + as those used by <M-f>. <M-DEL> - Kill from the cursor the start of the previous word, or if between - words, to the start of the previous word. + Kill from the cursor the start of the previous word, or, if between + words, to the start of the previous word. Word boundaries are the + same as those used by <M-b>. <C-w> Kill from the cursor to the previous whitespace. This is @@ -5357,7 +5225,7 @@ start of the line, you might type `M-- C-k'. The general way to pass numeric arguments to a command is to type meta digits before the command. If the first `digit' typed is a minus -sign (<->), then the sign of the argument will be negative. Once you +sign (`-'), then the sign of the argument will be negative. Once you have typed one meta digit to get the argument started, you can type the remainder of the digits, and then the command. For example, to give the <C-d> command an argument of 10, you could type `M-1 0 C-d'. @@ -5369,26 +5237,30 @@ Searching for Commands in the History ------------------------------------- Readline provides commands for searching through the command history -(*note Bash History Facilities::.) for lines containing a specified +(*note Bash History Facilities::.) for lines containing a specified string. There are two search modes: INCREMENTAL and NON-INCREMENTAL. Incremental searches begin before the user has finished typing the search string. As each character of the search string is typed, Readline displays the next entry from the history matching the string typed so far. An incremental search requires only as many characters -as needed to find the desired history entry. The characters present in -the value of the ISEARCH-TERMINATORS variable are used to terminate an -incremental search. If that variable has not been assigned a value, -the <ESC> and <C-J> characters will terminate an incremental search. -<C-g> will abort an incremental search and restore the original line. -When the search is terminated, the history entry containing the search -string becomes the current line. To find other matching entries in the -history list, type <C-s> or <C-r> as appropriate. This will search -backward or forward in the history for the next entry matching the -search string typed so far. Any other key sequence bound to a Readline -command will terminate the search and execute that command. For -instance, a <RET> will terminate the search and accept the line, -thereby executing the command from the history list. +as needed to find the desired history entry. To search backward in the +history for a particular string, type <C-r>. Typing <C-s> searches +forward through the history. The characters present in the value of +the `isearch-terminators' variable are used to terminate an incremental +search. If that variable has not been assigned a value, the <ESC> and +<C-J> characters will terminate an incremental search. <C-g> will +abort an incremental search and restore the original line. When the +search is terminated, the history entry containing the search string +becomes the current line. + + To find other matching entries in the history list, type <C-r> or +<C-s> as appropriate. This will search backward or forward in the +history for the next entry matching the search string typed so far. +Any other key sequence bound to a Readline command will terminate the +search and execute that command. For instance, a <RET> will terminate +the search and accept the line, thereby executing the command from the +history list. Non-incremental searches read the entire search string before starting to search for matching history lines. The search string may be @@ -5400,12 +5272,13 @@ File: bashref.info, Node: Readline Init File, Next: Bindable Readline Commands Readline Init File ================== - Although the Readline library comes with a set of `emacs'-like + Although the Readline library comes with a set of Emacs-like keybindings installed by default, it is possible to use a different set of keybindings. Any user can customize programs that use Readline by -putting commands in an "inputrc" file in his home directory. The name -of this file is taken from the value of the shell variable `INPUTRC'. -If that variable is unset, the default is `~/.inputrc'. +putting commands in an "inputrc" file, conventionally in his home +directory. The name of this file is taken from the value of the shell +variable `INPUTRC'. If that variable is unset, the default is +`~/.inputrc'. When a program which uses the Readline library starts up, the init file is read, and the key bindings are set. @@ -5441,6 +5314,9 @@ Variable Settings set editing-mode vi + The `bind -V' command lists the current Readline variable names + and values. *Note Bash Builtins::. + A great deal of run-time behavior is changeable with the following variables. @@ -5472,7 +5348,7 @@ Variable Settings `convert-meta' If set to `on', Readline will convert characters with the eighth bit set to an ASCII key sequence by stripping the - eighth bit and prepending an <ESC> character, converting them + eighth bit and prefixing an <ESC> character, converting them to a meta-prefixed key sequence. The default value is `on'. `disable-completion' @@ -5557,7 +5433,7 @@ Variable Settings Key Bindings The syntax for controlling key bindings in the init file is - simple. First you have to know the name of the command that you + simple. First you need to find the name of the command that you want to change. The following sections contain tables of the command name, the default keybinding, if any, and a short description of what the command does. @@ -5568,6 +5444,10 @@ Key Bindings key can be expressed in different ways, depending on which is most comfortable for you. + The `bind -p' command displays Readline function names and + bindings in a format that can put directly into an initialization + file. *Note Bash Builtins::. + KEYNAME: FUNCTION-NAME or MACRO KEYNAME is the name of a key spelled out in English. For example: @@ -5613,10 +5493,10 @@ Key Bindings backslash `\"' - <"> + <">, a double quotation mark `\'' - <'> + <'>, a single quote or apostrophe In addition to the GNU Emacs style escape sequences, a second set of backslash escapes is available: @@ -5646,11 +5526,11 @@ Key Bindings vertical tab `\NNN' - the character whose ASCII code is the octal value NNN (one to - three digits) + the character whose `ASCII' code is the octal value NNN (one + to three digits) `\xNNN' - the character whose ASCII code is the hexadecimal value NNN + the character whose `ASCII' code is the hexadecimal value NNN (one to three digits) When entering the text of a macro, single or double quotes must be @@ -5847,7 +5727,15 @@ Bindable Readline Commands * Miscellaneous Commands:: Other miscellaneous commands. This section describes Readline commands that may be bound to key -sequences. +sequences. You can list your key bindings by executing `bind -P' or, +for a more terse format, suitable for an INPUTRC file, `bind -p'. +(*Note Bash Builtins::.) + + Command names without an accompanying key sequence are unbound by +default. In the following descriptions, POINT refers to the current +cursor position, and MARK refers to a cursor position saved by the +`set-mark' command. The text between the point and mark is referred to +as the REGION. File: bashref.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands @@ -5872,7 +5760,7 @@ Commands For Moving letters and digits. `backward-word (M-b)' - Move back to the start of this, or the previous, word. Words are + Move back to the start of the current or previous word. Words are composed of letters and digits. `clear-screen (C-l)' @@ -5928,9 +5816,8 @@ Commands For Manipulating The History `history-search-forward ()' Search forward through the history for the string of characters - between the start of the current line and the current cursor - position (the POINT). This is a non-incremental search. By - default, this command is unbound. + between the start of the current line and the point. This is a + non-incremental search. By default, this command is unbound. `history-search-backward ()' Search backward through the history for the string of characters @@ -5983,11 +5870,11 @@ Commands For Changing Text Drag the character before the cursor forward over the character at the cursor, moving the cursor forward as well. If the insertion point is at the end of the line, then this transposes the last two - characters of the line. Negative arguments don't work. + characters of the line. Negative arguments have no effect. `transpose-words (M-t)' - Drag the word behind the cursor past the word in front of the - cursor moving the cursor over that word as well. + Drag the word before point past the word after point, moving point + past that word as well. `upcase-word (M-u)' Uppercase the current (or following) word. With a negative @@ -6008,41 +5895,38 @@ Killing And Yanking ------------------- `kill-line (C-k)' - Kill the text from the current cursor position to the end of the - line. + Kill the text from point to the end of the line. `backward-kill-line (C-x Rubout)' Kill backward to the beginning of the line. `unix-line-discard (C-u)' Kill backward from the cursor to the beginning of the current line. - The killed text is saved on the kill-ring. `kill-whole-line ()' - Kill all characters on the current line, no matter where the - cursor is. By default, this is unbound. + Kill all characters on the current line, no matter point is. By + default, this is unbound. `kill-word (M-d)' - Kill from the cursor to the end of the current word, or if between + Kill from point to the end of the current word, or if between words, to the end of the next word. Word boundaries are the same as `forward-word'. `backward-kill-word (M-DEL)' - Kill the word behind the cursor. Word boundaries are the same as + Kill the word behind point. Word boundaries are the same as `backward-word'. `unix-word-rubout (C-w)' - Kill the word behind the cursor, using white space as a word - boundary. The killed text is saved on the kill-ring. + Kill the word behind point, using white space as a word boundary. + The killed text is saved on the kill-ring. `delete-horizontal-space ()' Delete all spaces and tabs around point. By default, this is unbound. `kill-region ()' - Kill the text between the point and the *mark* (saved cursor - position). This text is referred to as the REGION. By default, - this command is unbound. + Kill the text in the current region. By default, this command is + unbound. `copy-region-as-kill ()' Copy the text in the region to the kill buffer, so it can be yanked @@ -6179,7 +6063,7 @@ Letting Readline Type For You matches. `complete-into-braces (M-{)' - Perform filename completion and return the list of possible + Perform filename completion and insert the list of possible completions enclosed within braces so the list is available to the shell (*note Brace Expansion::.). @@ -6207,7 +6091,7 @@ Some Miscellaneous Commands --------------------------- `re-read-init-file (C-x C-r)' - Read in the contents of the inputrc file, and incorporate any + Read in the contents of the INPUTRC file, and incorporate any bindings or variable assignments found there. `abort (C-g)' @@ -6254,8 +6138,8 @@ Some Miscellaneous Commands `insert-comment (M-#)' The value of the `comment-begin' variable is inserted at the beginning of the current line, and the line is accepted as if a - newline had been typed. This makes the current line a shell - comment. + newline had been typed. The default value of `comment-begin' + causes this command to make the current line a shell comment. `dump-functions ()' Print all of the functions and their key bindings to the Readline @@ -6318,7 +6202,7 @@ Some Miscellaneous Commands editing mode, as if the command `set -o emacs' had been executed. -File: bashref.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing +File: bashref.info, Node: Readline vi Mode, Next: Programmable Completion, Prev: Bindable Readline Commands, Up: Command Line Editing Readline vi Mode ================ @@ -6339,15 +6223,623 @@ the standard `vi' movement keys, move to previous history lines with `k' and subsequent lines with `j', and so forth. +File: bashref.info, Node: Programmable Completion, Next: Programmable Completion Builtins, Prev: Readline vi Mode, Up: Command Line Editing + +Programmable Completion +======================= + + When word completion is attempted for an argument to a command for +which a completion specification (a COMPSPEC) has been defined using +the `complete' builtin (*note Programmable Completion Builtins::.), the +programmable completion facilities are invoked. + + First, the command name is identified. If a compspec has been +defined for that command, the compspec is used to generate the list of +possible completions for the word. If the command word is a full +pathname, a compspec for the full pathname is searched for first. If +no compspec is found for the full pathname, an attempt is made to find +a compspec for the portion following the final slash. + + Once a compspec has been found, it is used to generate the list of +matching words. If a compspec is not found, the default Bash completion +described above (*note Commands For Completion::.) is performed. + + First, the actions specified by the compspec are used. Only matches +which are prefixed by the word being completed are returned. When the +`-f' or `-d' option is used for filename or directory name completion, +the shell variable `FIGNORE' is used to filter the matches. *Note Bash +Variables::, for a description of `FIGNORE'. + + Any completions specified by a filename expansion pattern to the +`-G' option are generated next. The words generated by the pattern +need not match the word being completed. The `GLOBIGNORE' shell +variable is not used to filter the matches, but the `FIGNORE' shell +variable is used. + + Next, the string specified as the argument to the `-W' option is +considered. The string is first split using the characters in the `IFS' +special variable as delimiters. Shell quoting is honored. Each word +is then expanded using brace expansion, tilde expansion, parameter and +variable expansion, command substitution, arithmetic expansion, and +pathname expansion, as described above (*note Shell Expansions::.). +The results are split using the rules described above (*note Word +Splitting::.). The results of the expansion are prefix-matched against +the word being completed, and the matching words become the possible +completions. + + After these matches have been generated, any shell function or +command specified with the `-F' and `-C' options is invoked. When the +command or function is invoked, the `COMP_LINE' and `COMP_POINT' +variables are assigned values as described above (*note Bash +Variables::.). If a shell function is being invoked, the `COMP_WORDS' +and `COMP_CWORD' variables are also set. When the function or command +is invoked, the first argument is the name of the command whose +arguments are being completed, the second argument is the word being +completed, and the third argument is the word preceding the word being +completed on the current command line. No filtering of the generated +completions against the word being completed is performed; the function +or command has complete freedom in generating the matches. + + Any function specified with `-F' is invoked first. The function may +use any of the shell facilities, including the `compgen' builtin +described below (*note Programmable Completion Builtins::.), to +generate the matches. It must put the possible completions in the +`COMPREPLY' array variable. + + Next, any command specified with the `-C' option is invoked in an +environment equivalent to command substitution. It should print a list +of completions, one per line, to the standard output. Backslash may be +used to escape a newline, if necessary. + + After all of the possible completions are generated, any filter +specified with the `-X' option is applied to the list. The filter is a +pattern as used for pathname expansion; a `&' in the pattern is +replaced with the text of the word being completed. A literal `&' may +be escaped with a backslash; the backslash is removed before attempting +a match. Any completion that matches the pattern will be removed from +the list. A leading `!' negates the pattern; in this case any +completion not matching the pattern will be removed. + + Finally, any prefix and suffix specified with the `-P' and `-S' +options are added to each member of the completion list, and the result +is returned to the Readline completion code as the list of possible +completions. + + If a compspec is found, whatever it generates is returned to the +completion code as the full set of possible completions. The default +Bash completions are not attempted, and the Readline default of +filename completion is disabled. + + +File: bashref.info, Node: Programmable Completion Builtins, Prev: Programmable Completion, Up: Command Line Editing + +Programmable Completion Builtins +================================ + + Two builtin commands are available to manipulate the programmable +completion facilities. + +`compgen' + `compgen [OPTION] [WORD]' + + Generate possible completion matches for WORD according to the + OPTIONs, which may be any option accepted by the `complete' + builtin with the exception of `-p' and `-r', and write the matches + to the standard output. When using the `-F' or `-C' options, the + various shell variables set by the programmable completion + facilities, while available, will not have useful values. + + The matches will be generated in the same way as if the + programmable completion code had generated them directly from a + completion specification with the same flags. If WORD is + specified, only those completions matching WORD will be displayed. + + The return value is true unless an invalid option is supplied, or + no matches were generated. + +`complete' + `complete [-abcdefjkvu] [-A ACTION] [-G GLOBPAT] [-W WORDLIST] + [-P PREFIX] [-S SUFFIX] [-X FILTERPAT] [-F FUNCTION] + [-C COMMAND] NAME [NAME ...]' + `complete -pr [NAME ...]' + + Specify how arguments to each NAME should be completed. If the + `-p' option is supplied, or if no options are supplied, existing + completion specifications are printed in a way that allows them to + be reused as input. The `-r' option removes a completion + specification for each NAME, or, if no NAMEs are supplied, all + completion specifications. + + The process of applying these completion specifications when word + completion is attempted is described above (*note Programmable + Completion::.). + + Other options, if specified, have the following meanings. The + arguments to the `-G', `-W', and `-X' options (and, if necessary, + the `-P' and `-S' options) should be quoted to protect them from + expansion before the `complete' builtin is invoked. + + `-A ACTION' + The ACTION may be one of the following to generate a list of + possible completions: + + `alias' + Alias names. May also be specified as `-a'. + + `arrayvar' + Array variable names. + + `binding' + Readline key binding names (*note Bindable Readline + Commands::.). + + `builtin' + Names of shell builtin commands. May also be specified + as `-b'. + + `command' + Command names. May also be specified as `-c'. + + `directory' + Directory names. May also be specified as `-d'. + + `disabled' + Names of disabled shell builtins. + + `enabled' + Names of enabled shell builtins. + + `export' + Names of exported shell variables. May also be + specified as `-e'. + + `file' + File names. May also be specified as `-f'. + + `function' + Names of shell functions. + + `helptopic' + Help topics as accepted by the `help' builtin (*note + Bash Builtins::.). + + `hostname' + Hostnames, as taken from the file specified by the + `HOSTFILE' shell variable (*note Bash Variables::.). + + `job' + Job names, if job control is active. May also be + specified as `-j'. + + `keyword' + Shell reserved words. May also be specified as `-k'. + + `running' + Names of running jobs, if job control is active. + + `setopt' + Valid arguments for the `-o' option to the `set' builtin + (*note The Set Builtin::.). + + `shopt' + Shell option names as accepted by the `shopt' builtin + (*note Bash Builtins::.). + + `signal' + Signal names. + + `stopped' + Names of stopped jobs, if job control is active. + + `user' + User names. May also be specified as `-u'. + + `variable' + Names of all shell variables. May also be specified as + `-v'. + + `-G GLOBPAT' + The filename expansion pattern GLOBPAT is expanded to generate + the possible completions. + + `-W WORDLIST' + The WORDLIST is split using the characters in the `IFS' + special variable as delimiters, and each resultant word is + expanded. The possible completions are the members of the + resultant list which match the word being completed. + + `-C COMMAND' + COMMAND is executed in a subshell environment, and its output + is used as the possible completions. + + `-F FUNCTION' + The shell function FUNCTION is executed in the current shell + environment. When it finishes, the possible completions are + retrieved from the value of the `COMPREPLY' array variable. + + `-X FILTERPAT' + FILTERPAT is a pattern as used for filename expansion. It is + applied to the list of possible completions generated by the + preceding options and arguments, and each completion matching + FILTERPAT is removed from the list. A leading `!' in + FILTERPAT negates the pattern; in this case, any completion + not matching FILTERPAT is removed. + + `-P PREFIX' + PREFIX is added at the beginning of each possible completion + after all other options have been applied. + + `-S SUFFIX' + SUFFIX is appended to each possible completion after all + other options have been applied. + + The return value is true unless an invalid option is supplied, an + option other than `-p' or `-r' is supplied without a NAME + argument, an attempt is made to remove a completion specification + for a NAME for which no specification exists, or an error occurs + adding a completion specification. + + +File: bashref.info, Node: Using History Interactively, Next: Command Line Editing, Prev: Job Control, Up: Top + +Using History Interactively +*************************** + + This chapter describes how to use the GNU History Library +interactively, from a user's standpoint. It should be considered a +user's guide. For information on using the GNU History Library in +other programs, see the GNU Readline Library Manual. + +* Menu: + +* Bash History Facilities:: How Bash lets you manipulate your command + history. +* Bash History Builtins:: The Bash builtin commands that manipulate + the command history. +* History Interaction:: What it feels like using History as a user. + + +File: bashref.info, Node: Bash History Facilities, Next: Bash History Builtins, Up: Using History Interactively + +Bash History Facilities +======================= + + When the `-o history' option to the `set' builtin is enabled (*note +The Set Builtin::.), the shell provides access to the COMMAND HISTORY, +the list of commands previously typed. The value of the `HISTSIZE' +shell variable is used as the number of commands to save in a history +list. The text of the last `$HISTSIZE' commands (default 500) is saved. +The shell stores each command in the history list prior to parameter +and variable expansion but after history expansion is performed, +subject to the values of the shell variables `HISTIGNORE' and +`HISTCONTROL'. + + When the shell starts up, the history is initialized from the file +named by the `HISTFILE' variable (default `~/.bash_history'). The file +named by the value of `HISTFILE' is truncated, if necessary, to contain +no more than the number of lines specified by the value of the +`HISTFILESIZE' variable. When an interactive shell exits, the last +`$HISTSIZE' lines are copied from the history list to the file named by +`$HISTFILE'. If the `histappend' shell option is set (*note Bash +Builtins::.), the lines are appended to the history file, otherwise the +history file is overwritten. If `HISTFILE' is unset, or if the history +file is unwritable, the history is not saved. After saving the +history, the history file is truncated to contain no more than +`$HISTFILESIZE' lines. If `HISTFILESIZE' is not set, no truncation is +performed. + + The builtin command `fc' may be used to list or edit and re-execute +a portion of the history list. The `history' builtin may be used to +display or modify the history list and manipulate the history file. +When using command-line editing, search commands are available in each +editing mode that provide access to the history list (*note Commands +For History::.). + + The shell allows control over which commands are saved on the history +list. The `HISTCONTROL' and `HISTIGNORE' variables may be set to cause +the shell to save only a subset of the commands entered. The `cmdhist' +shell option, if enabled, causes the shell to attempt to save each line +of a multi-line command in the same history entry, adding semicolons +where necessary to preserve syntactic correctness. The `lithist' shell +option causes the shell to save the command with embedded newlines +instead of semicolons. The `shopt' builtin is used to set these +options. *Note Bash Builtins::, for a description of `shopt'. + + +File: bashref.info, Node: Bash History Builtins, Next: History Interaction, Prev: Bash History Facilities, Up: Using History Interactively + +Bash History Builtins +===================== + + Bash provides two builtin commands which manipulate the history list +and history file. + +`fc' + `fc [-e ENAME] [-nlr] [FIRST] [LAST]' + `fc -s [PAT=REP] [COMMAND]' + + Fix Command. In the first form, a range of commands from FIRST to + LAST is selected from the history list. Both FIRST and LAST may + be specified as a string (to locate the most recent command + beginning with that string) or as a number (an index into the + history list, where a negative number is used as an offset from the + current command number). If LAST is not specified it is set to + FIRST. If FIRST is not specified it is set to the previous + command for editing and -16 for listing. If the `-l' flag is + given, the commands are listed on standard output. The `-n' flag + suppresses the command numbers when listing. The `-r' flag + reverses the order of the listing. Otherwise, the editor given by + ENAME is invoked on a file containing those commands. If ENAME is + not given, the value of the following variable expansion is used: + `${FCEDIT:-${EDITOR:-vi}}'. This says to use the value of the + `FCEDIT' variable if set, or the value of the `EDITOR' variable if + that is set, or `vi' if neither is set. When editing is complete, + the edited commands are echoed and executed. + + In the second form, COMMAND is re-executed after each instance of + PAT in the selected command is replaced by REP. + + A useful alias to use with the `fc' command is `r='fc -s'', so + that typing `r cc' runs the last command beginning with `cc' and + typing `r' re-executes the last command (*note Aliases::.). + +`history' + history [N] + history -c + history -d OFFSET + history [-anrw] [FILENAME] + history -ps ARG + + With no options, display the history list with line numbers. + Lines prefixed with with a `*' have been modified. An argument of + N lists only the last N lines. Options, if supplied, have the + following meanings: + + `-c' + Clear the history list. This may be combined with the other + options to replace the history list completely. + + `-d OFFSET' + Delete the history entry at position OFFSET. OFFSET should + be specified as it appears when the history is displayed. + + `-a' + Append the new history lines (history lines entered since the + beginning of the current Bash session) to the history file. + + `-n' + Append the history lines not already read from the history + file to the current history list. These are lines appended + to the history file since the beginning of the current Bash + session. + + `-r' + Read the current history file and append its contents to the + history list. + + `-w' + Write out the current history to the history file. + + `-p' + Perform history substitution on the ARGs and display the + result on the standard output, without storing the results in + the history list. + + `-s' + The ARGs are added to the end of the history list as a single + entry. + + When any of the `-w', `-r', `-a', or `-n' options is used, if + FILENAME is given, then it is used as the history file. If not, + then the value of the `HISTFILE' variable is used. + + +File: bashref.info, Node: History Interaction, Prev: Bash History Builtins, Up: Using History Interactively + +History Expansion +================= + + The History library provides a history expansion feature that is +similar to the history expansion provided by `csh'. This section +describes the syntax used to manipulate the history information. + + History expansions introduce words from the history list into the +input stream, making it easy to repeat commands, insert the arguments +to a previous command into the current input line, or fix errors in +previous commands quickly. + + History expansion takes place in two parts. The first is to +determine which line from the history list should be used during +substitution. The second is to select portions of that line for +inclusion into the current one. The line selected from the history is +called the "event", and the portions of that line that are acted upon +are called "words". Various "modifiers" are available to manipulate +the selected words. The line is broken into words in the same fashion +that Bash does, so that several words surrounded by quotes are +considered one word. History expansions are introduced by the +appearance of the history expansion character, which is `!' by default. +Only `\' and `'' may be used to escape the history expansion character. + + Several shell options settable with the `shopt' builtin (*note Bash +Builtins::.) may be used to tailor the behavior of history expansion. +If the `histverify' shell option is enabled, and Readline is being +used, history substitutions are not immediately passed to the shell +parser. Instead, the expanded line is reloaded into the Readline +editing buffer for further modification. If Readline is being used, +and the `histreedit' shell option is enabled, a failed history +expansion will be reloaded into the Readline editing buffer for +correction. The `-p' option to the `history' builtin command may be +used to see what a history expansion will do before using it. The `-s' +option to the `history' builtin may be used to add commands to the end +of the history list without actually executing them, so that they are +available for subsequent recall. This is most useful in conjunction +with Readline. + + The shell allows control of the various characters used by the +history expansion mechanism with the `histchars' variable. + +* Menu: + +* Event Designators:: How to specify which history line to use. +* Word Designators:: Specifying which words are of interest. +* Modifiers:: Modifying the results of substitution. + + +File: bashref.info, Node: Event Designators, Next: Word Designators, Up: History Interaction + +Event Designators +----------------- + + An event designator is a reference to a command line entry in the +history list. + +`!' + Start a history substitution, except when followed by a space, tab, + the end of the line, `=' or `('. + +`!N' + Refer to command line N. + +`!-N' + Refer to the command N lines back. + +`!!' + Refer to the previous command. This is a synonym for `!-1'. + +`!STRING' + Refer to the most recent command starting with STRING. + +`!?STRING[?]' + Refer to the most recent command containing STRING. The trailing + `?' may be omitted if the STRING is followed immediately by a + newline. + +`^STRING1^STRING2^' + Quick Substitution. Repeat the last command, replacing STRING1 + with STRING2. Equivalent to `!!:s/STRING1/STRING2/'. + +`!#' + The entire command line typed so far. + + +File: bashref.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction + +Word Designators +---------------- + + Word designators are used to select desired words from the event. A +`:' separates the event specification from the word designator. It may +be omitted if the word designator begins with a `^', `$', `*', `-', or +`%'. Words are numbered from the beginning of the line, with the first +word being denoted by 0 (zero). Words are inserted into the current +line separated by single spaces. + + For example, + +`!!' + designates the preceding command. When you type this, the + preceding command is repeated in toto. + +`!!:$' + designates the last argument of the preceding command. This may be + shortened to `!$'. + +`!fi:2' + designates the second argument of the most recent command starting + with the letters `fi'. + + Here are the word designators: + +`0 (zero)' + The `0'th word. For many applications, this is the command word. + +`N' + The Nth word. + +`^' + The first argument; that is, word 1. + +`$' + The last argument. + +`%' + The word matched by the most recent `?STRING?' search. + +`X-Y' + A range of words; `-Y' abbreviates `0-Y'. + +`*' + All of the words, except the `0'th. This is a synonym for `1-$'. + It is not an error to use `*' if there is just one word in the + event; the empty string is returned in that case. + +`X*' + Abbreviates `X-$' + +`X-' + Abbreviates `X-$' like `X*', but omits the last word. + + If a word designator is supplied without an event specification, the +previous command is used as the event. + + +File: bashref.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction + +Modifiers +--------- + + After the optional word designator, you can add a sequence of one or +more of the following modifiers, each preceded by a `:'. + +`h' + Remove a trailing pathname component, leaving only the head. + +`t' + Remove all leading pathname components, leaving the tail. + +`r' + Remove a trailing suffix of the form `.SUFFIX', leaving the + basename. + +`e' + Remove all but the trailing suffix. + +`p' + Print the new command but do not execute it. + +`q' + Quote the substituted words, escaping further substitutions. + +`x' + Quote the substituted words as with `q', but break into words at + spaces, tabs, and newlines. + +`s/OLD/NEW/' + Substitute NEW for the first occurrence of OLD in the event line. + Any delimiter may be used in place of `/'. The delimiter may be + quoted in OLD and NEW with a single backslash. If `&' appears in + NEW, it is replaced by OLD. A single backslash will quote the + `&'. The final delimiter is optional if it is the last character + on the input line. + +`&' + Repeat the previous substitution. + +`g' + Cause changes to be applied over the entire event line. Used in + conjunction with `s', as in `gs/OLD/NEW/', or with `&'. + + File: bashref.info, Node: Installing Bash, Next: Reporting Bugs, Prev: Command Line Editing, Up: Top Installing Bash *************** This chapter provides basic instructions for installing Bash on the -various supported platforms. The distribution supports nearly every -version of Unix (and, someday, GNU). Other independent ports exist for -MS-DOS, OS/2, Windows 95, and Windows NT. +various supported platforms. The distribution supports the GNU +operating systems, nearly every version of Unix, and several non-Unix +systems such as BeOS and Interix. Other independent ports exist for +MS-DOS, OS/2, Windows 95/98, and Windows NT. * Menu: @@ -6380,18 +6872,45 @@ Basic Installation These are installation instructions for Bash. + The simplest way to compile Bash is: + + 1. `cd' to the directory containing the source code and type + `./configure' to configure Bash for your system. If you're using + `csh' on an old version of System V, you might need to type `sh + ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes some time. While running, it prints + messages telling which features it is checking for. + + 2. Type `make' to compile Bash and build the `bashbug' bug reporting + script. + + 3. Optionally, type `make tests' to run the Bash test suite. + + 4. Type `make install' to install `bash' and `bashbug'. This will + also install the manual pages and Info file. + + The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package -(the top directory, the `builtins' and `doc' directories, and the each -directory under `lib'). It also creates a `config.h' file containing -system-dependent definitions. Finally, it creates a shell script named -`config.status' that you can run in the future to recreate the current -configuration, a file `config.cache' that saves the results of its -tests to speed up reconfiguring, and a file `config.log' containing -compiler output (useful mainly for debugging `configure'). If at some -point `config.cache' contains results you don't want to keep, you may -remove or edit it. +(the top directory, the `builtins', `doc', and `support' directories, +each directory under `lib', and several others). It also creates a +`config.h' file containing system-dependent definitions. Finally, it +creates a shell script named `config.status' that you can run in the +future to recreate the current configuration, a file `config.cache' +that saves the results of its tests to speed up reconfiguring, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). If at some point `config.cache' contains +results you don't want to keep, you may remove or edit it. + + To find out more about the options and arguments that the +`configure' script understands, type + + bash-2.04$ ./configure --help + +at the Bash prompt in your Bash source directory. If you need to do unusual things to compile Bash, please try to figure out how `configure' could check whether or not to do them, and @@ -6411,26 +6930,6 @@ contain the patch level of the Bash distribution, `0' for example. The script `support/mkconffiles' has been provided to automate the creation of these files. - The simplest way to compile Bash is: - - 1. `cd' to the directory containing the source code and type - `./configure' to configure Bash for your system. If you're using - `csh' on an old version of System V, you might need to type `sh - ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile Bash and build the `bashbug' bug reporting - script. - - 3. Optionally, type `make tests' to run the Bash test suite. - - 4. Type `make install' to install `bash' and `bashbug'. This will - also install the manual pages and Info file. - - You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile Bash for a different kind of @@ -6503,7 +7002,7 @@ than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', `make install' will -use `PATH' as the prefix for installing programs and libraries. +use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. @@ -6520,7 +7019,8 @@ message saying it can not guess the host type, give it the type, such as `sun4', or a canonical name with three fields: `CPU-COMPANY-SYSTEM' (e.g., `sparc-sun-sunos4.1.2'). -See the file `support/config.sub' for the possible values of each field. + See the file `support/config.sub' for the possible values of each +field. File: bashref.info, Node: Sharing Defaults, Next: Operation Controls, Prev: Specifying the System Type, Up: Installing Bash @@ -6568,7 +7068,7 @@ operates. script, and exit. `configure' also accepts some other, not widely used, boilerplate -options. +options. `configure --help' prints the complete list. File: bashref.info, Node: Optional Features, Prev: Operation Controls, Up: Installing Bash @@ -6579,8 +7079,8 @@ Optional Features The Bash `configure' has a number of `--enable-FEATURE' options, where FEATURE indicates an optional part of Bash. There are also several `--with-PACKAGE' options, where PACKAGE is something like -`gnu-malloc' or `purify'. To turn off the default use of a package, use -`--without-PACKAGE'. To configure Bash without a feature that is +`bash-malloc' or `purify'. To turn off the default use of a package, +use `--without-PACKAGE'. To configure Bash without a feature that is enabled by default, use `--disable-FEATURE'. Here is a complete list of the `--enable-' and `--with-' options @@ -6589,6 +7089,15 @@ that the Bash `configure' recognizes. `--with-afs' Define if you are using the Andrew File System from Transarc. +`--with-bash-malloc' + Use the Bash version of `malloc' in `lib/malloc/malloc.c'. This + is not the same `malloc' that appears in GNU libc, but an older + version derived from the 4.2 BSD `malloc'. This `malloc' is very + fast, but wastes some space on each allocation. This option is + enabled by default. The `NOTES' file contains a list of systems + for which this should be turned off, and `configure' disables this + option automatically for a number of systems. + `--with-curses' Use the curses library instead of the termcap library. This should be supplied if your system has an inadequate or incomplete termcap @@ -6600,25 +7109,19 @@ that the Bash `configure' recognizes. 2, but a modified version of the `malloc' from glibc version 1. This is somewhat slower than the default `malloc', but wastes less space on a per-allocation basis, and will return memory to the - operating system under some circumstances. + operating system under certain circumstances. `--with-gnu-malloc' - Use the GNU version of `malloc' in `lib/malloc/malloc.c'. This is - not the same `malloc' that appears in GNU libc, but an older - version derived from the 4.2 BSD `malloc'. This `malloc' is very - fast, but wastes some space on each allocation. This option is - enabled by default. The `NOTES' file contains a list of systems - for which this should be turned off, and `configure' disables this - option automatically for a number of systems. + A synonym for `--with-bash-malloc'. `--with-installed-readline' - Define this to make bash link with a locally-installed version of - Readline rather than the version in lib/readline. This works only - with readline 4.0 and later versions. + Define this to make Bash link with a locally-installed version of + Readline rather than the version in `lib/readline'. This works + only with Readline 4.1 and later versions. `--with-purify' - Define this to use the Purify memory allocation checker from Pure - Software. + Define this to use the Purify memory allocation checker from + Rational Software. `--enable-minimal-config' This produces a shell with minimal features, close to the @@ -6640,13 +7143,18 @@ following options, but it is processed first, so individual options may be enabled using `enable-FEATURE'. All of the following options except for `disabled-builtins' and -`usg-echo-default' are enabled by default, unless the operating system +`xpg-echo-default' are enabled by default, unless the operating system does not provide the necessary support. `--enable-alias' Allow alias expansion and include the `alias' and `unalias' builtins (*note Aliases::.). +`--enable-arith-for-command' + Include support for the alternate form of the `for' command that + behaves like the C language `for' statement (*note Looping + Constructs::.). + `--enable-array-variables' Include support for one-dimensional array shell variables (*note Arrays::.). @@ -6661,9 +7169,9 @@ does not provide the necessary support. `--enable-command-timing' Include support for recognizing `time' as a reserved word and for - displaying timing statistics for the pipeline following `time'. - This allows pipelines as well as shell builtins and functions to - be timed. + displaying timing statistics for the pipeline following `time' + (*note Pipelines::.). This allows pipelines as well as shell + builtins and functions to be timed. `--enable-cond-command' Include support for the `[[' conditional command (*note @@ -6689,16 +7197,21 @@ does not provide the necessary support. `--enable-help-builtin' Include the `help' builtin, which displays help on shell builtins - and variables. + and variables (*note Bash Builtins::.). `--enable-history' Include command history and the `fc' and `history' builtin - commands. + commands (*note Bash History Facilities::.). `--enable-job-control' This enables the job control features (*note Job Control::.), if the operating system supports them. +`--enable-net-redirections' + This enables the special handling of filenames of the form + `/dev/tcp/HOST/PORT' and `/dev/udp/HOST/PORT' when used in + redirections (*note Redirections::.). + `--enable-process-substitution' This enables process substitution (*note Process Substitution::.) if the operating system provides the necessary support. @@ -6709,6 +7222,11 @@ does not provide the necessary support. strings. See *Note Printing a Prompt::, for a complete list of prompt string escape sequences. +`--enable-progcomp' + Enable the programmable completion facilities (*note Programmable + Completion::.). If Readline is not enabled, this option has no + effect. + `--enable-readline' Include support for command-line editing and history with the Bash version of the Readline library (*note Command Line Editing::.). @@ -6723,18 +7241,24 @@ does not provide the necessary support. menus (*note Conditional Constructs::.). `--enable-usg-echo-default' + A synonym for `--enable-xpg-echo-default'. + +`--enable-xpg-echo-default' Make the `echo' builtin expand backslash-escaped characters by - default, without requiring the `-e' option. This makes the Bash - `echo' behave more like the System V version. + default, without requiring the `-e' option. This sets the default + value of the `xpg_echo' shell option to `on', which makes the Bash + `echo' behave more like the version specified in the Single Unix + Specification, version 2. *Note Bash Builtins::, for a + description of the escape sequences that `echo' recognizes. - The file `config.h.top' contains C Preprocessor `#define' statements + The file `config-top.h' contains C Preprocessor `#define' statements for options which are not settable from `configure'. Some of these are not meant to be changed; beware of the consequences if you do. Read the comments associated with each definition for more information about its effect. -File: bashref.info, Node: Reporting Bugs, Next: Builtin Index, Prev: Installing Bash, Up: Top +File: bashref.info, Node: Reporting Bugs, Next: Major Differences From The Bourne Shell, Prev: Installing Bash, Up: Top Reporting Bugs ************** @@ -6767,7 +7291,318 @@ it provides for filing a bug report. Please send all reports concerning this manual to <chet@po.CWRU.Edu>. -File: bashref.info, Node: Builtin Index, Next: Reserved Word Index, Prev: Reporting Bugs, Up: Top +File: bashref.info, Node: Major Differences From The Bourne Shell, Next: Builtin Index, Prev: Reporting Bugs, Up: Top + +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 SVR4.2 as the baseline reference. + + * Bash is POSIX-conformant, even where the POSIX specification + differs from traditional `sh' behavior. + + * Bash has multi-character invocation options (*note Invoking + Bash::.). + + * Bash has command-line editing (*note Command Line Editing::.) and + the `bind' builtin. + + * Bash provides a programmable word completion mechanism (*note + Programmable Completion::.), and two builtin commands, `complete' + and `compgen', to manipulate it. + + * Bash has command history (*note Bash History Facilities::.) and the + `history' and `fc' builtins to manipulate it. + + * Bash implements `csh'-like history expansion (*note History + Interaction::.). + + * Bash has one-dimensional array variables (*note 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 (*note 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 (*note Locale + Translation::.). + + * Bash implements the `!' keyword to negate the return value of a + pipeline (*note Pipelines::.). Very useful when an `if' statement + needs to act only if a test fails. + + * Bash has the `time' reserved word and command timing (*note + 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 (*note Looping + Constructs::.). + + * Bash includes the `select' compound command, which allows the + generation of simple menus (*note Conditional Constructs::.). + + * Bash includes the `[[' compound command, which makes conditional + testing part of the shell grammar (*note Conditional + Constructs::.). + + * Bash includes brace expansion (*note Brace Expansion::.) and tilde + expansion (*note Tilde Expansion::.). + + * Bash implements command aliases and the `alias' and `unalias' + builtins (*note Aliases::.). + + * Bash provides shell arithmetic, the `((' compound command (*note + Conditional Constructs::.), and arithmetic expansion (*note 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 (*note Shell Parameter Expansion::.). + + * The expansion `${#xx}', which returns the length of `${xx}', is + supported (*note 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 (*note Shell Parameter Expansion::.). + + * The expansion `${var/[/]'PATTERN`[/'REPLACEMENT`]}', which matches + PATTERN and replaces it with REPLACEMENT in the value of `var', is + available (*note Shell Parameter Expansion::.). + + * The expansion `${!PREFIX}*' expansion, which expands to the names + of all shell variables whose names begin with PREFIX, is available + (*note Shell Parameter Expansion::.). + + * Bash has INDIRECT variable expansion using `${!word}' (*note Shell + Parameter Expansion::.). + + * Bash can expand positional parameters beyond `$9' using `${NUM}'. + + * The POSIX `$()' form of command substitution is implemented (*note + Command Substitution::.), and preferred to the Bourne shell's ```' + (which is also implemented for backwards compatibility). + + * Bash has process substitution (*note 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'). *Note Bash Variables::, for details. + + * The `IFS' variable is used to split only the results of expansion, + not all words (*note 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 (*note Filename Expansion::.). + + * Bash implements extended pattern matching features when the + `extglob' shell option is enabled (*note 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 + (*note Bash Builtins::.). + + * Variable assignments preceding commands affect only that command, + even builtins and functions (*note 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 (*note 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 (*note Redirections::.). + + * Bash treats a number of filenames specially when they are used in + redirection operators (*note Redirections::.). + + * Bash can open network connections to arbitrary machines and + services with the redirection operators (*note Redirections::.). + + * The `noclobber' option is available to avoid overwriting existing + files with output redirection (*note The Set Builtin::.). The + `>|' redirection operator may be used to override `noclobber'. + + * The Bash `cd' and `pwd' builtins (*note Bourne Shell Builtins::.) + each take `-L' and `-P' builtins 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 (*note Bash + Builtins::.). + + * The `command' builtin allows selective disabling of functions when + command lookup is performed (*note Bash Builtins::.). + + * Individual builtins may be enabled or disabled using the `enable' + builtin (*note Bash Builtins::.). + + * 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 + (*note Bourne Shell Builtins::.). + + * Shell functions may be exported to children via the environment + using `export -f' (*note 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' (*note Bourne Shell + Builtins::.). + + * Bash includes a `help' builtin for quick reference to shell + facilities (*note Bash Builtins::.). + + * The `printf' builtin is available to display formatted output + (*note Bash Builtins::.). + + * The Bash `read' builtin (*note Bash Builtins::.) 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 (*note Bourne Shell + Builtins::.). + + * Bash includes the `shopt' builtin, for finer control of shell + optional capabilities (*note Bash Builtins::.). + + * Bash has much more optional behavior controllable with the `set' + builtin (*note The Set Builtin::.). + + * The `test' builtin (*note 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 (*note 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. + + * The Bash `type' builtin is more extensive and gives more + information about the names it finds (*note Bash Builtins::.). + + * 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 (*note Bourne Shell Builtins::.). + + * Bash implements a `csh'-like directory stack, and provides the + `pushd', `popd', and `dirs' builtins to manipulate it (*note 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 (*note Printing a Prompt::.). + + * The Bash restricted mode is more useful (*note 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 (*note 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 *Note Bash Features::. + +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). + + +File: bashref.info, Node: Builtin Index, Next: Reserved Word Index, Prev: Major Differences From The Bourne Shell, Up: Top Index of Shell Builtin Commands ******************************* @@ -6777,16 +7612,18 @@ Index of Shell Builtin Commands * .: Bourne Shell Builtins. * :: Bourne Shell Builtins. * [: Bourne Shell Builtins. -* alias: Alias Builtins. +* alias: Bash Builtins. * bg: Job Control Builtins. * bind: Bash Builtins. * break: Bourne Shell Builtins. * builtin: Bash Builtins. * cd: Bourne Shell Builtins. * command: Bash Builtins. +* compgen: Programmable Completion Builtins. +* complete: Programmable Completion Builtins. * continue: Bourne Shell Builtins. * declare: Bash Builtins. -* dirs: The Directory Stack. +* dirs: Directory Stack Builtins. * disown: Job Control Builtins. * echo: Bash Builtins. * enable: Bash Builtins. @@ -6805,9 +7642,9 @@ Index of Shell Builtin Commands * let: Bash Builtins. * local: Bash Builtins. * logout: Bash Builtins. -* popd: The Directory Stack. +* popd: Directory Stack Builtins. * printf: Bash Builtins. -* pushd: The Directory Stack. +* pushd: Directory Stack Builtins. * pwd: Bourne Shell Builtins. * read: Bash Builtins. * readonly: Bourne Shell Builtins. @@ -6824,15 +7661,15 @@ Index of Shell Builtin Commands * typeset: Bash Builtins. * ulimit: Bash Builtins. * umask: Bourne Shell Builtins. -* unalias: Alias Builtins. +* unalias: Bash Builtins. * unset: Bourne Shell Builtins. * wait: Job Control Builtins. File: bashref.info, Node: Reserved Word Index, Next: Variable Index, Prev: Builtin Index, Up: Top -Shell Reserved Words -******************** +Index of Shell Reserved Words +***************************** * Menu: @@ -6883,7 +7720,12 @@ Parameter and Variable Index * bell-style: Readline Init File Syntax. * CDPATH: Bourne Shell Variables. * comment-begin: Readline Init File Syntax. +* COMP_CWORD: Bash Variables. +* COMP_LINE: Bash Variables. +* COMP_POINT: Bash Variables. +* COMP_WORDS: Bash Variables. * completion-query-items: Readline Init File Syntax. +* COMPREPLY: Bash Variables. * convert-meta: Readline Init File Syntax. * DIRSTACK: Bash Variables. * disable-completion: Readline Init File Syntax. @@ -6893,6 +7735,7 @@ Parameter and Variable Index * expand-tilde: Readline Init File Syntax. * FCEDIT: Bash Variables. * FIGNORE: Bash Variables. +* FUNCNAME: Bash Variables. * GLOBIGNORE: Bash Variables. * GROUPS: Bash Variables. * histchars: Bash Variables. @@ -6918,6 +7761,7 @@ Parameter and Variable Index * LC_COLLATE: Bash Variables. * LC_CTYPE: Bash Variables. * LC_MESSAGES: Bash Variables. +* LC_NUMERIC: Bash Variables. * LINENO: Bash Variables. * MACHTYPE: Bash Variables. * MAIL: Bourne Shell Variables. @@ -7063,6 +7907,7 @@ Concept Index * commands, shell: Shell Commands. * commands, simple: Simple Commands. * comments, shell: Comments. +* completion builtins: Programmable Completion Builtins. * configuration: Basic Installation. * control operator: Definitions. * directory stack: The Directory Stack. @@ -7091,16 +7936,16 @@ Concept Index * history events: Event Designators. * history expansion: History Interaction. * history list: Bash History Facilities. -* History, how to use: Job Control Variables. +* History, how to use: Programmable Completion Builtins. * identifier: Definitions. * initialization file, readline: Readline Init File. * installation: Basic Installation. * interaction, readline: Readline Interaction. -* interactive shell <1>: Is This Shell Interactive?. +* interactive shell <1>: Interactive Shells. * interactive shell: Invoking Bash. * job: Definitions. -* job control <1>: Definitions. -* job control: Job Control Basics. +* job control <1>: Job Control Basics. +* job control: Definitions. * kill ring: Readline Killing Commands. * killing text: Readline Killing Commands. * localization: Locale Translation. @@ -7121,10 +7966,11 @@ Concept Index * process group: Definitions. * process group ID: Definitions. * process substitution: Process Substitution. +* programmable completion: Programmable Completion. * prompting: Printing a Prompt. * quoting: Quoting. * quoting, ANSI: ANSI-C Quoting. -* Readline, how to use: Modifiers. +* Readline, how to use: Job Control Variables. * redirection: Redirections. * reserved word: Definitions. * restricted shell: The Restricted Shell. @@ -7133,8 +7979,10 @@ Concept Index * shell function: Shell Functions. * shell script: Shell Scripts. * shell variable: Shell Parameters. +* shell, interactive: Interactive Shells. * signal: Definitions. * signal handling: Signals. +* special builtin <1>: Special Builtins. * special builtin: Definitions. * startup files: Bash Startup Files. * suspending jobs: Job Control Basics. @@ -7148,120 +7996,126 @@ Concept Index Tag Table: -Node: Top1187 -Node: Introduction3146 -Node: What is Bash?3371 -Node: What is a shell?4465 -Node: Definitions6487 -Node: Basic Shell Features9148 -Node: Shell Syntax10371 -Node: Shell Operation10660 -Node: Quoting11954 -Node: Escape Character12979 -Node: Single Quotes13451 -Node: Double Quotes13780 -Node: ANSI-C Quoting14678 -Node: Locale Translation15547 -Node: Comments15968 -Node: Shell Commands16582 -Node: Simple Commands17093 -Node: Pipelines17652 -Node: Lists19179 -Node: Looping Constructs20634 -Node: Conditional Constructs22239 -Node: Command Grouping28177 -Node: Shell Functions29554 -Node: Shell Parameters31518 -Node: Positional Parameters32844 -Node: Special Parameters33593 -Node: Shell Expansions36214 -Node: Brace Expansion38137 -Node: Tilde Expansion39698 -Node: Shell Parameter Expansion42030 -Node: Command Substitution48426 -Node: Arithmetic Expansion49700 -Node: Process Substitution50545 -Node: Word Splitting51439 -Node: Filename Expansion52891 -Node: Pattern Matching54855 -Node: Quote Removal57244 -Node: Redirections57530 -Node: Executing Commands63600 -Node: Simple Command Expansion64267 -Node: Command Search and Execution66190 -Node: Command Execution Environment68193 -Node: Environment70647 -Node: Exit Status72304 -Node: Signals73501 -Node: Shell Scripts75396 -Node: Bourne Shell Features77432 -Node: Bourne Shell Builtins78162 -Node: Bourne Shell Variables92273 -Node: Other Bourne Shell Features93978 -Node: Major Differences From The Bourne Shell94721 -Node: Bash Features106910 -Node: Invoking Bash108013 -Node: Bash Startup Files112198 -Node: Is This Shell Interactive?116342 -Node: Bash Builtins117313 -Node: The Set Builtin138717 -Node: Bash Conditional Expressions145533 -Node: Bash Variables148666 -Node: Shell Arithmetic161096 -Node: Aliases163144 -Node: Alias Builtins165719 -Node: Arrays166335 -Node: The Directory Stack169356 -Node: Printing a Prompt172706 -Node: The Restricted Shell174369 -Node: Bash POSIX Mode175730 -Node: Job Control179891 -Node: Job Control Basics180357 -Node: Job Control Builtins184556 -Node: Job Control Variables188848 -Node: Using History Interactively189998 -Node: Bash History Facilities190677 -Node: Bash History Builtins193018 -Node: History Interaction196386 -Node: Event Designators198938 -Node: Word Designators199865 -Node: Modifiers201114 -Node: Command Line Editing202431 -Node: Introduction and Notation203091 -Node: Readline Interaction204129 -Node: Readline Bare Essentials205321 -Node: Readline Movement Commands206861 -Node: Readline Killing Commands207826 -Node: Readline Arguments209541 -Node: Searching210515 -Node: Readline Init File212263 -Node: Readline Init File Syntax213302 -Node: Conditional Init Constructs222508 -Node: Sample Init File224946 -Node: Bindable Readline Commands228115 -Node: Commands For Moving228865 -Node: Commands For History229712 -Node: Commands For Text232541 -Node: Commands For Killing234508 -Node: Numeric Arguments236657 -Node: Commands For Completion237783 -Node: Keyboard Macros241615 -Node: Miscellaneous Commands242173 -Node: Readline vi Mode246493 -Node: Installing Bash247371 -Node: Basic Installation248448 -Node: Compilers and Options251358 -Node: Compiling For Multiple Architectures252092 -Node: Installation Names253749 -Node: Specifying the System Type254474 -Node: Sharing Defaults255178 -Node: Operation Controls255843 -Node: Optional Features256748 -Node: Reporting Bugs263158 -Node: Builtin Index264229 -Node: Reserved Word Index267632 -Node: Variable Index269090 -Node: Function Index274363 -Node: Concept Index278853 +Node: Top1185 +Node: Introduction3316 +Node: What is Bash?3541 +Node: What is a shell?4642 +Node: Definitions6876 +Node: Basic Shell Features9542 +Node: Shell Syntax10766 +Node: Shell Operation11790 +Node: Quoting13085 +Node: Escape Character14345 +Node: Single Quotes14817 +Node: Double Quotes15152 +Node: ANSI-C Quoting16055 +Node: Locale Translation16957 +Node: Comments17378 +Node: Shell Commands17984 +Node: Simple Commands18865 +Node: Pipelines19488 +Node: Lists21015 +Node: Looping Constructs22529 +Node: Conditional Constructs24976 +Node: Command Grouping30918 +Node: Shell Functions32295 +Node: Shell Parameters34833 +Node: Positional Parameters36159 +Node: Special Parameters37052 +Node: Shell Expansions39711 +Node: Brace Expansion41635 +Node: Tilde Expansion43305 +Node: Shell Parameter Expansion45637 +Node: Command Substitution52439 +Node: Arithmetic Expansion53761 +Node: Process Substitution54606 +Node: Word Splitting55643 +Node: Filename Expansion57095 +Node: Pattern Matching59055 +Node: Quote Removal61450 +Node: Redirections61736 +Node: Executing Commands68607 +Node: Simple Command Expansion69274 +Node: Command Search and Execution71197 +Node: Command Execution Environment73194 +Node: Environment75648 +Node: Exit Status77300 +Node: Signals78497 +Node: Shell Scripts80392 +Node: Shell Builtin Commands82776 +Node: Bourne Shell Builtins84211 +Node: Bash Builtins99107 +Node: The Set Builtin123146 +Node: Special Builtins129959 +Node: Shell Variables130931 +Node: Bourne Shell Variables131367 +Node: Bash Variables133147 +Node: Bash Features147888 +Node: Invoking Bash148770 +Node: Bash Startup Files153441 +Node: Interactive Shells158148 +Node: What is an Interactive Shell?158550 +Node: Is this Shell Interactive?159185 +Node: Interactive Shell Behavior159991 +Node: Bash Conditional Expressions163279 +Node: Shell Arithmetic166574 +Node: Aliases169005 +Node: Arrays171510 +Node: The Directory Stack174530 +Node: Directory Stack Builtins175236 +Node: Printing a Prompt178114 +Node: The Restricted Shell180486 +Node: Bash POSIX Mode181964 +Node: Job Control186258 +Node: Job Control Basics186724 +Node: Job Control Builtins190939 +Node: Job Control Variables195234 +Node: Command Line Editing196384 +Node: Introduction and Notation197382 +Node: Readline Interaction198999 +Node: Readline Bare Essentials200191 +Node: Readline Movement Commands201971 +Node: Readline Killing Commands202927 +Node: Readline Arguments204832 +Node: Searching205806 +Node: Readline Init File207685 +Node: Readline Init File Syntax208739 +Node: Conditional Init Constructs218285 +Node: Sample Init File220723 +Node: Bindable Readline Commands223892 +Node: Commands For Moving225085 +Node: Commands For History225933 +Node: Commands For Text228727 +Node: Commands For Killing230678 +Node: Numeric Arguments232644 +Node: Commands For Completion233770 +Node: Keyboard Macros237602 +Node: Miscellaneous Commands238160 +Node: Readline vi Mode242534 +Node: Programmable Completion243444 +Node: Programmable Completion Builtins248120 +Node: Using History Interactively254226 +Node: Bash History Facilities254905 +Node: Bash History Builtins257466 +Node: History Interaction261038 +Node: Event Designators263590 +Node: Word Designators264517 +Node: Modifiers266146 +Node: Installing Bash267463 +Node: Basic Installation268605 +Node: Compilers and Options271723 +Node: Compiling For Multiple Architectures272457 +Node: Installation Names274114 +Node: Specifying the System Type274837 +Node: Sharing Defaults275544 +Node: Operation Controls276209 +Node: Optional Features277160 +Node: Reporting Bugs284581 +Node: Major Differences From The Bourne Shell285678 +Node: Builtin Index299726 +Node: Reserved Word Index303317 +Node: Variable Index304793 +Node: Function Index310465 +Node: Concept Index314955 End Tag Table diff --git a/doc/bashref.texi b/doc/bashref.texi index 4274005..10b8027 100644 --- a/doc/bashref.texi +++ b/doc/bashref.texi @@ -5,13 +5,13 @@ @c %**end of header @ignore -Last Change: Wed Jan 20 16:46:26 EST 1999 +Last Change: Tue Mar 14 11:38:10 EST 2000 @end ignore -@set EDITION 2.3 -@set VERSION 2.03 -@set UPDATED 20 January 1999 -@set UPDATE-MONTH January 1999 +@set EDITION 2.4 +@set VERSION 2.04 +@set UPDATED 14 March 2000 +@set UPDATE-MONTH March 2000 @iftex @finalout @@ -122,8 +122,9 @@ reference on shell behavior. * Basic Shell Features:: The shell "building blocks". -* Bourne Shell Features:: Features similar to those found in the - Bourne shell. +* Shell Builtin Commands:: Commands that are a part of the shell. + +* Shell Variables:: Variables used or set by Bash. * Bash Features:: Features found only in Bash. @@ -140,6 +141,10 @@ reference on shell behavior. * Reporting Bugs:: How to report bugs in Bash. +* Major Differences From The Bourne Shell:: A terse list of the differences + between Bash and historical + versions of /bin/sh. + * Builtin Index:: Index of Bash builtin commands. * Reserved Word Index:: Index of Bash reserved words. @@ -166,55 +171,61 @@ reference on shell behavior. @section What is Bash? Bash is the shell, or command language interpreter, -that will appear in the @sc{GNU} operating system. +for the @sc{gnu} operating system. The name is an acronym for the @samp{Bourne-Again SHell}, -a pun on Steve Bourne, the author of the direct ancestor of the current -Unix shell @code{/bin/sh}, +a pun on Stephen Bourne, the author of the direct ancestor of +the current Unix shell @code{/bin/sh}, which appeared in the Seventh Edition Bell Labs Research version of Unix. -Bash is an @code{sh}-compatible shell that incorporates useful +Bash is largely compatible with @code{sh} and incorporates useful features from the Korn shell @code{ksh} and the C shell @code{csh}. -It is intended to be a conformant implementation of the @sc{IEEE} -@sc{POSIX} Shell and Tools specification (@sc{IEEE} Working Group 1003.2). +It is intended to be a conformant implementation of the @sc{ieee} +@sc{posix} Shell and Tools specification (@sc{ieee} Working Group 1003.2). It offers functional improvements over @code{sh} for both interactive and programming use. -While the @sc{GNU} operating system will include a version -of @code{csh}, Bash will be the default shell. -Like other @sc{GNU} software, Bash is quite portable. It currently runs +While the @sc{gnu} operating system provides other shells, including +a version of @code{csh}, Bash is the default shell. +Like other @sc{gnu} software, Bash is quite portable. It currently runs on nearly every version of Unix and a few other operating systems @minus{} -independently-supported ports exist for @sc{MS-DOS}, @sc{OS/2}, -Windows @sc{95}, and Windows @sc{NT}. +independently-supported ports exist for @sc{ms-dos}, @sc{os/2}, +Windows @sc{95/98}, and Windows @sc{nt}. @node What is a shell? @section What is a shell? At its base, a shell is simply a macro processor that executes commands. A Unix shell is both a command interpreter, which -provides the user interface to the rich set of Unix utilities, +provides the user interface to the rich set of @sc{gnu} utilities, and a programming language, allowing these utilitites to be combined. Files containing commands can be created, and become commands themselves. These new commands have the same status as -system commands in directories like @file{/bin}, allowing users +system commands in directories such as @file{/bin}, allowing users or groups to establish custom environments. -A shell allows execution of Unix commands, both synchronously and +A shell allows execution of @sc{gnu} commands, both synchronously and asynchronously. The shell waits for synchronous commands to complete before accepting more input; asynchronous commands continue to execute in parallel with the shell while it reads and executes additional commands. The @dfn{redirection} constructs permit -fine-grained control of the input and output of those commands, -and the shell allows control over the contents of their -environment. Unix shells also provide a small set of built-in +fine-grained control of the input and output of those commands. +Moreover, the shell allows control over the contents of commands' +environments. +Shells may be used interactively or non-interactively: they accept +input typed from the keyboard or from a file. + +Shells also provide a small set of built-in commands (@dfn{builtins}) implementing functionality impossible -(e.g., @code{cd}, @code{break}, @code{continue}, and -@code{exec}), or inconvenient (@code{history}, @code{getopts}, -@code{kill}, or @code{pwd}, for example) to obtain via separate -utilities. Shells may be used interactively or -non-interactively: they accept input typed from the keyboard or -from a file. All of the shell builtins are described in +or inconvenient to obtain via separate utilities. +For example, @code{cd}, @code{break}, @code{continue}, and +@code{exec}) cannot be implemented outside of the shell because +they directly manipulate the shell itself. +The @code{history}, @code{getopts}, @code{kill}, or @code{pwd} +builtins, among others, could be implemented in separate utilities, +but they are more convenient to use as builtin commands. +All of the shell builtins are described in subsequent sections. While executing commands is essential, most of the power (and @@ -222,7 +233,7 @@ complexity) of shells is due to their embedded programming languages. Like any high-level language, the shell provides variables, flow control constructs, quoting, and functions. -Shells have begun offering features geared specifically for +Shells offer features geared specifically for interactive use rather than to augment the programming language. These interactive features include job control, command line editing, history and aliases. Each of these features is @@ -237,7 +248,7 @@ These definitions are used throughout the remainder of this manual. @item POSIX @cindex POSIX A family of open system standards based on Unix. Bash -is concerned with @sc{POSIX} 1003.2, the Shell and Tools Standard. +is concerned with @sc{posix} 1003.2, the Shell and Tools Standard. @item blank A space or tab character. @@ -301,7 +312,7 @@ A @code{control operator} or a @code{redirection operator}. @item process group @cindex process group A collection of related processes each having the same process -group @sc{ID}. +group @sc{id}. @item process group ID @cindex process group ID @@ -320,13 +331,13 @@ A synonym for @code{exit status}. @item signal @cindex signal -A mechanism by which a process may be notified by the kernal +A mechanism by which a process may be notified by the kernel of an event occurring in the system. @item special builtin @cindex special builtin A shell builtin command that has been classified as special by the -@sc{POSIX.2} standard. +@sc{posix} 1003.2 standard. @item token @cindex token @@ -346,7 +357,7 @@ Bash is an acronym for @samp{Bourne-Again SHell}. The Bourne shell is the traditional Unix shell originally written by Stephen Bourne. All of the Bourne shell builtin commands are available in Bash, -and the rules for evaluation and quoting are taken from the @sc{POSIX} +and the rules for evaluation and quoting are taken from the @sc{posix} 1003.2 specification for the `standard' Unix shell. This chapter briefly summarizes the shell's `building blocks': @@ -377,6 +388,21 @@ and to named files, and how the shell executes commands. * Comments:: How to specify comments. @end menu +When the shell reads input, it proceeds through a +sequence of operations. If the input indicates the beginning of a +comment, the shell ignores the comment symbol (@samp{#}), and the rest +of that line. + +Otherwise, roughly speaking, the shell reads its input and +divides the input into words and operators, employing the quoting rules +to select which meanings to assign various words and characters. + +The shell then parses these tokens into commands and other constructs, +removes the special meaning of certain words or characters, expands +others, redirects input and output as needed, executes the specified +command, waits for the command's exit status, and makes that exit status +available for further inspection or processing. + @node Shell Operation @subsection Shell Operation @@ -441,7 +467,12 @@ parameter expansion. Each of the shell metacharacters (@pxref{Definitions}) has special meaning to the shell and must be quoted if it is to -represent itself. There are three quoting mechanisms: the +represent itself. +When the command history expansion facilities are being used, the +@var{history expansion} character, usually @samp{!}, must be quoted +to prevent history expansion. @xref{Bash History Facilities} for +more details concerning history expansion. +There are three quoting mechanisms: the @var{escape character}, single quotes, and double quotes. @node Escape Character @@ -456,14 +487,14 @@ the input stream and effectively ignored). @node Single Quotes @subsubsection Single Quotes -Enclosing characters in single quotes preserves the literal value +Enclosing characters in single quotes (@samp{'}) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash. @node Double Quotes @subsubsection Double Quotes -Enclosing characters in double quotes preserves the literal value +Enclosing characters in double quotes (@samp{"}) preserves the literal value of all characters within the quotes, with the exception of @samp{$}, @samp{`}, and @samp{\}. The characters @samp{$} and @samp{`} @@ -508,6 +539,8 @@ horizontal tab vertical tab @item \\ backslash +@item \' +single quote @item \@var{nnn} the character whose @code{ASCII} code is the octal value @var{nnn} (one to three digits) @@ -517,7 +550,8 @@ the character whose @code{ASCII} code is the hexadecimal value @var{nnn} @end table @noindent -The result is single-quoted, as if the dollar sign had not been present. +The expanded result is single-quoted, as if the dollar sign had not +been present. @node Locale Translation @subsubsection Locale-Specific Translation @@ -542,12 +576,21 @@ causes that word and all remaining characters on that line to be ignored. An interactive shell without the @code{interactive_comments} option enabled does not allow comments. The @code{interactive_comments} option is on by default in interactive shells. -@xref{Is This Shell Interactive?}, for a description of what makes +@xref{Interactive Shells}, for a description of what makes a shell interactive. @node Shell Commands @section Shell Commands @cindex commands, shell + +A simple shell command such as @code{echo a b c} consists of the command +itself followed by arguments, separated by spaces. + +More complex shell commands are composed of simple commands arranged together +in a variety of ways: in a pipeline in which the output of one command +becomes the input of a second, in a loop or conditional construct, or in +some other grouping. + @menu * Simple Commands:: The most common type of command. * Pipelines:: Connecting the input and output of several @@ -565,12 +608,13 @@ a shell interactive. A simple command is the kind of command encountered most often. It's just a sequence of words separated by @code{blank}s, terminated by one of the shell's control operators (@pxref{Definitions}). The -first word generally specifies a command to be executed. +first word generally specifies a command to be executed, with the +rest of the words being that command's arguments. The return status (@pxref{Exit Status}) of a simple command is its exit status as provided -by the @sc{POSIX.1} @code{waitpid} function, or 128+@var{n} if the command -was terminated by signal @var{n}. +by the @sc{posix} 1003.1 @code{waitpid} function, or 128+@var{n} if +the command was terminated by signal @var{n}. @node Pipelines @subsection Pipelines @@ -598,7 +642,7 @@ to be printed for the pipeline once it finishes. The statistics currently consist of elapsed (wall-clock) time and user and system time consumed by the command's execution. The @samp{-p} option changes the output format to that specified -by @sc{POSIX}. +by @sc{posix}. The @code{TIMEFORMAT} variable may be set to a format string that specifies how the timing information should be displayed. @xref{Bash Variables}, for a description of the available formats. @@ -633,7 +677,8 @@ the shell executes the command asynchronously in a subshell. This is known as executing the command in the @var{background}. The shell does not wait for the command to finish, and the return status is 0 (true). -The standard input for asynchronous commands, in the absence of any +When job control is not active (@pxref{Job Control}), +the standard input for asynchronous commands, in the absence of any explicit redirections, is redirected from @code{/dev/null}. Commands separated by a @samp{;} are executed sequentially; the shell @@ -641,27 +686,27 @@ waits for each command to terminate in turn. The return status is the exit status of the last command executed. The control operators @samp{&&} and @samp{||} -denote @sc{AND} lists and @sc{OR} lists, respectively. -An @sc{AND} list has the form +denote @sc{and} lists and @sc{or} lists, respectively. +An @sc{and} list has the form @example -@var{command} && @var{command2} +@var{command1} && @var{command2} @end example @noindent -@var{command2} is executed if, and only if, @var{command} +@var{command2} is executed if, and only if, @var{command1} returns an exit status of zero. -An @sc{OR} list has the form +An @sc{or} list has the form @example -@var{command} || @var{command2} +@var{command1} || @var{command2} @end example @noindent -@var{command2} is executed if, and only if, @var{command} +@var{command2} is executed if, and only if, @var{command1} returns a non-zero exit status. The return status of -@sc{AND} and @sc{OR} lists is the exit status of the last command +@sc{and} and @sc{or} lists is the exit status of the last command executed in the list. @node Looping Constructs @@ -670,7 +715,7 @@ executed in the list. Bash supports the following looping constructs. -Note that wherever you see a @samp{;} in the description of a +Note that wherever a @samp{;} appears in the description of a command's syntax, it may be replaced with one or more newlines. @table @code @@ -708,10 +753,29 @@ for @var{name} [in @var{words} @dots{}]; do @var{commands}; done @end example Expand @var{words}, and execute @var{commands} once for each member in the resultant list, with @var{name} bound to the current member. -If @samp{in @var{words}} is not present, @samp{in "$@@"} is assumed. +If @samp{in @var{words}} is not present, the @code{for} command +executes the @var{commands} once for each positional parameter that is +set, as if @samp{in "$@@"} had been specified +(@pxref{Special Parameters}). The return status is the exit status of the last command that executes. If there are no items in the expansion of @var{words}, no commands are executed, and the return status is zero. + +An alternate form of the @code{for} command is also supported: + +@example +for (( @var{expr1} ; @var{expr2} ; @var{expr3} )) ; do @var{commands} ; done +@end example +First, the arithmetic expression @var{expr1} is evaluated according +to the rules described below (@pxref{Shell Arithmetic}). +The arithmetic expression @var{expr2} is then evaluated repeatedly +until it evaluates to zero. +Each time @var{expr2} evaluates to a non-zero value, @var{commands} are +executed and the arithmetic expression @var{expr3} is evaluated. +If any expression is omitted, it behaves as if it evaluates to 1. +The return value is the exit status of the last command in @var{list} +that is executed, or false if any of the expressions is invalid. + @end table The @code{break} and @code{continue} builtins (@pxref{Bourne Shell Builtins}) @@ -892,7 +956,7 @@ True if both @var{expression1} and @var{expression2} are true. True if either @var{expression1} or @var{expression2} is true. @end table @noindent -The && and || commands do not execute @var{expression2} if the +The @code{&&} and @code{||} commands do not execute @var{expression2} if the value of @var{expression1} is sufficient to determine the return value of the entire conditional expression. @@ -947,7 +1011,10 @@ The exit status of both of these constructs is the exit status of Shell functions are a way to group commands for later execution using a single name for the group. They are executed just like -a "regular" command. Shell functions are executed in the current +a "regular" command. +When the name of a shell function is used as a simple command name, +the list of commands associated with that function name is executed. +Shell functions are executed in the current shell context; no new process is created to interpret them. Functions are declared using this syntax: @@ -965,12 +1032,22 @@ This list is executed whenever @var{name} is specified as the name of a command. The exit status of a function is the exit status of the last command executed in the body. +Note that for historical reasons, the curly braces that surround +the body of the function must be separated from the body by +@code{blank}s or newlines. +This is because the braces are reserved words and are only recognized +as such when they are separated by whitespace. +Also, the @var{command-list} must be terminated with a semicolon +or a newline. + When a function is executed, the arguments to the function become the positional parameters during its execution (@pxref{Positional Parameters}). The special parameter @samp{#} that expands to the number of positional parameters is updated to reflect the change. Positional parameter @code{0} is unchanged. +The @code{FUNCNAME} variable is set to the name of the function +while the function is executing. If the builtin command @code{return} is executed in a function, the function completes and @@ -1037,9 +1114,12 @@ A @var{positional parameter} is a parameter denoted by one or more digits, other than the single digit @code{0}. Positional parameters are assigned from the shell's arguments when it is invoked, and may be reassigned using the @code{set} builtin command. -Positional parameter @code{N} may be referenced as @code{$@{N@}}. -Positional parameters may not be assigned to -with assignment statements. The positional parameters are +Positional parameter @code{N} may be referenced as @code{$@{N@}}, or +as @code{$N} when @code{N} consists of a single digit. +Positional parameters may not be assigned to with assignment statements. +The @code{set} and @code{shift} builtins are used to set and +unset them (@pxref{Shell Builtin Commands}). +The positional parameters are temporarily replaced when a shell function is executed (@pxref{Shell Functions}). @@ -1086,17 +1166,17 @@ Expands to the exit status of the most recently executed foreground pipeline. @item - -Expands to the current option flags as specified upon invocation, -by the @code{set} +(A hyphen.) Expands to the current option flags as specified upon +invocation, by the @code{set} builtin command, or those set by the shell itself (such as the @samp{-i} option). @item $ -Expands to the process @sc{ID} of the shell. In a @code{()} subshell, it -expands to the process @sc{ID} of the invoking shell, not the subshell. +Expands to the process @sc{id} of the shell. In a @code{()} subshell, it +expands to the process @sc{id} of the invoking shell, not the subshell. @item ! -Expands to the process @sc{ID} of the most recently executed background +Expands to the process @sc{id} of the most recently executed background (asynchronous) command. @item 0 @@ -1109,6 +1189,7 @@ executed, if one is present. Otherwise, it is set to the filename used to invoke Bash, as given by argument zero. @item _ +(An underscore.) At shell startup, set to the absolute filename of the shell or shell script being executed as passed in the argument list. Subsequently, expands to the last argument to the previous command, @@ -1175,21 +1256,20 @@ is performed. @cindex brace expansion @cindex expansion, brace -Brace expansion -is a mechanism by which arbitrary strings -may be generated. This mechanism is similar to +Brace expansion is a mechanism by which arbitrary strings may be generated. +This mechanism is similar to @var{filename expansion} (@pxref{Filename Expansion}), -but the file names generated -need not exist. Patterns to be brace expanded take -the form of an optional @var{preamble}, -followed by a series of comma-separated strings -between a pair of braces, followed by an optional @var{postscript}. -The preamble is prepended to each string contained -within the braces, and the postscript is then appended -to each resulting string, expanding left to right. - -Brace expansions may be nested. The results of each expanded -string are not sorted; left to right order is preserved. +but the file names generated need not exist. +Patterns to be brace expanded take the form of an optional @var{preamble}, +followed by a series of comma-separated strings between a pair of braces, +followed by an optional @var{postscript}. +The preamble is prefixed to each string contained within the braces, and +the postscript is then appended to each resulting string, expanding left +to right. + +Brace expansions may be nested. +The results of each expanded string are not sorted; left to right order +is preserved. For example, @example bash$ echo a@{d,c,b@}e @@ -1201,6 +1281,8 @@ and any characters special to other expansions are preserved in the result. It is strictly textual. Bash does not apply any syntactic interpretation to the context of the expansion or the text between the braces. +To avoid conflicts with parameter expansion, the string @samp{$@{} +is not considered eligible for brace expansion. A correctly-formed brace expansion must contain unquoted opening and closing braces, and at least one unquoted comma. @@ -1320,12 +1402,17 @@ Bash uses the value of the variable formed from the rest of expanded and that value is used in the rest of the substitution, rather than the value of @var{parameter} itself. This is known as @code{indirect expansion}. +The exception to this is the expansion of $@{!@var{prefix*@}} +described below. In each of the cases below, @var{word} is subject to tilde expansion, parameter expansion, command substitution, and arithmetic expansion. + When not performing substring expansion, Bash tests for a parameter that is unset or null; omitting the colon results in a test only for a -parameter that is unset. +parameter that is unset. Put another way, if the colon is included, +the operator tests for both existence and that the value is not null; +if the colon is omitted, the operator tests only for existence. @table @code @@ -1357,10 +1444,10 @@ is null or unset, nothing is substituted, otherwise the expansion of @item $@{@var{parameter}:@var{offset}@} @itemx $@{@var{parameter}:@var{offset}:@var{length}@} -Expands to up to @var{length} characters of @var{parameter}, +Expands to up to @var{length} characters of @var{parameter} starting at the character specified by @var{offset}. If @var{length} is omitted, expands to the substring of -@var{parameter}, starting at the character specified by @var{offset}. +@var{parameter} starting at the character specified by @var{offset}. @var{length} and @var{offset} are arithmetic expressions (@pxref{Shell Arithmetic}). This is referred to as Substring Expansion. @@ -1376,6 +1463,10 @@ members of the array beginning with @code{$@{@var{parameter}[@var{offset}]@}}. Substring indexing is zero-based unless the positional parameters are used, in which case the indexing starts at 1. +@item $@{!@var{prefix}*@} +Expands to the names of variables whose names begin with @var{prefix}, +separated by the first character of the @code{IFS} special variable. + @item $@{#@var{parameter}@} The length in characters of the expanded value of @var{parameter} is substituted. @@ -1448,7 +1539,8 @@ array in turn, and the expansion is the resultant list. @cindex command substitution Command substitution allows the output of a command to replace -the command name. There are two forms: +the command itself. +Command substitution occurs when a command is enclosed as follows: @example $(@var{command}) @end example @@ -1509,7 +1601,7 @@ failure to the standard error and no substitution occurs. @cindex process substitution Process substitution is supported on systems that support named -pipes (@sc{FIFO}s) or the @file{/dev/fd} method of naming open files. +pipes (@sc{fifo}s) or the @file{/dev/fd} method of naming open files. It takes the form of @example <(@var{list}) @@ -1521,12 +1613,15 @@ or @end example @noindent The process @var{list} is run with its input or output connected to a -@sc{FIFO} or some file in @file{/dev/fd}. The name of this file is +@sc{fifo} or some file in @file{/dev/fd}. The name of this file is passed as an argument to the current command as the result of the expansion. If the @code{>(@var{list})} form is used, writing to the file will provide input for @var{list}. If the @code{<(@var{list})} form is used, the file passed as an argument should be read to obtain the output of @var{list}. +Note that no space may appear between the @code{<} or @code{>} +and the left parenthesis, otherwise the construct would be interpreted +as a redirection. When available, process substitution is performed simultaneously with parameter and variable expansion, command substitution, and arithmetic @@ -1559,8 +1654,7 @@ If the value of @code{IFS} is null, no word splitting occurs. Explicit null arguments (@code{""} or @code{''}) are retained. Unquoted implicit null arguments, resulting from the expansion of -@var{parameter}s -that have no values, are removed. +parameters that have no values, are removed. If a parameter with no value is expanded within double quotes, a null argument results and is retained. @@ -1579,7 +1673,7 @@ is performed. After word splitting, unless the @samp{-f} option has been set (@pxref{The Set Builtin}), Bash scans each word for the characters -@samp{*}, @samp{?}, @samp{(}, and @samp{[}. +@samp{*}, @samp{?}, and @samp{[}. If one of these characters appears, then the word is regarded as a @var{pattern}, and replaced with an alphabetically sorted list of @@ -1624,7 +1718,7 @@ is unset. @cindex matching, pattern Any character that appears in a pattern, other than the special pattern -characters described below, matches itself. The NUL character may not +characters described below, matches itself. The @sc{nul} character may not occur in a pattern. The special pattern characters must be quoted if they are to be matched literally. @@ -1648,7 +1742,7 @@ character in the set. Within @samp{[} and @samp{]}, @var{character classes} can be specified using the syntax @code{[:}@var{class}@code{:]}, where @var{class} is one of the -following classes defined in the @sc{POSIX.2} standard: +following classes defined in the @sc{posix} 1003.2 standard: @example alnum alpha ascii blank cntrl digit graph lower print punct space upper xdigit @@ -1720,7 +1814,7 @@ descriptor 1). The word following the redirection operator in the following descriptions, unless otherwise noted, is subjected to brace expansion, tilde expansion, parameter expansion, command substitution, arithmetic -expansion, quote removal, and filename expansion. +expansion, quote removal, filename expansion, and word splitting. If it expands to more than one word, Bash reports an error. Note that the order of redirections is significant. For example, @@ -1729,8 +1823,8 @@ the command ls > @var{dirlist} 2>&1 @end example @noindent -directs both standard output and standard error to the file -@var{dirlist}, while the command +directs both standard output (file descriptor 1) and standard error +(file descriptor 2) to the file @var{dirlist}, while the command @example ls 2>&1 > @var{dirlist} @end example @@ -1739,6 +1833,34 @@ directs only the standard output to file @var{dirlist}, because the standard error was duplicated as standard output before the standard output was redirected to @var{dirlist}. +Bash handles several filenames specially when they are used in +redirections, as described in the following table: + +@table @code +@item /dev/fd/@var{fd} +If @var{fd} is a valid integer, file descriptor @var{fd} is duplicated. + +@item /dev/stdin +File descriptor 0 is duplicated. + +@item /dev/stdout +File descriptor 1 is duplicated. + +@item /dev/stderr +File descriptor 2 is duplicated. + +@item /dev/tcp/@var{host}/@var{port} +If @var{host} is a valid hostname or Internet address, and @var{port} +is an integer port number, Bash attempts to open a TCP connection +to the corresponding socket. + +@item /dev/udp/@var{host}/@var{port} +If @var{host} is a valid hostname or Internet address, and @var{port} +is an integer port number, Bash attempts to open a UDP connection +to the corresponding socket. + +@end table + A failure to open or create a file causes the redirection to fail. @subsection Redirecting Input @@ -1768,7 +1890,7 @@ The general format for redirecting output is: If the redirection operator is @samp{>}, and the @code{noclobber} option to the @code{set} builtin has been enabled, the redirection -will fail if the filename whose name results from the expansion of +will fail if the file whose name results from the expansion of @var{word} exists and is a regular file. If the redirection operator is @samp{>|}, or the redirection operator is @samp{>} and the @code{noclobber} option is not enabled, the redirection @@ -1825,15 +1947,15 @@ The format of here-documents is as follows: @var{delimiter} @end example -No parameter expansion, command substitution, filename -expansion, or arithmetic expansion is performed on +No parameter expansion, command substitution, arithmetic expansion, +or filename expansion is performed on @var{word}. If any characters in @var{word} are quoted, the @var{delimiter} is the result of quote removal on @var{word}, and the lines in the here-document are not expanded. If @var{word} is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion. In the latter -case, the pair @code{\newline} is ignored, and @samp{\} +case, the character sequence @code{\newline} is ignored, and @samp{\} must be used to quote the characters @samp{\}, @samp{$}, and @samp{`}. @@ -1965,7 +2087,7 @@ actions are taken. @item If the command name contains no slashes, the shell attempts to locate it. If there exists a shell function by that name, that -function is invoked as described above in @ref{Shell Functions}. +function is invoked as described in @ref{Shell Functions}. @item If the name does not match a function, the shell searches for @@ -2045,7 +2167,7 @@ options enabled by @code{shopt} shell aliases defined with @code{alias} (@pxref{Aliases}) @item -various process IDs, including those of background jobs +various process @sc{id}s, including those of background jobs (@pxref{Lists}), the value of @code{$$}, and the value of @code{$PPID} @@ -2097,8 +2219,8 @@ When a program is invoked it is given an array of strings called the @var{environment}. This is a list of name-value pairs, of the form @code{name=value}. -Bash allows you to manipulate the environment in several -ways. On invocation, the shell scans its own environment and +Bash provides several ways to manipulate the environment. +On invocation, the shell scans its own environment and creates a parameter for each name found, automatically marking it for @var{export} to child processes. Executed commands inherit the environment. @@ -2137,8 +2259,8 @@ A non-zero exit status indicates failure. This seemingly counter-intuitive scheme is used so there is one well-defined way to indicate success and a variety of ways to indicate various failure modes. -When a command terminates on a fatal signal whose number is @var{n}, -Bash uses the value 128+@var{n} as the exit status. +When a command terminates on a fatal signal whose number is @var{N}, +Bash uses the value 128+@var{N} as the exit status. If a command is not found, the child process created to execute it returns a status of 127. If a command is found @@ -2238,10 +2360,14 @@ exception that the locations of commands remembered by the parent (see the description of @code{hash} in @ref{Bourne Shell Builtins}) are retained by the child. -Most versions of Unix make this a part of the kernel's command +Most versions of Unix make this a part of the operating system's command execution mechanism. If the first line of a script begins with the two characters @samp{#!}, the remainder of the line specifies -an interpreter for the program. The arguments to the interpreter +an interpreter for the program. +Thus, you can specify Bash, @code{awk}, Perl, or some other +interpreter and write the rest of the script file in that language. + +The arguments to the interpreter consist of a single optional argument following the interpreter name on the first line of the script file, followed by the name of the script file, followed by the rest of the arguments. Bash @@ -2249,32 +2375,52 @@ will perform this action on operating systems that do not handle it themselves. Note that some older versions of Unix limit the interpreter name and argument to a maximum of 32 characters. -@node Bourne Shell Features -@chapter Bourne Shell Style Features +Bash scripts often begin with @code{#! /bin/bash} (assuming that +Bash has been installed in @file{/bin}), since this ensures that +Bash will be used to interpret the script, even if it is executed +under another shell. + +@node Shell Builtin Commands +@chapter Shell Builtin Commands @menu * Bourne Shell Builtins:: Builtin commands inherited from the Bourne Shell. -* Bourne Shell Variables:: Variables which Bash uses in the same way - as the Bourne Shell. -* Other Bourne Shell Features:: Addtional aspects of Bash which behave in - the same way as the Bourne Shell. +* Bash Builtins:: Table of builtins specific to Bash. +* The Set Builtin:: This builtin is so overloaded it + deserves its own section. +* Special Builtins:: Builtin commands classified specially by + POSIX.2. @end menu -This section briefly summarizes things which Bash inherits from -the Bourne Shell: builtins, variables, and other features. -It also lists the significant differences between Bash and the Bourne Shell. -Many of the builtins have been extended by @sc{POSIX} or Bash. +Builtin commands are contained within the shell itself. +When the name of a builtin command is used as the first word of +a simple command (@pxref{Simple Commands}), the shell executes +the command directly, without invoking another program. +Builtin commands are necessary to implement functionality impossible +or inconvenient to obtain with separate utilities. + +This section briefly the builtins which Bash inherits from +the Bourne Shell, as well as the builtin commands which are unique +to or have been extended in Bash. + +Several builtin commands are described in other chapters: builtin +commands which provide the Bash interface to the job control +facilities (@pxref{Job Control Builtins}), the directory stack +(@pxref{Directory Stack Builtins}), the command history +(@pxref{Bash History Builtins}), and the programmable completion +facilities (@pxref{Programmable Completion Builtins}). + +Many of the builtins have been extended by @sc{posix} or Bash. @node Bourne Shell Builtins @section Bourne Shell Builtins -The following shell builtin commands are inherited from the Bourne -Shell. These commands are implemented as specified by the @sc{POSIX} -1003.2 standard. +The following shell builtin commands are inherited from the Bourne Shell. +These commands are implemented as specified by the @sc{posix} 1003.2 standard. @table @code -@item : +@item : @r{(a colon)} @btindex : @example : [@var{arguments}] @@ -2282,14 +2428,14 @@ Shell. These commands are implemented as specified by the @sc{POSIX} Do nothing beyond expanding @var{arguments} and performing redirections. The return status is zero. -@item . +@item . @r{(a period)} @btindex . @example . @var{filename} [@var{arguments}] @end example Read and execute commands from the @var{filename} argument in the current shell context. If @var{filename} does not contain a slash, -the @code{$PATH} variable is used to find +the @code{PATH} variable is used to find @var{filename}. The current directory is searched if @var{filename} is not found in @code{$PATH}. If any @var{arguments} are supplied, they become the positional @@ -2298,6 +2444,7 @@ parameters are unchanged. The return status is the exit status of the last command executed, or zero if no commands are executed. If @var{filename} is not found, or cannot be read, the return status is non-zero. +This builtin is equivalent to @code{source}. @item break @btindex break @@ -2355,8 +2502,8 @@ exec [-cl] [-a @var{name}] [@var{command} [@var{arguments}]] @end example If @var{command} is supplied, it replaces the shell without creating a new process. -If the @samp{-l} option is supplied, the shell places a dash in the -zeroth arg passed to @var{command}. +If the @samp{-l} option is supplied, the shell places a dash at the +beginning of the zeroth arg passed to @var{command}. This is what the @code{login} program does. The @samp{-c} option causes @var{command} to be executed with an empty environment. @@ -2372,6 +2519,7 @@ return status is zero; otherwise the return status is non-zero. exit [@var{n}] @end example Exit the shell, returning a status of @var{n} to the shell's parent. +If @var{n} is omitted, the exit status is that of the last command executed. Any trap on @code{EXIT} is executed before the shell terminates. @item export @@ -2396,9 +2544,11 @@ with a name that is not a shell function. getopts @var{optstring} @var{name} [@var{args}] @end example @code{getopts} is used by shell scripts to parse positional parameters. -@var{optstring} contains the option letters to be recognized; if a letter -is followed by a colon, the option is expected to have an +@var{optstring} contains the option characters to be recognized; if a +character is followed by a colon, the option is expected to have an argument, which should be separated from it by white space. +The colon (@samp{:}) and question mark (@samp{?}) may not be +used as option characters. Each time it is invoked, @code{getopts} places the next option in the shell variable @var{name}, initializing @var{name} if it does not exist, @@ -2463,10 +2613,10 @@ option is supplied. @example pwd [-LP] @end example -Print the current working directory. -If the @samp{-P} option is supplied, the path printed will not +Print the absolute pathname of the current working directory. +If the @samp{-P} option is supplied, the pathname printed will not contain symbolic links. -If the @samp{-L} option is supplied, the path printed may contain +If the @samp{-L} option is supplied, the pathname printed may contain symbolic links. The return status is zero unless an error is encountered while determining the name of the current directory or an invalid option @@ -2496,12 +2646,14 @@ or the @samp{-f} option is supplied with a name that is not a shell function. return [@var{n}] @end example Cause a shell function to exit with the return value @var{n}. +If @var{n} is not supplied, the return value is the exit status of the +last command executed in the function. This may also be used to terminate execution of a script being executed -with the @code{.} builtin, returning either @var{n} or the exit status -of the last command executed within the script as the exit status of the -script. +with the @code{.} (or @code{source}) builtin, returning either @var{n} or +the exit status of the last command executed within the script as the exit +status of the script. The return status is false if @code{return} is used outside a function -and not during the execution of a script by @samp{.}. +and not during the execution of a script by @code{.} or @code{source}. @item shift @btindex shift @@ -2515,6 +2667,7 @@ Parameters represented by the numbers @code{$#} to @var{n}+1 are unset. @var{n} must be a non-negative number less than or equal to @code{$#}. If @var{n} is zero or greater than @code{$#}, the positional parameters are not changed. +If @var{n} is not supplied, it is assumed to be 1. The return status is zero unless @var{n} is greater than @code{$#} or less than zero, non-zero otherwise. @@ -2527,6 +2680,9 @@ Each operator and operand must be a separate argument. Expressions are composed of the primaries described below in @ref{Bash Conditional Expressions}. +When the @code{[} form is used, the last argument to the command must +be a @code{]}. + Expressions may be combined using the following operators, listed in decreasing order of precedence. @@ -2608,8 +2764,9 @@ equal to @samp{-}, all specified signals are reset to the values they had when the shell was started. If @var{arg} is the null string, then the signal specified by each @var{sigspec} is ignored by the shell and commands it invokes. -If @var{arg} is @samp{-p}, the shell displays the trap commands -associated with each @var{sigspec}. If no arguments are supplied, or +If @var{arg} is not present and @samp{-p} has been supplied, +the shell displays the trap commands associated with each @var{sigspec}. +If no arguments are supplied, or only @samp{-p} is given, @code{trap} prints the list of commands associated with each signal number in a form that may be reused as shell input. @@ -2646,6 +2803,10 @@ is omitted, the output is in a form that may be reused as input. The return status is zero if the mode is successfully changed or if no @var{mode} argument is supplied, and non-zero otherwise. +Note that when the mode is interpreted as an octal number, each number +of the umask is subtracted from @code{7}. Thus, a umask of @code{022} +results in permissions of @code{755}. + @item unset @btindex unset @example @@ -2661,724 +2822,36 @@ The return status is zero unless a @var{name} does not exist or is readonly. @end table -@node Bourne Shell Variables -@section Bourne Shell Variables - -Bash uses certain shell variables in the same way as the Bourne shell. -In some cases, Bash assigns a default value to the variable. - -@vtable @code - -@item CDPATH -A colon-separated list of directories used as a search path for -the @code{cd} builtin command. - -@item HOME -The current user's home directory; the default for the @code{cd} builtin -command. -The value of this variable is also used by tilde expansion -(@pxref{Tilde Expansion}). - -@item IFS -A list of characters that separate fields; used when the shell splits -words as part of expansion. - -@item MAIL -If this parameter is set to a filename and the @code{MAILPATH} variable -is not set, Bash informs the user of the arrival of mail in -the specified file. - -@item MAILPATH -A colon-separated list of filenames which the shell periodically checks -for new mail. -Each list entry can specify the message that is printed when new mail -arrives in the mail file by separating the file name from the message with -a @samp{?}. -When used in the text of the message, @code{$_} expands to the name of -the current mail file. - -@item OPTARG -The value of the last option argument processed by the @code{getopts} builtin. - -@item OPTIND -The index of the last option argument processed by the @code{getopts} builtin. - -@item PATH -A colon-separated list of directories in which the shell looks for -commands. - -@item PS1 -The primary prompt string. The default value is @samp{\s-\v\$ }. - -@item PS2 -The secondary prompt string. The default value is @samp{> }. - -@end vtable - -@node Other Bourne Shell Features -@section Other Bourne Shell Features - -@menu -* Major Differences From The Bourne Shell:: Major differences between - Bash and the Bourne shell. -@end menu - -Bash implements essentially the same grammar, parameter and -variable expansion, redirection, and quoting as the Bourne Shell. -Bash uses the @sc{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 -subsequent sections. - -@node Major Differences From The Bourne Shell -@subsection Major Differences From The SVR4.2 Bourne Shell - -@itemize @bullet - -@item -Bash is @sc{POSIX}-conformant, even where the @sc{POSIX} specification -differs from traditional @code{sh} behavior. - -@item -Bash has multi-character invocation options (@pxref{Invoking Bash}). - -@item -Bash has command-line editing (@pxref{Command Line Editing}) and -the @code{bind} builtin. - -@item -Bash has command history (@pxref{Bash History Facilities}) and the -@code{history} and @code{fc} builtins to manipulate it. - -@item -Bash implements @code{csh}-like history expansion -(@pxref{History Interaction}). - -@item -Bash has one-dimensional array variables (@pxref{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. - -@item -The @code{$'@dots{}'} quoting syntax, which expands ANSI-C -backslash-escaped characters in the text between the single quotes, -is supported (@pxref{ANSI-C Quoting}). - -@item -Bash supports the @code{$"@dots{}"} quoting syntax to do -locale-specific translation of the characters between the double -quotes. The @samp{-D}, @samp{--dump-strings}, and @samp{--dump-po-strings} -invocation options list the translatable strings found in a script -(@pxref{Locale Translation}). - -@item -Bash implements the @code{!} keyword to negate the return value of -a pipeline (@pxref{Pipelines}). -Very useful when an @code{if} statement needs to act only if a test fails. - -@item -Bash has the @code{time} reserved word and command timing (@pxref{Pipelines}). -The display of the timing statistics may be controlled with the -@code{TIMEFORMAT} variable. - -@item -Bash includes the @code{select} compound command, which allows the -generation of simple menus (@pxref{Conditional Constructs}). - -@item -Bash includes the @code{[[} compound command, which makes conditional -testing part of the shell grammar (@pxref{Conditional Constructs}). - -@item -Bash includes brace expansion (@pxref{Brace Expansion}) and tilde -expansion (@pxref{Tilde Expansion}). - -@item -Bash implements command aliases and the @code{alias} and @code{unalias} -builtins (@pxref{Aliases}). - -@item -Bash provides shell arithmetic, the @code{((} compound command -(@pxref{Conditional Constructs}), -and arithmetic expansion (@pxref{Shell Arithmetic}). - -@item -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 @code{export} -command. - -@item -Bash includes the @sc{POSIX} pattern removal @samp{%}, @samp{#}, @samp{%%} -and @samp{##} expansions to remove leading or trailing substrings from -variable values (@pxref{Shell Parameter Expansion}). - -@item -The expansion @code{$@{#xx@}}, which returns the length of @code{$@{xx@}}, -is supported (@pxref{Shell Parameter Expansion}). - -@item -The expansion @code{$@{var:}@var{offset}@code{[:}@var{length}@code{]@}}, -which expands to the substring of @code{var}'s value of length -@var{length}, beginning at @var{offset}, is present -(@pxref{Shell Parameter Expansion}). - -@item -The expansion -@code{$@{var/[/]}@var{pattern}@code{[/}@var{replacement}@code{]@}}, -which matches @var{pattern} and replaces it with @var{replacement} in -the value of @code{var}, is available (@pxref{Shell Parameter Expansion}). - -@item -Bash has @var{indirect} variable expansion using @code{$@{!word@}} -(@pxref{Shell Parameter Expansion}). - -@item -Bash can expand positional parameters beyond @code{$9} using -@code{$@{@var{num}@}}. - -@item -The @sc{POSIX} @code{$()} form of command substitution -is implemented (@pxref{Command Substitution}), -and preferred to the Bourne shell's @code{``} (which -is also implemented for backwards compatibility). - -@item -Bash has process substitution (@pxref{Process Substitution}). - -@item -Bash automatically assigns variables that provide information about the -current user (@code{UID}, @code{EUID}, and @code{GROUPS}), the current host -(@code{HOSTTYPE}, @code{OSTYPE}, @code{MACHTYPE}, and @code{HOSTNAME}), -and the instance of Bash that is running (@code{BASH}, -@code{BASH_VERSION}, and @code{BASH_VERSINFO}). @xref{Bash Variables}, -for details. - -@item -The @code{IFS} variable is used to split only the results of expansion, -not all words (@pxref{Word Splitting}). -This closes a longstanding shell security hole. - -@item -Bash implements the full set of @sc{POSIX.2} filename expansion operators, -including @var{character classes}, @var{equivalence classes}, and -@var{collating symbols} (@pxref{Filename Expansion}). - -@item -Bash implements extended pattern matching features when the @code{extglob} -shell option is enabled (@pxref{Pattern Matching}). - -@item -It is possible to have a variable and a function with the same name; -@code{sh} does not separate the two name spaces. - -@item -Bash functions are permitted to have local variables using the -@code{local} builtin, and thus useful recursive functions may be written. - -@item -Variable assignments preceding commands affect only that command, even -builtins and functions (@pxref{Environment}). -In @code{sh}, all variable assignments -preceding commands are global unless the command is executed from the -file system. - -@item -Bash performs filename expansion on filenames specified as operands -to input and output redirection operators. - -@item -Bash contains the @samp{<>} redirection operator, allowing a file to be -opened for both reading and writing, and the @samp{&>} redirection -operator, for directing standard output and standard error to the same -file (@pxref{Redirections}). - -@item -The @code{noclobber} option is available to avoid overwriting existing -files with output redirection (@pxref{The Set Builtin}). -The @samp{>|} redirection operator may be used to override @code{noclobber}. - -@item -The Bash @code{cd} and @code{pwd} builtins (@pxref{Bourne Shell Builtins}) -each take @samp{-L} and @samp{-P} builtins to switch between logical and -physical modes. - -@item -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 -@code{builtin} and @code{command} builtins (@pxref{Bash Builtins}). - -@item -The @code{command} builtin allows selective disabling of functions -when command lookup is performed (@pxref{Bash Builtins}). - -@item -Individual builtins may be enabled or disabled using the @code{enable} -builtin (@pxref{Bash Builtins}). - -@item -The Bash @code{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 -(@pxref{Bourne Shell Builtins}). - -@item -Shell functions may be exported to children via the environment -using @code{export -f} (@pxref{Shell Functions}). - -@item -The Bash @code{export}, @code{readonly}, and @code{declare} builtins can -take a @samp{-f} option to act on shell functions, a @samp{-p} option to -display variables with various attributes set in a format that can be -used as shell input, a @samp{-n} option to remove various variable -attributes, and @samp{name=value} arguments to set variable attributes -and values simultaneously. - -@item -The Bash @code{hash} builtin allows a name to be associated with -an arbitrary filename, even when that filename cannot be found by -searching the @code{$PATH}, using @samp{hash -p} -(@pxref{Bourne Shell Builtins}). - -@item -Bash includes a @code{help} builtin for quick reference to shell -facilities (@pxref{Bash Builtins}). - -@item -The @code{printf} builtin is available to display formatted output -(@pxref{Bash Builtins}). - -@item -The Bash @code{read} builtin (@pxref{Bash Builtins}) -will read a line ending in @samp{\} with -the @samp{-r} option, and will use the @code{REPLY} variable as a -default if no arguments are supplied. The Bash @code{read} builtin -also accepts a prompt string with the @samp{-p} option and will use -Readline to obtain the line when given the @samp{-e} option. - -@item -The @code{return} builtin may be used to abort execution of scripts -executed with the @code{.} or @code{source} builtins -(@pxref{Bourne Shell Builtins}). - -@item -Bash includes the @code{shopt} builtin, for finer control of shell -optional capabilities (@pxref{Bash Builtins}). - -@item -Bash has much more optional behavior controllable with the @code{set} -builtin (@pxref{The Set Builtin}). - -@item -The @code{test} builtin (@pxref{Bourne Shell Builtins}) -is slightly different, as it implements the @sc{POSIX} algorithm, -which specifies the behavior based on the number of arguments. - -@item -The @code{trap} builtin (@pxref{Bourne Shell Builtins}) -allows a @code{DEBUG} pseudo-signal specification, -similar to @code{EXIT}. Commands specified with a @code{DEBUG} trap are -executed after every simple command. The @code{DEBUG} trap is not -inherited by shell functions. - -@item -The Bash @code{type} builtin is more extensive and gives more information -about the names it finds (@pxref{Bash Builtins}). - -@item -The Bash @code{umask} builtin permits a @samp{-p} option to cause -the output to be displayed in the form of a @code{umask} command -that may be reused as input (@pxref{Bourne Shell Builtins}). - -@item -Bash implements a @code{csh}-like directory stack, and provides the -@code{pushd}, @code{popd}, and @code{dirs} builtins to manipulate it -(@pxref{The Directory Stack}). -Bash also makes the directory stack visible as the value of the -@code{DIRSTACK} shell variable. - -@item -Bash interprets special backslash-escaped characters in the prompt -strings when interactive (@pxref{Printing a Prompt}). - -@item -The Bash restricted mode is more useful (@pxref{The Restricted Shell}); -the @sc{SVR4.2} shell restricted mode is too limited. - -@item -The @code{disown} builtin can remove a job from the internal shell -job table (@pxref{Job Control Builtins}) or suppress the sending -of @code{SIGHUP} to a job when the shell exits as the result of a -@code{SIGHUP}. - -@item -The @sc{SVR4.2} shell has two privilege-related builtins -(@code{mldmode} and @code{priv}) not present in Bash. - -@item -Bash does not have the @code{stop} or @code{newgrp} builtins. - -@item -Bash does not use the @code{SHACCT} variable or perform shell accounting. - -@item -The @sc{SVR4.2} @code{sh} uses a @code{TIMEOUT} variable like Bash uses -@code{TMOUT}. - -@end itemize - -@noindent -More features unique to Bash may be found in @ref{Bash Features}. - -@subsection 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 @sc{SVR4.2} shell. For instance: - -@itemize @bullet - -@item -Bash does not fork a subshell when redirecting into or out of -a shell control structure such as an @code{if} or @code{while} -statement. - -@item -Bash does not allow unbalanced quotes. The @sc{SVR4.2} shell will silently -insert a needed closing quote at @code{EOF} under certain circumstances. -This can be the cause of some hard-to-find errors. - -@item -The @sc{SVR4.2} shell uses a baroque memory management scheme based on -trapping @code{SIGSEGV}. If the shell is started from a process with -@code{SIGSEGV} blocked (e.g., by using the @code{system()} C library -function call), it misbehaves badly. - -@item -In a questionable attempt at security, the @sc{SVR4.2} shell, -when invoked without the @samp{-p} option, will alter its real -and effective @sc{UID} and @sc{GID} if they are less than some -magic threshold value, commonly 100. -This can lead to unexpected results. - -@item -The @sc{SVR4.2} shell does not allow users to trap @code{SIGSEGV}, -@code{SIGALRM}, or @code{SIGCHLD}. - -@item -The @sc{SVR4.2} shell does not allow the @code{IFS}, @code{MAILCHECK}, -@code{PATH}, @code{PS1}, or @code{PS2} variables to be unset. - -@item -The @sc{SVR4.2} shell treats @samp{^} as the undocumented equivalent of -@samp{|}. - -@item -Bash allows multiple option arguments when it is invoked (@code{-x -v}); -the @sc{SVR4.2} shell allows only one option argument (@code{-xv}). In -fact, some versions of the shell dump core if the second argument begins -with a @samp{-}. - -@item -The @sc{SVR4.2} shell exits a script if any builtin fails; Bash exits -a script only if one of the @sc{POSIX.2} special builtins fails, and -only for certain failures, as enumerated in the @sc{POSIX.2} standard. - -@item -The @sc{SVR4.2} shell behaves differently when invoked as @code{jsh} -(it turns on job control). -@end itemize - -@node Bash Features -@chapter Bash Features - -This section describes features unique to Bash. - -@menu -* Invoking Bash:: Command line options that you can give - to Bash. -* Bash Startup Files:: When and how Bash executes scripts. -* Is This Shell Interactive?:: Determining the state of a running Bash. -* Bash Builtins:: Table of builtins specific to Bash. -* The Set Builtin:: This builtin is so overloaded it - deserves its own section. -* Bash Conditional Expressions:: Primitives used in composing expressions for - the @code{test} builtin. -* Bash Variables:: List of variables that exist in Bash. -* Shell Arithmetic:: Arithmetic on shell variables. -* Aliases:: Substituting one command for another. -* Arrays:: Array Variables. -* The Directory Stack:: History of visited directories. -* Printing a Prompt:: Controlling the PS1 string. -* The Restricted Shell:: A more controlled mode of shell execution. -* Bash POSIX Mode:: Making Bash behave more closely to what - the POSIX standard specifies. -@end menu - -@node Invoking Bash -@section Invoking Bash - -@example -bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o @var{option}] [@var{argument} @dots{}] -bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o @var{option}] -c @var{string} [@var{argument} @dots{}] -bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o @var{option}] [@var{argument} @dots{}] -@end example - -In addition to the single-character shell command-line options -(@pxref{The Set Builtin}), there are several multi-character -options that you can use. These options must appear on the command -line before the single-character options in order for them -to be recognized. - -@table @code -@item --dump-po-strings -Equivalent to @samp{-D}, but the output is in the GNU @code{gettext} -PO (portable object) file format. - -@item --dump-strings -Equivalent to @samp{-D}. - -@item --help -Display a usage message on standard output and exit sucessfully. - -@item --login -Make this shell act as if it were directly invoked by login. -This is equivalent to @samp{exec -l bash} but can be issued from -another shell, such as @code{csh}. @samp{exec bash --login} -will replace the current shell with a Bash login shell. - -@item --noediting -Do not use the @sc{GNU} Readline library (@pxref{Command Line Editing}) -to read interactive command lines. - -@item --noprofile -Don't load the system-wide startup file @file{/etc/profile} -or any of the personal initialization files -@file{~/.bash_profile}, @file{~/.bash_login}, or @file{~/.profile} -when Bash is invoked as a login shell. - -@item --norc -Don't read the @file{~/.bashrc} initialization file in an -interactive shell. This is on by default if the shell is -invoked as @code{sh}. - -@item --posix -Change the behavior of Bash where the default operation differs -from the @sc{POSIX} 1003.2 standard to match the standard. This -is intended to make Bash behave as a strict superset of that -standard. @xref{Bash POSIX Mode}, for a description of the Bash -@sc{POSIX} mode. - -@item --rcfile @var{filename} -Execute commands from @var{filename} (instead of @file{~/.bashrc}) -in an interactive shell. - -@item --restricted -Make the shell a restricted shell (@pxref{The Restricted Shell}). - -@item --verbose -Equivalent to @samp{-v}. - -@item --version -Show version information for this instance of -Bash on the standard output and exit successfully. - -@end table - -There are several single-character options that may be supplied at -invocation which are not available with the @code{set} builtin. - -@table @code -@item -c @var{string} -Read and execute commands from @var{string} after processing the -options, then exit. Any remaining arguments are assigned to the -positional parameters, starting with @code{$0}. - -@item -i -Force the shell to run interactively. - -@item -r -Make the shell a restricted shell (@pxref{The Restricted Shell}). - -@item -s -If this option is present, or if no arguments remain after option -processing, then commands are read from the standard input. -This option allows the positional parameters to be set -when invoking an interactive shell. - -@item -D -A list of all double-quoted strings preceded by @samp{$} -is printed on the standard ouput. -These are the strings that -are subject to language translation when the current locale -is not @code{C} or @code{POSIX} (@pxref{Locale Translation}). -This implies the @samp{-n} option; no commands will be executed. - -@item -- -A @code{--} signals the end of options and disables further option -processing. -Any arguments after the @code{--} are treated as filenames and arguments. - -@end table - -@cindex interactive shell -An @emph{interactive} shell is one whose input and output are both -connected to terminals (as determined by @code{isatty(3)}), or one -started with the @samp{-i} option. - -If arguments remain after option processing, and neither the -@samp{-c} nor the @samp{-s} -option has been supplied, the first argument is assumed to -be the name of a file containing shell commands (@pxref{Shell Scripts}). -When Bash is invoked in this fashion, @code{$0} -is set to the name of the file, and the positional parameters -are set to the remaining arguments. -Bash reads and executes commands from this file, then exits. -Bash's exit status is the exit status of the last command executed -in the script. If no commands are executed, the exit status is 0. - -@node Bash Startup Files -@section Bash Startup Files -@cindex startup files - -This section describs how Bash executes its startup files. -If any of the files exist but cannot be read, Bash reports an error. -Tildes are expanded in file names as described above under -Tilde Expansion (@pxref{Tilde Expansion}). - -When Bash is invoked as an interactive login shell, or as a -non-interactive shell with the @samp{--login} option, it first reads and -executes commands from the file @file{/etc/profile}, if that file exists. -After reading that file, it looks for @file{~/.bash_profile}, -@file{~/.bash_login}, and @file{~/.profile}, in that order, and reads -and executes commands from the first one that exists and is readable. -The @samp{--noprofile} option may be used when the shell is started to -inhibit this behavior. - -When a login shell exits, Bash reads and executes commands from -the file @file{~/.bash_logout}, if it exists. - -When an interactive shell that is not a login shell is started, Bash -reads and executes commands from @file{~/.bashrc}, if that file exists. -This may be inhibited by using the @samp{--norc} option. -The @samp{--rcfile @var{file}} option will force Bash to read and -execute commands from @var{file} instead of @file{~/.bashrc}. - -So, typically, your @file{~/.bash_profile} contains the line -@example -@code{if [ -f @file{~/.bashrc} ]; then . @file{~/.bashrc}; fi} -@end example -@noindent -after (or before) any login-specific initializations. - -When Bash is started non-interactively, to run a shell script, -for example, it looks for the variable @code{BASH_ENV} in the environment, -expands its value if it appears there, and uses the expanded value as -the name of a file to read and execute. Bash behaves as if the -following command were executed: -@example -@code{if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi} -@end example -@noindent -but the value of the @code{PATH} variable is not used to search for the -file name. - -If Bash is invoked with the name @code{sh}, it tries to mimic the -startup behavior of historical versions of @code{sh} as closely as -possible, while conforming to the @sc{POSIX} standard as well. - -When invoked as an interactive login shell, or as a non-interactive -shell with the @samp{--login} option, it first attempts to read -and execute commands from @file{/etc/profile} and @file{~/.profile}, in -that order. -The @samp{--noprofile} option may be used to inhibit this behavior. -When invoked as an interactive shell with the name @code{sh}, Bash -looks for the variable @code{ENV}, expands its value if it is defined, -and uses the expanded value as the name of a file to read and execute. -Since a shell invoked as @code{sh} does not attempt to read and execute -commands from any other startup files, the @samp{--rcfile} option has -no effect. -A non-interactive shell invoked with the name @code{sh} does not attempt -to read any other startup files. - -When invoked as @code{sh}, Bash enters @sc{POSIX} mode after -the startup files are read. - -When Bash is started in @sc{POSIX} mode, as with the -@samp{--posix} command line option, it follows the @sc{POSIX} standard -for startup files. -In this mode, interactive shells expand the @code{ENV} variable -and commands are read and executed from the file whose name is the -expanded value. -No other startup files are read. - -Bash attempts to determine when it is being run by the remote shell -daemon, usually @code{rshd}. If Bash determines it is being run by -rshd, it reads and executes commands from @file{~/.bashrc}, if that -file exists and is readable. -It will not do this if invoked as @code{sh}. -The @samp{--norc} option may be used to inhibit this behavior, and the -@samp{--rcfile} option may be used to force another file to be read, but -@code{rshd} does not generally invoke the shell with those options or -allow them to be specified. - -If Bash is started with the effective user (group) id not equal to the -real user (group) id, and the @code{-p} option is not supplied, no startup -files are read, shell functions are not inherited from the environment, -the @code{SHELLOPTS} variable, if it appears in the environment, is ignored, -and the effective user id is set to the real user id. -If the @code{-p} option is supplied at invocation, the startup behavior is -the same, but the effective user id is not reset. - -@node Is This Shell Interactive? -@section Is This Shell Interactive? -@cindex interactive shell - -As defined in @ref{Invoking Bash}, an interactive shell -is one whose input and output are both -connected to terminals (as determined by @code{isatty(3)}), -or one started with the @samp{-i} option. - -To determine within a startup script whether Bash is -running interactively or not, examine the variable -@code{$PS1}; it is unset in non-interactive shells, and set in -interactive shells. Thus: - -@example -if [ -z "$PS1" ]; then - echo This shell is not interactive -else - echo This shell is interactive -fi -@end example - -Alternatively, startup scripts may test the value of the @samp{-} -special parameter. -It contains @code{i} when the shell is interactive. For example: - -@example -case "$-" in -*i*) echo This shell is interactive ;; -*) echo This shell is not interactive ;; -esac -@end example - @node Bash Builtins @section Bash Builtin Commands This section describes builtin commands which are unique to or have been extended in Bash. +Some of these commands are specified in the @sc{posix} 1003.2 standard. @table @code +@item alias +@btindex alias +@example +alias [@code{-p}] [@var{name}[=@var{value}] @dots{}] +@end example + +Without arguments or with the @samp{-p} option, @code{alias} prints +the list of aliases on the standard output in a form that allows +them to be reused as input. +If arguments are supplied, an alias is defined for each @var{name} +whose @var{value} is given. If no @var{value} is given, the name +and value of the alias is printed. +Aliases are described in @ref{Aliases}. + @item bind @btindex bind @example bind [-m @var{keymap}] [-lpsvPSV] bind [-m @var{keymap}] [-q @var{function}] [-u @var{function}] [-r @var{keyseq}] bind [-m @var{keymap}] -f @var{filename} +bind [-m @var{keymap}] -x @var{keyseq:shell-command} bind [-m @var{keymap}] @var{keyseq:function-name} @end example @@ -3386,7 +2859,7 @@ Display current Readline (@pxref{Command Line Editing}) key and function bindings, or bind a key sequence to a Readline function or macro. The binding syntax accepted is identical to that of -@file{.inputrc} (@pxref{Readline Init File}), +a Readline initialization file (@pxref{Readline Init File}), but each binding must be passed as a separate argument: e.g., @samp{"\C-x\C-r":re-read-init-file}. Options, if supplied, have the following meanings: @@ -3411,21 +2884,22 @@ List the names of all Readline functions. @item -p Display Readline function names and bindings in such a way that they -can be re-read. +can be used as input or in a Readline initialization file. @item -P List current Readline function names and bindings. @item -v Display Readline variable names and values in such a way that they -can be re-read. +can be used as input or in a Readline initialization file. @item -V List current Readline variable names and values. @item -s Display Readline key sequences bound to macros and the strings they output -in such a way that they can be re-read. +in such a way that they can be used as input or in a Readline +initialization file. @item -S Display Readline key sequences bound to macros and the strings they output. @@ -3442,6 +2916,10 @@ Unbind all keys bound to the named @var{function}. @item -r @var{keyseq} Remove any current binding for @var{keyseq}. +@item -x @var{keyseq:shell-command} +Cause @var{shell-command} to be executed whenever @var{keyseq} is +entered. + @end table @noindent @@ -3528,7 +3006,7 @@ When used in a function, @code{declare} makes each @var{name} local, as with the @code{local} command. The return status is zero unless an invalid option is encountered, -an attempt is made to define a function using @code{-f foo=bar}, +an attempt is made to define a function using @samp{-f foo=bar}, an attempt is made to assign a value to a readonly variable, an attempt is made to assign a value to an array variable without using the compound assignment syntax (@pxref{Arrays}), @@ -3550,6 +3028,9 @@ If the @samp{-e} option is given, interpretation of the following backslash-escaped characters is enabled. The @samp{-E} option disables the interpretation of these escape characters, even on systems where they are interpreted by default. +The @code{xpg_echo} shell option may be used to +dynamically determine whether or not @code{echo} expands these +escape characters by default. @code{echo} interprets the following escape sequences: @table @code @item \a @@ -3587,7 +3068,7 @@ enable [-n] [-p] [-f @var{filename}] [-ads] [@var{name} @dots{}] @end example Enable and disable builtin shell commands. Disabling a builtin allows a disk command which has the same name -as a shell builtin to be executed with specifying a full pathname, +as a shell builtin to be executed without specifying a full pathname, even though the shell normally searches for builtins before disk commands. If @samp{-n} is used, the @var{name}s become disabled. Otherwise @var{name}s are enabled. For example, to use the @code{test} binary @@ -3605,9 +3086,9 @@ from shared object @var{filename}, on systems that support dynamic loading. The @samp{-d} option will delete a builtin loaded with @samp{-f}. If there are no options, a list of the shell builtins is displayed. -The @samp{-s} option restricts @code{enable} to the @sc{POSIX} special +The @samp{-s} option restricts @code{enable} to the @sc{posix} special builtins. If @samp{-s} is used with @samp{-f}, the new builtin becomes -a special builtin. +a special builtin (@pxref{Special Builtins}). The return status is zero unless a @var{name} is not a shell builtin or there is an error loading a new builtin from a shared object. @@ -3615,13 +3096,15 @@ or there is an error loading a new builtin from a shared object. @item help @btindex help @example -help [@var{pattern}] +help [-s] [@var{pattern}] @end example Display helpful information about builtin commands. If @var{pattern} is specified, @code{help} gives detailed help on all commands matching @var{pattern}, otherwise a list of -the builtins is printed. The return status is zero unless no -command matches @var{pattern}. +the builtins is printed. +The @samp{-s} option restricts the information displayed to a short +usage synopsis. +The return status is zero unless no command matches @var{pattern}. @item let @btindex let @@ -3637,14 +3120,16 @@ otherwise 0 is returned. @item local @btindex local @example -local @var{name}[=@var{value}] +local [@var{option}] @var{name}[=@var{value}] @end example For each argument, a local variable named @var{name} is created, and assigned @var{value}. +The @var{option} can be any of the options accepted by @code{declare}. @code{local} can only be used within a function; it makes the variable @var{name} have a visible scope restricted to that function and its children. The return status is zero unless @code{local} is used outside -a function or an invalid @var{name} is supplied. +a function, an invalid @var{name} is supplied, or @var{name} is a +readonly variable. @item logout @btindex logout @@ -3674,12 +3159,13 @@ corresponding @var{argument} in a format that can be reused as shell input. The @var{format} is reused as necessary to consume all of the @var{arguments}. If the @var{format} requires more @var{arguments} than are supplied, the extra format specifications behave as if a zero value or null string, as -appropriate, had been supplied. +appropriate, had been supplied. The return value is zero on success, +non-zero on failure. @item read @btindex read @example -read [-a @var{aname}] [-p @var{prompt}] [-er] [@var{name} @dots{}] +read [-ers] [-a @var{aname}] [-p @var{prompt}] [-t @var{timeout}] [-n @var{nchars}] [-d @var{delim}] [@var{name} @dots{}] @end example One line is read from the standard input, and the first word is assigned to the first @var{name}, the second word to the second @var{name}, @@ -3693,30 +3179,49 @@ The backslash character @samp{\} may be used to remove any special meaning for the next character read and for line continuation. If no names are supplied, the line read is assigned to the variable @code{REPLY}. -The return code is zero, unless end-of-file is encountered. +The return code is zero, unless end-of-file is encountered or @code{read} +times out. Options, if supplied, have the following meanings: @table @code -@item -r -If this option is given, backslash does not act as an escape -character. The backslash is considered to be part of the line. -In particular, a backslash-newline pair may not be used as a line -continuation. - -@item -p @var{prompt} -Display @var{prompt}, without a -trailing newline, before attempting to read any input. The prompt -is displayed only if input is coming from a terminal. - @item -a @var{aname} The words are assigned to sequential indices of the array variable @var{aname}, starting at 0. All elements are removed from @var{aname} before the assignment. Other @var{name} arguments are ignored. +@item -d @var{delim} +The first character of @var{delim} is used to terminate the input line, +rather than newline. + @item -e -Readline (@pxref{Command Line Editing}) -is used to obtain the line. +Readline (@pxref{Command Line Editing}) is used to obtain the line. + +@item -n @var{nchars} +@code{read} returns after reading @var{nchars} characters rather than +waiting for a complete line of input. + +@item -p @var{prompt} +Display @var{prompt}, without a trailing newline, before attempting +to read any input. +The prompt is displayed only if input is coming from a terminal. + +@item -r +If this option is given, backslash does not act as an escape character. +The backslash is considered to be part of the line. +In particular, a backslash-newline pair may not be used as a line +continuation. + +@item -s +Silent mode. If input is coming from a terminal, characters are +not echoed. + +@item -t @var{timeout} +Cause @code{read} to time out and return failure if a complete line of +input is not read within @var{timeout} seconds. +This option has no effect if @code{read} is not reading input from the +terminal or a pipe. + @end table @item shopt @@ -3807,8 +3312,8 @@ builtin command. An interactive shell does not exit if @code{exec} fails. @item expand_aliases -If set, aliases are expanded as described below< under Aliases -(@pxref{Aliases}). +If set, aliases are expanded as described below under Aliases, +@ref{Aliases}. This option is enabled by default for interactive shells. @item extglob @@ -3857,6 +3362,11 @@ If set, and a file that Bash is checking for mail has been accessed since the last time it was checked, the message @code{"The mail in @var{mailfile} has been read"} is displayed. +@item no_empty_cmd_completion +If set, and Readline is being used, Bash will not attempt to search +the @code{PATH} for possible completions when completion is attempted +on an empty line. + @item nocaseglob If set, Bash matches filenames in a case-insensitive fashion when performing filename expansion. @@ -3865,6 +3375,11 @@ performing filename expansion. If set, Bash allows filename patterns which match no files to expand to a null string, rather than themselves. +@item progcomp +If set, the programmable completion facilities +(@pxref{Programmable Completion}) are enabled. +This option is enabled by default. + @item promptvars If set, prompt strings undergo variable and parameter expansion after being expanded (@pxref{Printing a Prompt}). @@ -3886,6 +3401,11 @@ number of positional parameters. If set, the @code{source} builtin uses the value of @code{PATH} to find the directory containing the file supplied as an argument. This option is enabled by default. + +@item xpg_echo +If set, the @code{echo} builtin expands backslash-escape sequences +by default. + @end table @noindent @@ -4005,6 +3525,16 @@ The return status is zero unless an invalid option is supplied, a non-numeric argument other than @code{unlimited} is supplied as a @var{limit}, or an error occurs while setting a new limit. +@item unalias +@btindex unalias +@example +unalias [-a] [@var{name} @dots{} ] +@end example + +Remove each @var{name} from the list of aliases. If @samp{-a} is +supplied, all aliases are removed. +Aliases are described in @ref{Aliases}. + @end table @node The Set Builtin @@ -4120,7 +3650,7 @@ Same as @code{-P}. @item posix Change the behavior of Bash where the default operation differs -from the @sc{POSIX} 1003.2 standard to match the standard +from the @sc{posix} 1003.2 standard to match the standard (@pxref{Bash POSIX Mode}). This is intended to make Bash behave as a strict superset of that standard. @@ -4227,131 +3757,104 @@ The special parameter @code{#} is set to N. The return status is always zero unless an invalid option is supplied. @end table -@node Bash Conditional Expressions -@section Bash Conditional Expressions -@cindex expressions, conditional - -Conditional expressions are used by the @code{[[} compound command -and the @code{test} and @code{[} builtin commands. - -Expressions may be unary or binary. -Unary expressions are often used to examine the status of a file. -There are string operators and numeric comparison operators as well. -If any @var{file} argument to one of the primaries is of the form -@file{/dev/fd/@var{N}}, then file descriptor @var{N} is checked. - -@table @code -@item -a @var{file} -True if @var{file} exists. - -@item -b @var{file} -True if @var{file} exists and is a block special file. - -@item -c @var{file} -True if @var{file} exists and is a character special file. - -@item -d @var{file} -True if @var{file} exists and is a directory. - -@item -e @var{file} -True if @var{file} exists. - -@item -f @var{file} -True if @var{file} exists and is a regular file. - -@item -g @var{file} -True if @var{file} exists and its set-group-id bit is set. - -@item -h @var{file} -True if @var{file} exists and is a symbolic link. - -@item -k @var{file} -True if @var{file} exists and its "sticky" bit is set. +@node Special Builtins +@section Special Builtins +@cindex special builtin -@item -p @var{file} -True if @var{file} exists and is a named pipe (FIFO). +For historical reasons, the @sc{posix} 1003.2 standard has classified +several builtin commands as @emph{special}. +When Bash is executing in @sc{posix} mode, the special builtins +differ from other builtin commands in three respects: -@item -r @var{file} -True if @var{file} exists and is readable. - -@item -s @var{file} -True if @var{file} exists and has a size greater than zero. +@enumerate +@item +Special builtins are found before shell functions during command lookup. -@item -t @var{fd} -True if file descriptor @var{fd} is open and refers to a terminal. +@item +If a special builtin returns an error status, a non-interactive shell exits. -@item -u @var{file} -True if @var{file} exists and its set-user-id bit is set. +@item +Assignment statements preceding the command stay in effect in the shell +environment after the command completes. +@end enumerate -@item -w @var{file} -True if @var{file} exists and is writable. +When Bash is not executing in @sc{posix} mode, these builtins behave no +differently than the rest of the Bash builtin commands. +The Bash @sc{posix} mode is described in @ref{Bash POSIX Mode}. -@item -x @var{file} -True if @var{file} exists and is executable. +These are the @sc{posix} special builtins: +@example +@w{break : . continue eval exec exit export readonly return set} +@w{shift trap unset} +@end example -@item -O @var{file} -True if @var{file} exists and is owned by the effective user id. +@node Shell Variables +@chapter Shell Variables -@item -G @var{file} -True if @var{file} exists and is owned by the effective group id. +@menu +* Bourne Shell Variables:: Variables which Bash uses in the same way + as the Bourne Shell. +* Bash Variables:: List of variables that exist in Bash. +@end menu -@item -L @var{file} -True if @var{file} exists and is a symbolic link. +This chapter describes the shell variables that Bash uses. +Bash automatically assigns default values to a number of variables. -@item -S @var{file} -True if @var{file} exists and is a socket. +@node Bourne Shell Variables +@section Bourne Shell Variables -@item -N @var{file} -True if @var{file} exists and has been modified since it was last read. +Bash uses certain shell variables in the same way as the Bourne shell. +In some cases, Bash assigns a default value to the variable. -@item @var{file1} -nt @var{file2} -True if @var{file1} is newer (according to -modification date) than @var{file2}. +@vtable @code -@item @var{file1} -ot @var{file2} -True if @var{file1} is older than @var{file2}. +@item CDPATH +A colon-separated list of directories used as a search path for +the @code{cd} builtin command. -@item @var{file1} -ef @var{file2} -True if @var{file1} and @var{file2} have the same device and -inode numbers. +@item HOME +The current user's home directory; the default for the @code{cd} builtin +command. +The value of this variable is also used by tilde expansion +(@pxref{Tilde Expansion}). -@item -o @var{optname} -True if shell option @var{optname} is enabled. -The list of options appears in the description of the @samp{-o} -option to the @code{set} builtin (@pxref{The Set Builtin}). +@item IFS +A list of characters that separate fields; used when the shell splits +words as part of expansion. -@item -z @var{string} -True if the length of @var{string} is zero. +@item MAIL +If this parameter is set to a filename and the @code{MAILPATH} variable +is not set, Bash informs the user of the arrival of mail in +the specified file. -@item -n @var{string} -@itemx @var{string} -True if the length of @var{string} is non-zero. +@item MAILPATH +A colon-separated list of filenames which the shell periodically checks +for new mail. +Each list entry can specify the message that is printed when new mail +arrives in the mail file by separating the file name from the message with +a @samp{?}. +When used in the text of the message, @code{$_} expands to the name of +the current mail file. -@item @var{string1} == @var{string2} -True if the strings are equal. -@samp{=} may be used in place of @samp{==}. +@item OPTARG +The value of the last option argument processed by the @code{getopts} builtin. -@item @var{string1} != @var{string2} -True if the strings are not equal. +@item OPTIND +The index of the last option argument processed by the @code{getopts} builtin. -@item @var{string1} < @var{string2} -True if @var{string1} sorts before @var{string2} lexicographically -in the current locale. +@item PATH +A colon-separated list of directories in which the shell looks for +commands. -@item @var{string1} > @var{string2} -True if @var{string1} sorts after @var{string2} lexicographically -in the current locale. +@item PS1 +The primary prompt string. The default value is @samp{\s-\v\$ }. +@xref{Printing a Prompt}, for the complete list of escape +sequences that are expanded before @code{PS1} is displayed. -@item @var{arg1} OP @var{arg2} -@code{OP} is one of -@samp{-eq}, @samp{-ne}, @samp{-lt}, @samp{-le}, @samp{-gt}, or @samp{-ge}. -These arithmetic binary operators return true if @var{arg1} -is equal to, not equal to, less than, less than or equal to, -greater than, or greater than or equal to @var{arg2}, -respectively. @var{Arg1} and @var{arg2} -may be positive or negative integers. +@item PS2 +The secondary prompt string. The default value is @samp{> }. -@end table +@end vtable @node Bash Variables @section Bash Variables @@ -4359,6 +3862,10 @@ may be positive or negative integers. These variables are set or used by Bash, but other shells do not normally treat them specially. +A few variables used by Bash are described in different chapters: +variables for controlling the job control facilities +(@pxref{Job Control Variables}). + @vtable @code @item BASH @@ -4373,8 +3880,8 @@ to read before executing the script. @xref{Bash Startup Files}. The version number of the current instance of Bash. @item BASH_VERSINFO -A readonly array variable whose members hold version information for -this instance of Bash. +A readonly array variable (@pxref{Arrays}) +whose members hold version information for this instance of Bash. The values assigned to the array members are as follows: @table @code @@ -4399,9 +3906,40 @@ The value of @code{MACHTYPE}. @end table +@item COMP_WORDS +An array variable consisting of the individual +words in the current command line. +This variable is available only in shell functions invoked by the +programmable completion facilities (@pxref{Programmable Completion}). + +@item COMP_CWORD +An index into @code{$@{COMP_WORDS@}} of the word containing the current +cursor position. +This variable is available only in shell functions invoked by the +programmable completion facilities (@pxref{Programmable Completion}). + +@item COMP_LINE +The current command line. +This variable is available only in shell functions and external +commands invoked by the +programmable completion facilities (@pxref{Programmable Completion}). + +@item COMP_POINT +The index of the current cursor position relative to the beginning of +the current command. +If the current cursor position is at the end of the current command, +the value of this variable is equal to @code{$@{#COMP_LINE@}}. +This variable is available only in shell functions and external +commands invoked by the +programmable completion facilities (@pxref{Programmable Completion}). + +@item COMPREPLY +An array variable from which Bash reads the possible completions +generated by a shell function invoked by the programmable completion +facility (@pxref{Programmable Completion}). + @item DIRSTACK -An array variable (@pxref{Arrays}) -containing the current contents of the directory stack. +An array variable containing the current contents of the directory stack. Directories appear in the stack in the order they are displayed by the @code{dirs} builtin. Assigning to members of this array variable may be used to modify @@ -4436,13 +3974,16 @@ of matches. @item GROUPS An array variable containing the list of groups of which the current -user is a member. This variable is readonly. +user is a member. +Assignments to @code{GROUPS} have no effect and are silently discarded. +If @code{GROUPS} is unset, it loses its special properties, even if it is +subsequently reset. @item histchars Up to three characters which control history expansion, quick substitution, and tokenization (@pxref{History Interaction}). The first character is the -@dfn{history-expansion-char}, that is, the character which signifies the +@var{history expansion} character, that is, the character which signifies the start of a history expansion, normally @samp{!}. The second character is the character which signifies `quick substitution' when seen as the first character on a line, normally @samp{^}. The optional third character is the @@ -4457,11 +3998,19 @@ The history number, or index in the history list, of the current command. If @code{HISTCMD} is unset, it loses its special properties, even if it is subsequently reset. +@item FUNCNAME +The name of any currently-executing shell function. +This variable exists only when a shell function is executing. +Assignments to @code{FUNCNAME} have no effect and are silently discarded. +If @code{FUNCNAME} is unset, it loses its special properties, even if +it is subsequently reset. + @item HISTCONTROL -Set to a value of @samp{ignorespace}, it means don't enter lines which -begin with a space or tab into the history list. Set to a value -of @samp{ignoredups}, it means don't enter lines which match the last -entered line. A value of @samp{ignoreboth} combines the two options. +A value of @samp{ignorespace} means to not enter lines which +begin with a space or tab into the history list. +A value of @samp{ignoredups} means to not enter lines which match the last +entered line. +A value of @samp{ignoreboth} combines the two options. Unset, or set to any other value than those above, means to save all lines on the history list. The second and subsequent lines of a multi-line compound command are @@ -4471,12 +4020,12 @@ not tested, and are added to the history regardless of the value of @item HISTIGNORE A colon-separated list of patterns used to decide which command lines should be saved on the history list. Each pattern is -anchored at the beginning of the line and must fully specify the +anchored at the beginning of the line and must match the complete line (no implicit @samp{*} is appended). Each pattern is tested against the line after the checks specified by @code{HISTCONTROL} are applied. In addition to the normal shell pattern matching characters, @samp{&} matches the previous history line. @samp{&} -may be escaped using a backslash. The backslash is removed +may be escaped using a backslash; the backslash is removed before attempting a match. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of @@ -4490,7 +4039,7 @@ provides the functionality of @code{ignoreboth}. @item HISTFILE The name of the file to which the command history is saved. The -default is @file{~/.bash_history}. +default value is @file{~/.bash_history}. @item HISTSIZE The maximum number of commands to remember on the history list. @@ -4499,16 +4048,22 @@ The default value is 500. @item HISTFILESIZE The maximum number of lines contained in the history file. When this variable is assigned a value, the history file is truncated, if -necessary, to contain no more than that number of lines. The default -value is 500. The history file is also truncated to this size after +necessary, to contain no more than that number of lines. +The history file is also truncated to this size after writing it when an interactive shell exits. +The default value is 500. @item HOSTFILE Contains the name of a file in the same format as @file{/etc/hosts} that -should be read when the shell needs to complete a hostname. You can -change the file interactively; the next time you attempt to complete a -hostname, Bash will add the contents of the new file to the already -existing database. +should be read when the shell needs to complete a hostname. +The list of possible hostname completions may be changed while the shell +is running; +the next time hostname completion is attempted after the +value is changed, Bash adds the contents of the new file to the +existing list. +If @code{HOSTFILE} is set, but has no value, Bash attempts to read +@file{/etc/hosts} to obtain the list of possible hostname completions. +When @code{HOSTFILE} is unset, the hostname list is cleared. @item HOSTNAME The name of the current host. @@ -4527,7 +4082,7 @@ If the variable does not exist, then @code{EOF} signifies the end of input to the shell. This is only in effect for interactive shells. @item INPUTRC -The name of the Readline startup file, overriding the default +The name of the Readline initialization file, overriding the default of @file{~/.inputrc}. @item LANG @@ -4554,12 +4109,15 @@ matching (@pxref{Filename Expansion}). This variable determines the locale used to translate double-quoted strings preceded by a @samp{$} (@pxref{Locale Translation}). +@item LC_NUMERIC +This variable determines the locale category used for number formatting. + @item LINENO The line number in the script or shell function currently executing. @item MACHTYPE A string that fully describes the system type on which Bash -is executing, in the standard GNU @var{cpu-company-system} format. +is executing, in the standard @sc{gnu} @var{cpu-company-system} format. @item MAILCHECK How often (in seconds) that the shell should check for mail in the @@ -4582,11 +4140,11 @@ in the most-recently-executed foreground pipeline (which may contain only a single command). @item PPID -The process id of the shell's parent process. This variable +The process @sc{id} of the shell's parent process. This variable is readonly. @item PROMPT_COMMAND -If present, this contains a string which is a command to execute +If set, the value is interpreted as a command to execute before the printing of each primary prompt (@code{$PS1}). @item PS3 @@ -4595,7 +4153,7 @@ The value of this variable is used as the prompt for the @code{select} command prompts with @samp{#? } @item PS4 -This is the prompt printed before the command line is echoed +The value is the prompt printed before the command line is echoed when the @samp{-x} option is set (@pxref{The Set Builtin}). The first character of @code{PS4} is replicated multiple times, as necessary, to indicate multiple levels of indirection. @@ -4682,7 +4240,7 @@ A trailing newline is added when the format string is displayed. @item TMOUT If set to a value greater than zero, the value is interpreted as the number of seconds to wait for input after issuing the primary -prompt. +prompt when the shell is interactive. Bash terminates after that number of seconds if input does not arrive. @@ -4691,6 +4249,552 @@ The numeric real user id of the current user. This variable is readonly. @end vtable +@node Bash Features +@chapter Bash Features + +This section describes features unique to Bash. + +@menu +* Invoking Bash:: Command line options that you can give + to Bash. +* Bash Startup Files:: When and how Bash executes scripts. +* Interactive Shells:: What an interactive shell is. +* Bash Conditional Expressions:: Primitives used in composing expressions for + the @code{test} builtin. +* Shell Arithmetic:: Arithmetic on shell variables. +* Aliases:: Substituting one command for another. +* Arrays:: Array Variables. +* The Directory Stack:: History of visited directories. +* Printing a Prompt:: Controlling the PS1 string. +* The Restricted Shell:: A more controlled mode of shell execution. +* Bash POSIX Mode:: Making Bash behave more closely to what + the POSIX standard specifies. +@end menu + +@node Invoking Bash +@section Invoking Bash + +@example +bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o @var{option}] [@var{argument} @dots{}] +bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o @var{option}] -c @var{string} [@var{argument} @dots{}] +bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o @var{option}] [@var{argument} @dots{}] +@end example + +In addition to the single-character shell command-line options +(@pxref{The Set Builtin}), there are several multi-character +options that you can use. These options must appear on the command +line before the single-character options in order for them +to be recognized. + +@table @code +@item --dump-po-strings +A list of all double-quoted strings preceded by @samp{$} +is printed on the standard ouput +in the @sc{gnu} @code{gettext} PO (portable object) file format. +Equivalent to @samp{-D} except for the output format. + +@item --dump-strings +Equivalent to @samp{-D}. + +@item --help +Display a usage message on standard output and exit sucessfully. + +@item --login +Make this shell act as if it were directly invoked by login. +This is equivalent to @samp{exec -l bash} but can be issued from +another shell, such as @code{csh}. @samp{exec bash --login} +will replace the current shell with a Bash login shell. +@xref{Bash Startup Files}, for a description of the special behavior +of a login shell. + +@item --noediting +Do not use the @sc{gnu} Readline library (@pxref{Command Line Editing}) +to read command lines when the shell is interactive. + +@item --noprofile +Don't load the system-wide startup file @file{/etc/profile} +or any of the personal initialization files +@file{~/.bash_profile}, @file{~/.bash_login}, or @file{~/.profile} +when Bash is invoked as a login shell. + +@item --norc +Don't read the @file{~/.bashrc} initialization file in an +interactive shell. This is on by default if the shell is +invoked as @code{sh}. + +@item --posix +Change the behavior of Bash where the default operation differs +from the @sc{posix} 1003.2 standard to match the standard. This +is intended to make Bash behave as a strict superset of that +standard. @xref{Bash POSIX Mode}, for a description of the Bash +@sc{posix} mode. + +@item --rcfile @var{filename} +Execute commands from @var{filename} (instead of @file{~/.bashrc}) +in an interactive shell. + +@item --restricted +Make the shell a restricted shell (@pxref{The Restricted Shell}). + +@item --verbose +Equivalent to @samp{-v}. Print shell input lines as they're read. + +@item --version +Show version information for this instance of +Bash on the standard output and exit successfully. + +@end table + +There are several single-character options that may be supplied at +invocation which are not available with the @code{set} builtin. + +@table @code +@item -c @var{string} +Read and execute commands from @var{string} after processing the +options, then exit. Any remaining arguments are assigned to the +positional parameters, starting with @code{$0}. + +@item -i +Force the shell to run interactively. Interactive shells are +described in @ref{Interactive Shells}. + +@item -r +Make the shell a restricted shell (@pxref{The Restricted Shell}). + +@item -s +If this option is present, or if no arguments remain after option +processing, then commands are read from the standard input. +This option allows the positional parameters to be set +when invoking an interactive shell. + +@item -D +A list of all double-quoted strings preceded by @samp{$} +is printed on the standard ouput. +These are the strings that +are subject to language translation when the current locale +is not @code{C} or @code{POSIX} (@pxref{Locale Translation}). +This implies the @samp{-n} option; no commands will be executed. + +@item -- +A @code{--} signals the end of options and disables further option +processing. +Any arguments after the @code{--} are treated as filenames and arguments. + +@end table + +@cindex interactive shell +An @emph{interactive} shell is one started without non-option arguments, +unless @samp{-s} is specified, +without specifying the @samp{-c} option, and whose input and output are both +connected to terminals (as determined by @code{isatty(3)}), or one +started with the @samp{-i} option. @xref{Interactive Shells} for more +information. + +If arguments remain after option processing, and neither the +@samp{-c} nor the @samp{-s} +option has been supplied, the first argument is assumed to +be the name of a file containing shell commands (@pxref{Shell Scripts}). +When Bash is invoked in this fashion, @code{$0} +is set to the name of the file, and the positional parameters +are set to the remaining arguments. +Bash reads and executes commands from this file, then exits. +Bash's exit status is the exit status of the last command executed +in the script. If no commands are executed, the exit status is 0. + +@node Bash Startup Files +@section Bash Startup Files +@cindex startup files + +This section describs how Bash executes its startup files. +If any of the files exist but cannot be read, Bash reports an error. +Tildes are expanded in file names as described above under +Tilde Expansion (@pxref{Tilde Expansion}). + +Interactive shells are described in @ref{Interactive Shells}. + +@subsubheading Invoked as an interactive login shell, or with @samp{--login} + +When Bash is invoked as an interactive login shell, or as a +non-interactive shell with the @samp{--login} option, it first reads and +executes commands from the file @file{/etc/profile}, if that file exists. +After reading that file, it looks for @file{~/.bash_profile}, +@file{~/.bash_login}, and @file{~/.profile}, in that order, and reads +and executes commands from the first one that exists and is readable. +The @samp{--noprofile} option may be used when the shell is started to +inhibit this behavior. + +When a login shell exits, Bash reads and executes commands from +the file @file{~/.bash_logout}, if it exists. + +@subsubheading Invoked as an interactive non-login shell + +When an interactive shell that is not a login shell is started, Bash +reads and executes commands from @file{~/.bashrc}, if that file exists. +This may be inhibited by using the @samp{--norc} option. +The @samp{--rcfile @var{file}} option will force Bash to read and +execute commands from @var{file} instead of @file{~/.bashrc}. + +So, typically, your @file{~/.bash_profile} contains the line +@example +@code{if [ -f ~/.bashrc ]; then . ~/.bashrc; fi} +@end example +@noindent +after (or before) any login-specific initializations. + +@subsubheading Invoked non-interactively + +When Bash is started non-interactively, to run a shell script, +for example, it looks for the variable @code{BASH_ENV} in the environment, +expands its value if it appears there, and uses the expanded value as +the name of a file to read and execute. Bash behaves as if the +following command were executed: +@example +@code{if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi} +@end example +@noindent +but the value of the @code{PATH} variable is not used to search for the +file name. + +@subsubheading Invoked with name @code{sh} + +If Bash is invoked with the name @code{sh}, it tries to mimic the +startup behavior of historical versions of @code{sh} as closely as +possible, while conforming to the @sc{posix} standard as well. + +When invoked as an interactive login shell, or as a non-interactive +shell with the @samp{--login} option, it first attempts to read +and execute commands from @file{/etc/profile} and @file{~/.profile}, in +that order. +The @samp{--noprofile} option may be used to inhibit this behavior. +When invoked as an interactive shell with the name @code{sh}, Bash +looks for the variable @code{ENV}, expands its value if it is defined, +and uses the expanded value as the name of a file to read and execute. +Since a shell invoked as @code{sh} does not attempt to read and execute +commands from any other startup files, the @samp{--rcfile} option has +no effect. +A non-interactive shell invoked with the name @code{sh} does not attempt +to read any other startup files. + +When invoked as @code{sh}, Bash enters @sc{posix} mode after +the startup files are read. + +@subsubheading Invoked in @sc{posix} mode + +When Bash is started in @sc{posix} mode, as with the +@samp{--posix} command line option, it follows the @sc{posix} standard +for startup files. +In this mode, interactive shells expand the @code{ENV} variable +and commands are read and executed from the file whose name is the +expanded value. +No other startup files are read. + +@subsubheading Invoked by remote shell daemon + +Bash attempts to determine when it is being run by the remote shell +daemon, usually @code{rshd}. If Bash determines it is being run by +rshd, it reads and executes commands from @file{~/.bashrc}, if that +file exists and is readable. +It will not do this if invoked as @code{sh}. +The @samp{--norc} option may be used to inhibit this behavior, and the +@samp{--rcfile} option may be used to force another file to be read, but +@code{rshd} does not generally invoke the shell with those options or +allow them to be specified. + +@subsubheading Invoked with unequal effective and real @sc{uid/gid}s + +If Bash is started with the effective user (group) id not equal to the +real user (group) id, and the @code{-p} option is not supplied, no startup +files are read, shell functions are not inherited from the environment, +the @code{SHELLOPTS} variable, if it appears in the environment, is ignored, +and the effective user id is set to the real user id. +If the @code{-p} option is supplied at invocation, the startup behavior is +the same, but the effective user id is not reset. + +@node Interactive Shells +@section Interactive Shells +@cindex interactive shell +@cindex shell, interactive + +@menu +* What is an Interactive Shell?:: What determines whether a shell is Interactive. +* Is this Shell Interactive?:: How to tell if a shell is interactive. +* Interactive Shell Behavior:: What changes in a interactive shell? +@end menu + +@node What is an Interactive Shell? +@subsection What is an Interactive Shell? + +An interactive shell +is one started without non-option arguments, unless @samp{-s} is +specified, without specifiying the @samp{-c} option, and +whose input and output are both +connected to terminals (as determined by @code{isatty(3)}), +or one started with the @samp{-i} option. + +An interactive shell generally reads from and writes to a user's +terminal. + +The @samp{-s} invocation option may be used to set the positional parameters +when an interactive shell is started. + +@node Is this Shell Interactive? +@subsection Is this Shell Interactive? + +To determine within a startup script whether or not Bash is +running interactively, +test the value of the @samp{-} special parameter. +It contains @code{i} when the shell is interactive. For example: + +@example +case "$-" in +*i*) echo This shell is interactive ;; +*) echo This shell is not interactive ;; +esac +@end example + +Alternatively, startup scripts may examine the variable +@code{$PS1}; it is unset in non-interactive shells, and set in +interactive shells. Thus: + +@example +if [ -z "$PS1" ]; then + echo This shell is not interactive +else + echo This shell is interactive +fi +@end example + +@node Interactive Shell Behavior +@subsection Interactive Shell Behavior + +When the shell is running interactively, it changes its behavior in +several ways. + +@enumerate +@item +Startup files are read and executed as described in @ref{Bash Startup Files}. + +@item +Job Control (@pxref{Job Control}) is enabled by default. When job +control is in effect, Bash ignores the keyboard-generated job control +signals @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}. + +@item +Bash expands and displays @code{$PS1} before reading the first line +of a command, and expands and displays @code{$PS2} before reading the +second and subsequent lines of a multi-line command. + +@item +Bash executes the value of the @code{PROMPT_COMMAND} variable as a command +before printing the primary prompt, @code{$PS1} +(@pxref{Bash Variables}). + +@item +Readline (@pxref{Command Line Editing}) is used to read commands from +the user's terminal. + +@item +Bash inspects the value of the @code{ignoreeof} option to @code{set -o} +instead of exiting immediately when it receives an @code{EOF} on its +standard input when reading a command (@pxref{The Set Builtin}). + +@item +Command history (@pxref{Bash History Facilities}) +and history expansion (@pxref{History Interaction}) +are enabled by default. +Bash will save the command history to the file named by @code{$HISTFILE} +when an interactive shell exits. + +@item +Alias expansion (@pxref{Aliases}) is performed by default. + +@item +In the absence of any traps, Bash ignores @code{SIGTERM} +(@pxref{Signals}). + +@item +In the absence of any traps, @code{SIGINT} is caught and handled +((@pxref{Signals}). +@code{SIGINT} will interrupt some shell builtins. + +@item +An interactive login shell sends a @code{SIGHUP} to all jobs on exit +if the @code{hupoxexit} shell option has been enabled (@pxref{Signals}). + +@item +The @samp{-n} invocation option is ignored, and @samp{set -n} has +no effect (@pxref{The Set Builtin}). + +@item +Bash will check for mail periodically, depending on the values of the +@code{MAIL}, @code{MAILPATH}, and @code{MAILCHECK} shell variables +(@pxref{Bash Variables}). + +@item +Expansion errors due to references to unbound shell variables after +@samp{set -u} has been enabled will not cause the shell to exit +(@pxref{The Set Builtin}). + +@item +The shell will not exit on expansion errors caused by @var{var} being unset +or null in @code{$@{@var{var}:?@var{word}@}} expansions +(@pxref{Shell Parameter Expansion}). + +@item +Redirection errors encountered by shell builtins will not cause the +shell to exit. + +@item +When running in @sc{posix} mode, a special builtin returning an error +status will not cause the shell to exit (@pxref{Bash POSIX Mode}). +@item +A failed @code{exec} will not cause the shell to exit +(@pxref{Bourne Shell Builtins}). + +@item +Parser syntax errors will not cause the shell to exit. + +@item +Simple spelling correction for directory arguments to the @code{cd} +builtin is enabled by default (see the description of the @code{cdspell} +option to the @code{shopt} builtin in @ref{Bash Builtins}). + +@item +The shell will check the value of the @code{TMOUT} variable and exit +if a command is not read within the specified number of seconds after +printing @code{$PS1} (@pxref{Bash Variables}). + +@end enumerate + +@node Bash Conditional Expressions +@section Bash Conditional Expressions +@cindex expressions, conditional + +Conditional expressions are used by the @code{[[} compound command +and the @code{test} and @code{[} builtin commands. + +Expressions may be unary or binary. +Unary expressions are often used to examine the status of a file. +There are string operators and numeric comparison operators as well. +If the @var{file} argument to one of the primaries is of the form +@file{/dev/fd/@var{N}}, then file descriptor @var{N} is checked. +If the @var{file} argument to one of the primaries is one of +@file{/dev/stdin}, @file{/dev/stdout}, or @file{/dev/stderr}, file +descriptor 0, 1, or 2, respectively, is checked. + +@table @code +@item -a @var{file} +True if @var{file} exists. + +@item -b @var{file} +True if @var{file} exists and is a block special file. + +@item -c @var{file} +True if @var{file} exists and is a character special file. + +@item -d @var{file} +True if @var{file} exists and is a directory. + +@item -e @var{file} +True if @var{file} exists. + +@item -f @var{file} +True if @var{file} exists and is a regular file. + +@item -g @var{file} +True if @var{file} exists and its set-group-id bit is set. + +@item -h @var{file} +True if @var{file} exists and is a symbolic link. + +@item -k @var{file} +True if @var{file} exists and its "sticky" bit is set. + +@item -p @var{file} +True if @var{file} exists and is a named pipe (FIFO). + +@item -r @var{file} +True if @var{file} exists and is readable. + +@item -s @var{file} +True if @var{file} exists and has a size greater than zero. + +@item -t @var{fd} +True if file descriptor @var{fd} is open and refers to a terminal. + +@item -u @var{file} +True if @var{file} exists and its set-user-id bit is set. + +@item -w @var{file} +True if @var{file} exists and is writable. + +@item -x @var{file} +True if @var{file} exists and is executable. + +@item -O @var{file} +True if @var{file} exists and is owned by the effective user id. + +@item -G @var{file} +True if @var{file} exists and is owned by the effective group id. + +@item -L @var{file} +True if @var{file} exists and is a symbolic link. + +@item -S @var{file} +True if @var{file} exists and is a socket. + +@item -N @var{file} +True if @var{file} exists and has been modified since it was last read. + +@item @var{file1} -nt @var{file2} +True if @var{file1} is newer (according to +modification date) than @var{file2}. + +@item @var{file1} -ot @var{file2} +True if @var{file1} is older than @var{file2}. + +@item @var{file1} -ef @var{file2} +True if @var{file1} and @var{file2} have the same device and +inode numbers. + +@item -o @var{optname} +True if shell option @var{optname} is enabled. +The list of options appears in the description of the @samp{-o} +option to the @code{set} builtin (@pxref{The Set Builtin}). + +@item -z @var{string} +True if the length of @var{string} is zero. + +@item -n @var{string} +@itemx @var{string} +True if the length of @var{string} is non-zero. + +@item @var{string1} == @var{string2} +True if the strings are equal. +@samp{=} may be used in place of @samp{==}. + +@item @var{string1} != @var{string2} +True if the strings are not equal. + +@item @var{string1} < @var{string2} +True if @var{string1} sorts before @var{string2} lexicographically +in the current locale. + +@item @var{string1} > @var{string2} +True if @var{string1} sorts after @var{string2} lexicographically +in the current locale. + +@item @var{arg1} OP @var{arg2} +@code{OP} is one of +@samp{-eq}, @samp{-ne}, @samp{-lt}, @samp{-le}, @samp{-gt}, or @samp{-ge}. +These arithmetic binary operators return true if @var{arg1} +is equal to, not equal to, less than, less than or equal to, +greater than, or greater than or equal to @var{arg2}, +respectively. @var{Arg1} and @var{arg2} +may be positive or negative integers. + +@end table + @node Shell Arithmetic @section Shell Arithmetic @cindex arithmetic, shell @@ -4703,12 +4807,21 @@ The shell allows arithmetic expressions to be evaluated, as one of the shell expansions or by the @code{let} builtin. Evaluation is done in long integers with no check for overflow, -though division by 0 is trapped and flagged as an error. The -following list of operators is grouped into levels of -equal-precedence operators. The levels are listed in order of -decreasing precedence. +though division by 0 is trapped and flagged as an error. +The operators and their precedence and associativity are the same +as in the C language. +The following list of operators is grouped into levels of +equal-precedence operators. +The levels are listed in order of decreasing precedence. @table @code + +@item @var{id}++ @var{id}-- +variable post-increment and post-decrement + +@item ++@var{id} --@var{id} +variable pre-increment and pre-decrement + @item - + unary minus and plus @@ -4753,19 +4866,25 @@ conditional evaluation @item = *= /= %= += -= <<= >>= &= ^= |= assignment + +@item expr1 , expr2 +comma @end table Shell variables are allowed as operands; parameter expansion is performed before the expression is evaluated. -The value of a parameter is coerced to a long integer within -an expression. A shell variable need not have its integer attribute -turned on to be used in an expression. +Within an expression, shell variables may also be referenced by name +without using the parameter expansion syntax. +The value of a variable is evaluated as an arithmetic expression +when it is referenced. +A shell variable need not have its integer attribute turned on +to be used in an expression. Constants with a leading 0 are interpreted as octal numbers. A leading @samp{0x} or @samp{0X} denotes hexadecimal. Otherwise, numbers take the form [@var{base}@code{#}]@var{n}, where @var{base} is a decimal number between 2 and 64 representing the arithmetic -base, and @var{n} is a number in that base. If @var{base} is +base, and @var{n} is a number in that base. If @var{base}@code{#} is omitted, then base 10 is used. The digits greater than 9 are represented by the lowercase letters, the uppercase letters, @samp{_}, and @samp{@@}, in that order. @@ -4781,15 +4900,10 @@ rules above. @section Aliases @cindex alias expansion -@menu -* Alias Builtins:: Builtins commands to maniuplate aliases. -@end menu - -Aliases allow a string to be substituted for a word when it is used +@var{Aliases} allow a string to be substituted for a word when it is used as the first word of a simple command. -The shell maintains a list of @var{aliases} -that may be set and unset with the @code{alias} and -@code{unalias} builtin commands. +The shell maintains a list of aliases that may be set and unset with +the @code{alias} and @code{unalias} builtin commands. The first word of each simple command, if unquoted, is checked to see if it has an alias. @@ -4837,36 +4951,7 @@ function is executed. To be safe, always put alias definitions on a separate line, and do not use @code{alias} in compound commands. -For almost every purpose, aliases are superseded by -shell functions. - -@node Alias Builtins -@subsection Alias Builtins - -@table @code - -@item alias -@btindex alias -@example -alias [@code{-p}] [@var{name}[=@var{value}] @dots{}] -@end example - -Without arguments or with the @samp{-p} option, @code{alias} prints -the list of aliases on the standard output in a form that allows -them to be reused as input. -If arguments are supplied, an alias is defined for each @var{name} -whose @var{value} is given. If no @var{value} is given, the name -and value of the alias is printed. - -@item unalias -@btindex unalias -@example -unalias [-a] [@var{name} @dots{} ] -@end example - -Remove each @var{name} from the list of aliases. If @samp{-a} is -supplied, all aliases are removed. -@end table +For almost every purpose, shell functions are preferred over aliases. @node Arrays @section Arrays @@ -4937,7 +5022,7 @@ Referencing an array variable without a subscript is equivalent to referencing element zero. The @code{unset} builtin is used to destroy arrays. -@code{unset} @code{name[@var{subscript}]} +@code{unset} @var{name[subscript]} destroys the array element at index @var{subscript}. @code{unset} @var{name}, where @var{name} is an array, removes the entire array. A subscript of @samp{*} or @samp{@@} also removes the @@ -4957,6 +5042,11 @@ reused as input. @section The Directory Stack @cindex directory stack +@menu +* Directory Stack Builtins:: Bash builtin commands to manipulate + the directory stack. +@end menu + The directory stack is a list of recently-visited directories. The @code{pushd} builtin adds directories to the stack as it changes the current directory, and the @code{popd} builtin removes specified @@ -4967,12 +5057,15 @@ of the directory stack. The contents of the directory stack are also visible as the value of the @code{DIRSTACK} shell variable. +@node Directory Stack Builtins +@subsection Directory Stack Builtins + @table @code @item dirs @btindex dirs @example -dirs [+@var{N} | -@var{N}] [-clvp] +dirs [+@var{N} | -@var{N}] [-clpv] @end example Display the list of currently remembered directories. Directories are added to the list with the @code{pushd} command; the @@ -5059,7 +5152,8 @@ executes the equivalent of `@code{cd} @var{dir}'. @cindex prompting The value of the variable @code{PROMPT_COMMAND} is examined just before -Bash prints each primary prompt. If it is set and non-null, then the +Bash prints each primary prompt. If @code{PROMPT_COMMAND} is set and +has a non-null value, then the value is executed just as if it had been typed on the command line. In addition, the following table describes the special characters which @@ -5076,6 +5170,10 @@ An escape character. The hostname, up to the first `.'. @item \H The hostname. +@item \j +The number of jobs currently managed by the shell. +@item \l +The basename of the shell's terminal device name. @item \n A newline. @item \r @@ -5116,6 +5214,18 @@ embed a terminal control sequence into the prompt. End a sequence of non-printing characters. @end table +The command number and the history number are usually different: +the history number of a command is its position in the history +list, which may include commands restored from the history file +(@pxref{Bash History Facilities}), while the command number is +the position in the sequence of commands executed during the current +shell session. + +After the string is decoded, it is expanded via +parameter expansion, command substitution, arithmetic +expansion, and quote removal, subject to the value of the +@code{promptvars} shell option (@pxref{Bash Builtins}). + @node The Restricted Shell @section The Restricted Shell @cindex restricted shell @@ -5139,6 +5249,9 @@ Specifying command names containing slashes. Specifying a filename containing a slash as an argument to the @code{.} builtin command. @item +Specifying a filename containing a slash as an argument to the @samp{-p} +option to the @code{hash} builtin command. +@item Importing function definitions from the shell environment at startup. @item Parsing the value of @code{SHELLOPTS} from the shell environment at startup. @@ -5162,10 +5275,10 @@ Turning off restricted mode with @samp{set +r} or @samp{set +o restricted}. Starting Bash with the @samp{--posix} command-line option or executing @samp{set -o posix} while Bash is running will cause Bash to conform more -closely to the @sc{POSIX.2} standard by changing the behavior to match that -specified by @sc{POSIX.2} in areas where the Bash default differs. +closely to the @sc{posix} 1003.2 standard by changing the behavior to +match that specified by @sc{posix} in areas where the Bash default differs. -The following list is what's changed when `@sc{POSIX} mode' is in effect: +The following list is what's changed when `@sc{posix} mode' is in effect: @enumerate @item @@ -5184,7 +5297,7 @@ exits with a non-zero status is `Done(status)'. Reserved words may not be aliased. @item -The @sc{POSIX.2} @code{PS1} and @code{PS2} expansions of @samp{!} to +The @sc{posix} 1003.2 @code{PS1} and @code{PS2} expansions of @samp{!} to the history number and @samp{!!} to @samp{!} are enabled, and parameter expansion is performed on the values of @code{PS1} and @code{PS2} regardless of the setting of the @code{promptvars} option. @@ -5194,7 +5307,7 @@ Interactive comments are enabled by default. (Bash has them on by default anyway.) @item -The @sc{POSIX.2} startup files are executed (@code{$ENV}) rather than +The @sc{posix} 1003.2 startup files are executed (@code{$ENV}) rather than the normal Bash files. @item @@ -5222,17 +5335,21 @@ Redirection operators do not perform filename expansion on the word in the redirection unless the shell is interactive. @item +Redirection operators do not perform word splitting on the word in the +redirection. + +@item Function names must be valid shell @code{name}s. That is, they may not contain characters other than letters, digits, and underscores, and may not start with a digit. Declaring a function with an invalid name causes a fatal syntax error in non-interactive shells. @item -@sc{POSIX.2} `special' builtins are found before shell functions +@sc{posix} 1003.2 `special' builtins are found before shell functions during command lookup. @item -If a @sc{POSIX.2} special builtin returns an error status, a +If a @sc{posix} 1003.2 special builtin returns an error status, a non-interactive shell exits. The fatal errors are those listed in the POSIX.2 standard, and include things like passing incorrect options, redirection errors, variable assignment errors for assignments preceding @@ -5268,16 +5385,16 @@ variable in a @code{for} statement or the selection variable in a Process substitution is not available. @item -Assignment statements preceding @sc{POSIX.2} special builtins +Assignment statements preceding @sc{posix} 1003.2 special builtins persist in the shell environment after the builtin completes. @item The @code{export} and @code{readonly} builtin commands display their -output in the format required by @sc{POSIX.2}. +output in the format required by @sc{posix} 1003.2. @end enumerate -There is other @sc{POSIX.2} behavior that Bash does not implement. +There is other @sc{posix} 1003.2 behavior that Bash does not implement. Specifically: @enumerate @@ -5323,19 +5440,19 @@ like: [1] 25647 @end example @noindent -indicating that this job is job number 1 and that the process @sc{ID} +indicating that this job is job number 1 and that the process @sc{id} of the last process in the pipeline associated with this job is 25647. All of the processes in a single pipeline are members of the same job. Bash uses the @var{job} abstraction as the basis for job control. To facilitate the implementation of the user interface to job -control, the system maintains the notion of a current terminal -process group @sc{ID}. Members of this process group (processes whose -process group @sc{ID} is equal to the current terminal process group -@sc{ID}) receive keyboard-generated signals such as @code{SIGINT}. +control, the operating system maintains the notion of a current terminal +process group @sc{id}. Members of this process group (processes whose +process group @sc{id} is equal to the current terminal process group +@sc{id}) receive keyboard-generated signals such as @code{SIGINT}. These processes are said to be in the foreground. Background -processes are those whose process group @sc{ID} differs from the +processes are those whose process group @sc{id} differs from the terminal's; such processes are immune to keyboard-generated signals. Only foreground processes are allowed to read from or write to the terminal. Background processes which attempt to @@ -5358,14 +5475,10 @@ takes effect immediately, and has the additional side effect of causing pending output and typeahead to be discarded. There are a number of ways to refer to a job in the shell. The -character @samp{%} introduces a job name. Job number @code{n} -may be referred to as @samp{%n}. A job may also be referred to -using a prefix of the name used to start it, or using a substring -that appears in its command line. For example, @samp{%ce} refers -to a stopped @code{ce} job. Using @samp{%?ce}, on the -other hand, refers to any job containing the string @samp{ce} in -its command line. If the prefix or substring matches more than one job, -Bash reports an error. The symbols @samp{%%} and +character @samp{%} introduces a job name. + +Job number @code{n} may be referred to as @samp{%n}. +The symbols @samp{%%} and @samp{%+} refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background. The @@ -5374,6 +5487,14 @@ pertaining to jobs (e.g., the output of the @code{jobs} command), the current job is always flagged with a @samp{+}, and the previous job with a @samp{-}. +A job may also be referred to +using a prefix of the name used to start it, or using a substring +that appears in its command line. For example, @samp{%ce} refers +to a stopped @code{ce} job. Using @samp{%?ce}, on the +other hand, refers to any job containing the string @samp{ce} in +its command line. If the prefix or substring matches more than one job, +Bash reports an error. + Simply naming a job can be used to bring it into the foreground: @samp{%1} is a synonym for @samp{fg %1}, bringing job 1 from the background into the foreground. Similarly, @samp{%1 &} resumes @@ -5425,7 +5546,7 @@ job control enabled, @var{jobspec} does not specify a valid job or @item jobs @btindex jobs @example -jobs [-lpnrs] [@var{jobspec}] +jobs [-lnprs] [@var{jobspec}] jobs -x @var{command} [@var{arguments}] @end example @@ -5434,14 +5555,14 @@ following meanings: @table @code @item -l -List process @sc{ID}s in addition to the normal information. +List process @sc{id}s in addition to the normal information. @item -n Display information only about jobs that have changed status since the user was last notified of their status. @item -p -List only the process @sc{ID} of the job's process group leader. +List only the process @sc{id} of the job's process group leader. @item -r Restrict output to running jobs. @@ -5457,7 +5578,7 @@ listed. If the @samp{-x} option is supplied, @code{jobs} replaces any @var{jobspec} found in @var{command} or @var{arguments} with the -corresponding process group @sc{ID}, and executes @var{command}, +corresponding process group @sc{id}, and executes @var{command}, passing it @var{argument}s, returning its exit status. @item kill @@ -5467,7 +5588,7 @@ kill [-s @var{sigspec}] [-n @var{signum}] [-@var{sigspec}] @var{jobspec} or @var kill -l [@var{exit_status}] @end example Send a signal specified by @var{sigspec} or @var{signum} to the process -named by job specification @var{jobspec} or process ID @var{pid}. +named by job specification @var{jobspec} or process @sc{id} @var{pid}. @var{sigspec} is either a signal name such as @code{SIGINT} (with or without the @code{SIG} prefix) or a signal number; @var{signum} is a signal number. If @var{sigspec} and @var{signum} are not present, @code{SIGTERM} is used. @@ -5483,9 +5604,9 @@ or non-zero if an error occurs or an invalid option is encountered. @item wait @btindex wait @example -wait [@var{jobspec}|@var{pid}] +wait [@var{jobspec} or @var{pid}] @end example -Wait until the child process specified by process @sc{ID} @var{pid} or job +Wait until the child process specified by process @sc{id} @var{pid} or job specification @var{jobspec} exits and return the exit status of the last command waited for. If a job spec is given, all processes in the job are waited for. @@ -5523,7 +5644,7 @@ even if the shell is a login shell. When job control is not active, the @code{kill} and @code{wait} builtins do not accept @var{jobspec} arguments. They must be -supplied process @sc{ID}s. +supplied process @sc{id}s. @node Job Control Variables @section Job Control Variables @@ -5543,19 +5664,19 @@ the string supplied must match the name of a stopped job exactly; if set to @samp{substring}, the string supplied needs to match a substring of the name of a stopped job. The @samp{substring} value provides functionality -analogous to the @samp{%?} job @sc{ID} (@pxref{Job Control Basics}). +analogous to the @samp{%?} job @sc{id} (@pxref{Job Control Basics}). If set to any other value, the supplied string must be a prefix of a stopped job's name; this provides functionality -analogous to the @samp{%} job @sc{ID}. +analogous to the @samp{%} job @sc{id}. @end vtable @set readline-appendix @set history-appendix -@cindex History, how to use -@include hsuser.texinfo @cindex Readline, how to use @include rluser.texinfo +@cindex History, how to use +@include hsuser.texinfo @clear readline-appendix @clear history-appendix @@ -5563,9 +5684,11 @@ analogous to the @samp{%} job @sc{ID}. @chapter Installing Bash This chapter provides basic instructions for installing Bash on -the various supported platforms. The distribution supports nearly every -version of Unix (and, someday, @sc{GNU}). Other independent ports exist for -@sc{MS-DOS}, @sc{OS/2}, Windows @sc{95}, and Windows @sc{NT}. +the various supported platforms. The distribution supports the +@sc{gnu} operating systems, nearly every version of Unix, and several +non-Unix systems such as BeOS and Interix. +Other independent ports exist for +@sc{ms-dos}, @sc{os/2}, Windows @sc{95/98}, and Windows @sc{nt}. @menu * Basic Installation:: Installation instructions. @@ -5599,12 +5722,39 @@ version of Unix (and, someday, @sc{GNU}). Other independent ports exist for These are installation instructions for Bash. +The simplest way to compile Bash is: + +@enumerate +@item +@code{cd} to the directory containing the source code and type +@samp{./configure} to configure Bash for your system. If you're +using @code{csh} on an old version of System V, you might need to +type @samp{sh ./configure} instead to prevent @code{csh} from trying +to execute @code{configure} itself. + +Running @code{configure} takes some time. +While running, it prints messages telling which features it is +checking for. + +@item +Type @samp{make} to compile Bash and build the @code{bashbug} bug +reporting script. + +@item +Optionally, type @samp{make tests} to run the Bash test suite. + +@item +Type @samp{make install} to install @code{bash} and @code{bashbug}. +This will also install the manual pages and Info file. + +@end enumerate + The @code{configure} shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a @file{Makefile} in each directory of the package (the top directory, the -@file{builtins} and @file{doc} directories, and the -each directory under @file{lib}). It also creates a +@file{builtins}, @file{doc}, and @file{support} directories, +each directory under @file{lib}, and several others). It also creates a @file{config.h} file containing system-dependent definitions. Finally, it creates a shell script named @code{config.status} that you can run in the future to recreate the current configuration, a @@ -5615,6 +5765,16 @@ If at some point @file{config.cache} contains results you don't want to keep, you may remove or edit it. +To find out more about the options and arguments that the +@code{configure} script understands, type + +@example +bash-2.04$ ./configure --help +@end example + +@noindent +at the Bash prompt in your Bash source directory. + If you need to do unusual things to compile Bash, please try to figure out how @code{configure} could check whether or not to do them, and mail diffs or instructions to @@ -5637,32 +5797,6 @@ contain the patch level of the Bash distribution, @samp{0} for example. The script @file{support/mkconffiles} has been provided to automate the creation of these files. -The simplest way to compile Bash is: - -@enumerate -@item -@code{cd} to the directory containing the source code and type -@samp{./configure} to configure Bash for your system. If you're -using @code{csh} on an old version of System V, you might need to -type @samp{sh ./configure} instead to prevent @code{csh} from trying -to execute @code{configure} itself. - -Running @code{configure} takes awhile. While running, it prints some -messages telling which features it is checking for. - -@item -Type @samp{make} to compile Bash and build the @code{bashbug} bug -reporting script. - -@item -Optionally, type @samp{make tests} to run the Bash test suite. - -@item -Type @samp{make install} to install @code{bash} and @code{bashbug}. -This will also install the manual pages and Info file. - -@end enumerate - You can remove the program binaries and object files from the source code directory by typing @samp{make clean}. To also remove the files that @code{configure} created (so you can compile Bash for @@ -5731,14 +5865,14 @@ directories for other architectures. By default, @samp{make install} will install into @file{/usr/local/bin}, @file{/usr/local/man}, etc. You can specify an installation prefix other than @file{/usr/local} by -giving @code{configure} the option @samp{--prefix=PATH}. +giving @code{configure} the option @samp{--prefix=@var{PATH}}. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give @code{configure} the option -@samp{--exec-prefix=PATH}, @samp{make install} will use @samp{PATH} as the -prefix for installing programs and libraries. Documentation and -other data files will still use the regular prefix. +@samp{--exec-prefix=@var{PATH}}, @samp{make install} will use +@var{PATH} as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. @node Specifying the System Type @section Specifying the System Type @@ -5752,7 +5886,7 @@ either be a short name for the system type, such as @samp{sun4}, or a canonical name with three fields: @samp{CPU-COMPANY-SYSTEM} (e.g., @samp{sparc-sun-sunos4.1.2}). -@noindent See the file @file{support/config.sub} for the possible +See the file @file{support/config.sub} for the possible values of each field. @node Sharing Defaults @@ -5776,9 +5910,9 @@ operates. @table @code -@item --cache-file=@var{FILE} +@item --cache-file=@var{file} Use and save the results of the tests in -@var{FILE} instead of @file{./config.cache}. Set @var{FILE} to +@var{file} instead of @file{./config.cache}. Set @var{file} to @file{/dev/null} to disable caching, for debugging @code{configure}. @@ -5790,8 +5924,8 @@ Print a summary of the options to @code{configure}, and exit. @itemx -q Do not print messages saying which checks are being made. -@item --srcdir=@var{DIR} -Look for the Bash source code in directory @var{DIR}. Usually +@item --srcdir=@var{dir} +Look for the Bash source code in directory @var{dir}. Usually @code{configure} can determine that directory automatically. @item --version @@ -5800,18 +5934,18 @@ script, and exit. @end table @code{configure} also accepts some other, not widely used, boilerplate -options. +options. @samp{configure --help} prints the complete list. @node Optional Features @section Optional Features -The Bash @code{configure} has a number of @samp{--enable-@var{FEATURE}} -options, where @var{FEATURE} indicates an optional part of Bash. -There are also several @samp{--with-@var{PACKAGE}} options, -where @var{PACKAGE} is something like @samp{gnu-malloc} or @samp{purify}. +The Bash @code{configure} has a number of @samp{--enable-@var{feature}} +options, where @var{feature} indicates an optional part of Bash. +There are also several @samp{--with-@var{package}} options, +where @var{package} is something like @samp{bash-malloc} or @samp{purify}. To turn off the default use of a package, use -@samp{--without-@var{PACKAGE}}. To configure Bash without a feature -that is enabled by default, use @samp{--disable-@var{FEATURE}}. +@samp{--without-@var{package}}. To configure Bash without a feature +that is enabled by default, use @samp{--disable-@var{feature}}. Here is a complete list of the @samp{--enable-} and @samp{--with-} options that the Bash @code{configure} recognizes. @@ -5820,38 +5954,41 @@ Here is a complete list of the @samp{--enable-} and @item --with-afs Define if you are using the Andrew File System from Transarc. +@item --with-bash-malloc +Use the Bash version of +@code{malloc} in @file{lib/malloc/malloc.c}. This is not the same +@code{malloc} that appears in @sc{gnu} libc, but an older version +derived from the 4.2 @sc{bsd} @code{malloc}. This @code{malloc} is +very fast, but wastes some space on each allocation. +This option is enabled by default. +The @file{NOTES} file contains a list of systems for +which this should be turned off, and @code{configure} disables this +option automatically for a number of systems. + @item --with-curses Use the curses library instead of the termcap library. This should be supplied if your system has an inadequate or incomplete termcap database. @item --with-glibc-malloc -Use the @sc{GNU} libc version of @code{malloc} in +Use the @sc{gnu} libc version of @code{malloc} in @file{lib/malloc/gmalloc.c}. This is not the version of @code{malloc} that appears in glibc version 2, but a modified version of the @code{malloc} from glibc version 1. This is somewhat slower than the default @code{malloc}, but wastes less space on a per-allocation basis, and will return memory to the operating system under -some circumstances. +certain circumstances. @item --with-gnu-malloc -Use the @sc{GNU} version of -@code{malloc} in @file{lib/malloc/malloc.c}. This is not the same -@code{malloc} that appears in @sc{GNU} libc, but an older version -derived from the 4.2 @sc{BSD} @code{malloc}. This @code{malloc} is -very fast, but wastes some space on each allocation. -This option is enabled by default. -The @file{NOTES} file contains a list of systems for -which this should be turned off, and @code{configure} disables this -option automatically for a number of systems. +A synonym for @code{--with-bash-malloc}. @item --with-installed-readline -Define this to make bash link with a locally-installed version of Readline -rather than the version in lib/readline. This works only with readline 4.0 -and later versions. +Define this to make Bash link with a locally-installed version of Readline +rather than the version in @file{lib/readline}. This works only with +Readline 4.1 and later versions. @item --with-purify -Define this to use the Purify memory allocation checker from Pure +Define this to use the Purify memory allocation checker from Rational Software. @item --enable-minimal-config @@ -5874,10 +6011,10 @@ This could be used to build a version to use as root's shell. The @samp{minimal-config} option can be used to disable all of the following options, but it is processed first, so individual -options may be enabled using @samp{enable-@var{FEATURE}}. +options may be enabled using @samp{enable-@var{feature}}. All of the following options except for @samp{disabled-builtins} and -@samp{usg-echo-default} are +@samp{xpg-echo-default} are enabled by default, unless the operating system does not provide the necessary support. @@ -5886,6 +6023,11 @@ necessary support. Allow alias expansion and include the @code{alias} and @code{unalias} builtins (@pxref{Aliases}). +@item --enable-arith-for-command +Include support for the alternate form of the @code{for} command +that behaves like the C language @code{for} statement +(@pxref{Looping Constructs}). + @item --enable-array-variables Include support for one-dimensional array shell variables (@pxref{Arrays}). @@ -5901,8 +6043,9 @@ See @ref{Brace Expansion}, for a complete description. @item --enable-command-timing Include support for recognizing @code{time} as a reserved word and for -displaying timing statistics for the pipeline following @code{time}. This -allows pipelines as well as shell builtins and functions to be timed. +displaying timing statistics for the pipeline following @code{time} +(@pxref{Pipelines}). +This allows pipelines as well as shell builtins and functions to be timed. @item --enable-cond-command Include support for the @code{[[} conditional command @@ -5929,16 +6072,22 @@ above under @ref{Pattern Matching}. @item --enable-help-builtin Include the @code{help} builtin, which displays help on shell builtins and -variables. +variables (@pxref{Bash Builtins}). @item --enable-history Include command history and the @code{fc} and @code{history} -builtin commands. +builtin commands (@pxref{Bash History Facilities}). @item --enable-job-control This enables the job control features (@pxref{Job Control}), if the operating system supports them. +@item --enable-net-redirections +This enables the special handling of filenames of the form +@code{/dev/tcp/@var{host}/@var{port}} and +@code{/dev/udp/@var{host}/@var{port}} +when used in redirections (@pxref{Redirections}). + @item --enable-process-substitution This enables process substitution (@pxref{Process Substitution}) if the operating system provides the necessary support. @@ -5949,6 +6098,11 @@ in the @code{$PS1}, @code{$PS2}, @code{$PS3}, and @code{$PS4} prompt strings. See @ref{Printing a Prompt}, for a complete list of prompt string escape sequences. +@item --enable-progcomp +Enable the programmable completion facilities +(@pxref{Programmable Completion}). +If Readline is not enabled, this option has no effect. + @item --enable-readline Include support for command-line editing and history with the Bash version of the Readline library (@pxref{Command Line Editing}). @@ -5963,13 +6117,20 @@ Include the @code{select} builtin, which allows the generation of simple menus (@pxref{Conditional Constructs}). @item --enable-usg-echo-default +A synonym for @code{--enable-xpg-echo-default}. + +@item --enable-xpg-echo-default Make the @code{echo} builtin expand backslash-escaped characters by default, -without requiring the @samp{-e} option. This makes the Bash @code{echo} -behave more like the System V version. +without requiring the @samp{-e} option. +This sets the default value of the @code{xpg_echo} shell option to @code{on}, +which makes the Bash @code{echo} behave more like the version specified in +the Single Unix Specification, version 2. +@xref{Bash Builtins}, for a description of the escape sequences that +@code{echo} recognizes. @end table -The file @file{config.h.top} contains C Preprocessor +The file @file{config-top.h} contains C Preprocessor @samp{#define} statements for options which are not settable from @code{configure}. Some of these are not meant to be changed; beware of the consequences if @@ -6014,24 +6175,426 @@ the template it provides for filing a bug report. Please send all reports concerning this manual to @email{chet@@po.CWRU.Edu}. +@node Major Differences From The Bourne Shell +@appendix 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 @sc{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 @code{sh} included SVR4.2 as +the baseline reference. + +@itemize @bullet + +@item +Bash is @sc{posix}-conformant, even where the @sc{posix} specification +differs from traditional @code{sh} behavior. + +@item +Bash has multi-character invocation options (@pxref{Invoking Bash}). + +@item +Bash has command-line editing (@pxref{Command Line Editing}) and +the @code{bind} builtin. + +@item +Bash provides a programmable word completion mechanism +(@pxref{Programmable Completion}), and two builtin commands, +@code{complete} and @code{compgen}, to manipulate it. + +@item +Bash has command history (@pxref{Bash History Facilities}) and the +@code{history} and @code{fc} builtins to manipulate it. + +@item +Bash implements @code{csh}-like history expansion +(@pxref{History Interaction}). + +@item +Bash has one-dimensional array variables (@pxref{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. + +@item +The @code{$'@dots{}'} quoting syntax, which expands ANSI-C +backslash-escaped characters in the text between the single quotes, +is supported (@pxref{ANSI-C Quoting}). + +@item +Bash supports the @code{$"@dots{}"} quoting syntax to do +locale-specific translation of the characters between the double +quotes. The @samp{-D}, @samp{--dump-strings}, and @samp{--dump-po-strings} +invocation options list the translatable strings found in a script +(@pxref{Locale Translation}). + +@item +Bash implements the @code{!} keyword to negate the return value of +a pipeline (@pxref{Pipelines}). +Very useful when an @code{if} statement needs to act only if a test fails. + +@item +Bash has the @code{time} reserved word and command timing (@pxref{Pipelines}). +The display of the timing statistics may be controlled with the +@code{TIMEFORMAT} variable. + +@item +Bash implements the @code{for (( @var{expr1} ; @var{expr2} ; @var{expr3} ))} +arithmetic for command, similar to the C language (@pxref{Looping Constructs}). + +@item +Bash includes the @code{select} compound command, which allows the +generation of simple menus (@pxref{Conditional Constructs}). + +@item +Bash includes the @code{[[} compound command, which makes conditional +testing part of the shell grammar (@pxref{Conditional Constructs}). + +@item +Bash includes brace expansion (@pxref{Brace Expansion}) and tilde +expansion (@pxref{Tilde Expansion}). + +@item +Bash implements command aliases and the @code{alias} and @code{unalias} +builtins (@pxref{Aliases}). + +@item +Bash provides shell arithmetic, the @code{((} compound command +(@pxref{Conditional Constructs}), +and arithmetic expansion (@pxref{Shell Arithmetic}). + +@item +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 @code{export} +command. + +@item +Bash includes the @sc{posix} pattern removal @samp{%}, @samp{#}, @samp{%%} +and @samp{##} expansions to remove leading or trailing substrings from +variable values (@pxref{Shell Parameter Expansion}). + +@item +The expansion @code{$@{#xx@}}, which returns the length of @code{$@{xx@}}, +is supported (@pxref{Shell Parameter Expansion}). + +@item +The expansion @code{$@{var:}@var{offset}@code{[:}@var{length}@code{]@}}, +which expands to the substring of @code{var}'s value of length +@var{length}, beginning at @var{offset}, is present +(@pxref{Shell Parameter Expansion}). + +@item +The expansion +@code{$@{var/[/]}@var{pattern}@code{[/}@var{replacement}@code{]@}}, +which matches @var{pattern} and replaces it with @var{replacement} in +the value of @code{var}, is available (@pxref{Shell Parameter Expansion}). + +@item +The expansion @code{$@{!@var{prefix@}*}} expansion, which expands to +the names of all shell variables whose names begin with @var{prefix}, +is available (@pxref{Shell Parameter Expansion}). + +@item +Bash has @var{indirect} variable expansion using @code{$@{!word@}} +(@pxref{Shell Parameter Expansion}). + +@item +Bash can expand positional parameters beyond @code{$9} using +@code{$@{@var{num}@}}. + +@item +The @sc{posix} @code{$()} form of command substitution +is implemented (@pxref{Command Substitution}), +and preferred to the Bourne shell's @code{``} (which +is also implemented for backwards compatibility). + +@item +Bash has process substitution (@pxref{Process Substitution}). + +@item +Bash automatically assigns variables that provide information about the +current user (@code{UID}, @code{EUID}, and @code{GROUPS}), the current host +(@code{HOSTTYPE}, @code{OSTYPE}, @code{MACHTYPE}, and @code{HOSTNAME}), +and the instance of Bash that is running (@code{BASH}, +@code{BASH_VERSION}, and @code{BASH_VERSINFO}). @xref{Bash Variables}, +for details. + +@item +The @code{IFS} variable is used to split only the results of expansion, +not all words (@pxref{Word Splitting}). +This closes a longstanding shell security hole. + +@item +Bash implements the full set of @sc{posix} 1003.2 filename expansion operators, +including @var{character classes}, @var{equivalence classes}, and +@var{collating symbols} (@pxref{Filename Expansion}). + +@item +Bash implements extended pattern matching features when the @code{extglob} +shell option is enabled (@pxref{Pattern Matching}). + +@item +It is possible to have a variable and a function with the same name; +@code{sh} does not separate the two name spaces. + +@item +Bash functions are permitted to have local variables using the +@code{local} builtin, and thus useful recursive functions may be written +(@pxref{Bash Builtins}). + +@item +Variable assignments preceding commands affect only that command, even +builtins and functions (@pxref{Environment}). +In @code{sh}, all variable assignments +preceding commands are global unless the command is executed from the +file system. + +@item +Bash performs filename expansion on filenames specified as operands +to input and output redirection operators (@pxref{Redirections}). + +@item +Bash contains the @samp{<>} redirection operator, allowing a file to be +opened for both reading and writing, and the @samp{&>} redirection +operator, for directing standard output and standard error to the same +file (@pxref{Redirections}). + +@item +Bash treats a number of filenames specially when they are +used in redirection operators (@pxref{Redirections}). + +@item +Bash can open network connections to arbitrary machines and services +with the redirection operators (@pxref{Redirections}). + +@item +The @code{noclobber} option is available to avoid overwriting existing +files with output redirection (@pxref{The Set Builtin}). +The @samp{>|} redirection operator may be used to override @code{noclobber}. + +@item +The Bash @code{cd} and @code{pwd} builtins (@pxref{Bourne Shell Builtins}) +each take @samp{-L} and @samp{-P} builtins to switch between logical and +physical modes. + +@item +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 +@code{builtin} and @code{command} builtins (@pxref{Bash Builtins}). + +@item +The @code{command} builtin allows selective disabling of functions +when command lookup is performed (@pxref{Bash Builtins}). + +@item +Individual builtins may be enabled or disabled using the @code{enable} +builtin (@pxref{Bash Builtins}). + +@item +The Bash @code{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 +(@pxref{Bourne Shell Builtins}). + +@item +Shell functions may be exported to children via the environment +using @code{export -f} (@pxref{Shell Functions}). + +@item +The Bash @code{export}, @code{readonly}, and @code{declare} builtins can +take a @samp{-f} option to act on shell functions, a @samp{-p} option to +display variables with various attributes set in a format that can be +used as shell input, a @samp{-n} option to remove various variable +attributes, and @samp{name=value} arguments to set variable attributes +and values simultaneously. + +@item +The Bash @code{hash} builtin allows a name to be associated with +an arbitrary filename, even when that filename cannot be found by +searching the @code{$PATH}, using @samp{hash -p} +(@pxref{Bourne Shell Builtins}). + +@item +Bash includes a @code{help} builtin for quick reference to shell +facilities (@pxref{Bash Builtins}). + +@item +The @code{printf} builtin is available to display formatted output +(@pxref{Bash Builtins}). + +@item +The Bash @code{read} builtin (@pxref{Bash Builtins}) +will read a line ending in @samp{\} with +the @samp{-r} option, and will use the @code{REPLY} variable as a +default if no non-option arguments are supplied. +The Bash @code{read} builtin +also accepts a prompt string with the @samp{-p} option and will use +Readline to obtain the line when given the @samp{-e} option. +The @code{read} builtin also has additional options to control input: +the @samp{-s} option will turn off echoing of input characters as +they are read, the @samp{-t} option will allow @code{read} to time out +if input does not arrive within a specified number of seconds, the +@samp{-n} option will allow reading only a specified number of +characters rather than a full line, and the @samp{-d} option will read +until a particular character rather than newline. + +@item +The @code{return} builtin may be used to abort execution of scripts +executed with the @code{.} or @code{source} builtins +(@pxref{Bourne Shell Builtins}). + +@item +Bash includes the @code{shopt} builtin, for finer control of shell +optional capabilities (@pxref{Bash Builtins}). + +@item +Bash has much more optional behavior controllable with the @code{set} +builtin (@pxref{The Set Builtin}). + +@item +The @code{test} builtin (@pxref{Bourne Shell Builtins}) +is slightly different, as it implements the @sc{posix} algorithm, +which specifies the behavior based on the number of arguments. + +@item +The @code{trap} builtin (@pxref{Bourne Shell Builtins}) +allows a @code{DEBUG} pseudo-signal specification, +similar to @code{EXIT}. Commands specified with a @code{DEBUG} trap are +executed after every simple command. The @code{DEBUG} trap is not +inherited by shell functions. + +@item +The Bash @code{type} builtin is more extensive and gives more information +about the names it finds (@pxref{Bash Builtins}). + +@item +The Bash @code{umask} builtin permits a @samp{-p} option to cause +the output to be displayed in the form of a @code{umask} command +that may be reused as input (@pxref{Bourne Shell Builtins}). + +@item +Bash implements a @code{csh}-like directory stack, and provides the +@code{pushd}, @code{popd}, and @code{dirs} builtins to manipulate it +(@pxref{The Directory Stack}). +Bash also makes the directory stack visible as the value of the +@code{DIRSTACK} shell variable. + +@item +Bash interprets special backslash-escaped characters in the prompt +strings when interactive (@pxref{Printing a Prompt}). + +@item +The Bash restricted mode is more useful (@pxref{The Restricted Shell}); +the SVR4.2 shell restricted mode is too limited. + +@item +The @code{disown} builtin can remove a job from the internal shell +job table (@pxref{Job Control Builtins}) or suppress the sending +of @code{SIGHUP} to a job when the shell exits as the result of a +@code{SIGHUP}. + +@item +The SVR4.2 shell has two privilege-related builtins +(@code{mldmode} and @code{priv}) not present in Bash. + +@item +Bash does not have the @code{stop} or @code{newgrp} builtins. + +@item +Bash does not use the @code{SHACCT} variable or perform shell accounting. + +@item +The SVR4.2 @code{sh} uses a @code{TIMEOUT} variable like Bash uses +@code{TMOUT}. + +@end itemize + +@noindent +More features unique to Bash may be found in @ref{Bash Features}. + + +@appendixsec 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: + +@itemize @bullet + +@item +Bash does not fork a subshell when redirecting into or out of +a shell control structure such as an @code{if} or @code{while} +statement. + +@item +Bash does not allow unbalanced quotes. The SVR4.2 shell will silently +insert a needed closing quote at @code{EOF} under certain circumstances. +This can be the cause of some hard-to-find errors. + +@item +The SVR4.2 shell uses a baroque memory management scheme based on +trapping @code{SIGSEGV}. If the shell is started from a process with +@code{SIGSEGV} blocked (e.g., by using the @code{system()} C library +function call), it misbehaves badly. + +@item +In a questionable attempt at security, the SVR4.2 shell, +when invoked without the @samp{-p} option, will alter its real +and effective @sc{uid} and @sc{gid} if they are less than some +magic threshold value, commonly 100. +This can lead to unexpected results. + +@item +The SVR4.2 shell does not allow users to trap @code{SIGSEGV}, +@code{SIGALRM}, or @code{SIGCHLD}. + +@item +The SVR4.2 shell does not allow the @code{IFS}, @code{MAILCHECK}, +@code{PATH}, @code{PS1}, or @code{PS2} variables to be unset. + +@item +The SVR4.2 shell treats @samp{^} as the undocumented equivalent of +@samp{|}. + +@item +Bash allows multiple option arguments when it is invoked (@code{-x -v}); +the SVR4.2 shell allows only one option argument (@code{-xv}). In +fact, some versions of the shell dump core if the second argument begins +with a @samp{-}. + +@item +The SVR4.2 shell exits a script if any builtin fails; Bash exits +a script only if one of the @sc{posix} 1003.2 special builtins fails, and +only for certain failures, as enumerated in the @sc{posix} 1003.2 standard. + +@item +The SVR4.2 shell behaves differently when invoked as @code{jsh} +(it turns on job control). +@end itemize + @node Builtin Index -@appendix Index of Shell Builtin Commands +@unnumbered Index of Shell Builtin Commands @printindex bt @node Reserved Word Index -@appendix Shell Reserved Words +@unnumbered Index of Shell Reserved Words @printindex rw @node Variable Index -@appendix Parameter and Variable Index +@unnumbered Parameter and Variable Index @printindex vr @node Function Index -@appendix Function Index +@unnumbered Function Index @printindex fn @node Concept Index -@appendix Concept Index +@unnumbered Concept Index @printindex cp @contents diff --git a/doc/builtins.1 b/doc/builtins.1 index d0aa631..bd9a1f8 100644 --- a/doc/builtins.1 +++ b/doc/builtins.1 @@ -1,6 +1,6 @@ .\" This is a hack to force bash builtins into the whatis database .\" and to get the list of builtins to come up with the man command. -.TH BASH_BUILTINS 1 "1996 March 20" GNU +.TH BASH_BUILTINS 1 "1996 Mar 20" GNU .SH NAME bash, :, ., alias, bg, bind, break, builtin, case, cd, command, continue, declare, dirs, disown, echo, enable, eval, exec, exit, diff --git a/doc/htmlpost.sh b/doc/htmlpost.sh index aa01542..51241b1 100755 --- a/doc/htmlpost.sh +++ b/doc/htmlpost.sh @@ -6,14 +6,14 @@ # directory of the user running navigator # -sed -e 's|<B>gnu.bash.bug</B>|<A HREF="news:gnu.bash.bug">gnu.bash.bug</A>|' \ - -e 's|<I>/bin/bash</I>|<A HREF="file:/bin/bash"><I>/bin/bash</I></A>|' \ - -e 's|<I>/etc/profile</I>|<A HREF="file:/etc/profile"><I>/etc/profile</I></A>|' \ - -e 's|<I>~/.bash_profile</I>|<A HREF="file:~/.bash_profile"><I>~/.bash_profile</I></A>|' \ - -e 's|<I>~/.bash_login</I>|<A HREF="file:~/.bash_login"><I>~/.bash_login</I></A>|' \ - -e 's|<I>~/.profile</I>|<A HREF="file:~/.profile"><I>~/.profile</I></A>|' \ - -e 's|<I>~/.bashrc</I>|<A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>|' \ - -e 's|<I>~/.bash_logout</I>|<A HREF="file:~/.bash_logout"><I>~/.bash_logout</I></A>|' \ - -e 's|<I>~/.bash_history</I>|<A HREF="file:~/.bash_history"><I>~/.bash_history</I></A>|' \ - -e 's|<I>~/.inputrc</I>|<A HREF="file:~/.inputrc"><I>~/.inputrc</I></A>|' \ - -e 's|<I>/etc/inputrc</I>|<A HREF="file:/etc/inputrc"><I>/etc/inputrc</I></A>|' +sed -e 's|<B>gnu.bash.bug</B>|<A HREF="news:gnu.bash.bug">gnu.bash.bug</A>|g' \ + -e 's|<I>/bin/bash</I>|<A HREF="file:/bin/bash"><I>/bin/bash</I></A>|g' \ + -e 's|<I>/etc/profile</I>|<A HREF="file:/etc/profile"><I>/etc/profile</I></A>|g' \ + -e 's|<I>~/.bash_profile</I>|<A HREF="file:~/.bash_profile"><I>~/.bash_profile</I></A>|g' \ + -e 's|<I>~/.bash_login</I>|<A HREF="file:~/.bash_login"><I>~/.bash_login</I></A>|g' \ + -e 's|<I>~/.profile</I>|<A HREF="file:~/.profile"><I>~/.profile</I></A>|g' \ + -e 's|<I>~/.bashrc</I>|<A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>|g' \ + -e 's|<I>~/.bash_logout</I>|<A HREF="file:~/.bash_logout"><I>~/.bash_logout</I></A>|g' \ + -e 's|<I>~/.bash_history</I>|<A HREF="file:~/.bash_history"><I>~/.bash_history</I></A>|g' \ + -e 's|<I>~/.inputrc</I>|<A HREF="file:~/.inputrc"><I>~/.inputrc</I></A>|g' \ + -e 's|<I>/etc/inputrc</I>|<A HREF="file:/etc/inputrc"><I>/etc/inputrc</I></A>|g' diff --git a/doc/rbash.1 b/doc/rbash.1 new file mode 100644 index 0000000..78a247c --- /dev/null +++ b/doc/rbash.1 @@ -0,0 +1,8 @@ +.TH RBASH 1 "1999 Nov 29" GNU +.SH NAME +rbash \- restricted bash, see \fBbash\fR(1) +.SH RESTRICTED SHELL +.nr zY 1 +.so bash.1 +.SH SEE ALSO +bash(1) diff --git a/doc/readline.3 b/doc/readline.3 index 6b36f2f..c1ed9cf 100644 --- a/doc/readline.3 +++ b/doc/readline.3 @@ -6,9 +6,9 @@ .\" Case Western Reserve University .\" chet@ins.CWRU.Edu .\" -.\" Last Change: Thu Dec 31 10:16:30 EST 1998 +.\" Last Change: Tue Jun 1 13:28:03 EDT 1999 .\" -.TH READLINE 3 "1998 Dec 31" GNU +.TH READLINE 3 "1999 Jun 1" GNU .\" .\" File Name macro. This used to be `.PN', for Path Name, .\" but Sun doesn't seem to like that very much. @@ -148,6 +148,7 @@ processing key bindings: .IR SPACE , and .IR TAB . +.PP In addition to command names, readline allows keys to be bound to a string that is inserted when the key is pressed (a \fImacro\fP). .PP @@ -564,7 +565,7 @@ Move forward to the end of the next word. Words are composed of alphanumeric characters (letters and digits). .TP .B backward\-word (M\-b) -Move back to the start of this, or the previous, word. Words are +Move back to the start of the current or previous word. Words are composed of alphanumeric characters (letters and digits). .TP .B clear\-screen (C\-l) @@ -1172,9 +1173,9 @@ VI Command Mode functions Individual \fBreadline\fP initialization file .PD .SH AUTHORS -Brian Fox, Free Software Foundation (primary author) +Brian Fox, Free Software Foundation .br -bfox@ai.MIT.Edu +bfox@gnu.org .PP Chet Ramey, Case Western Reserve University .br |
