-This is the Bash FAQ, version 2.13, for Bash version 2.02.
+This is the Bash FAQ, version 3.11, for Bash version 2.05.
This document contains a set of frequently-asked questions concerning
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
ftp://ftp.cwru.edu/pub/bash/FAQ
+The Bash home page is http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html
+
----------
Contents:
Section A: The Basics
-1) What is it?
-2) What's the latest version?
-3) Where can I get it?
-4) On what machines will bash run?
-5) Will bash run on operating systems other than Unix?
-6) How can I build bash with gcc?
-7) How can I make bash my login shell?
-8) I just changed my login shell to bash, and now I can't FTP into my
- machine. Why not?
-9) What's the `POSIX 1003.2 standard'?
-10) What is the bash `posix mode'?
+A1) What is it?
+A2) What's the latest version?
+A3) Where can I get it?
+A4) On what machines will bash run?
+A5) Will bash run on operating systems other than Unix?
+A6) How can I build bash with gcc?
+A7) How can I make bash my login shell?
+A8) I just changed my login shell to bash, and now I can't FTP into my
+ machine. Why not?
+A9) What's the `POSIX 1003.2 standard'?
+A10) What is the bash `posix mode'?
Section B: The latest version
-11) What's new in version 2.02?
-12) Are there any user-visible incompatibilities between bash-2.02 and
+B1) What's new in version 2.05?
+B2) Are there any user-visible incompatibilities between bash-2.05 and
bash-1.14.7?
Section C: Differences from other Unix shells
-13) How does bash differ from sh, the Bourne shell?
-14) How does bash differ from the Korn shell, version ksh88?
-15) Which new features in ksh-93 are not in bash, and which are?
+C1) How does bash differ from sh, the Bourne shell?
+C2) How does bash differ from the Korn shell, version ksh88?
+C3) Which new features in ksh-93 are not in bash, and which are?
Section D: Why does bash do some things differently than other Unix shells?
-16) Why does bash run a different version of `command' than
+D1) Why does bash run a different version of `command' than
`which command' says it will?
-17) Why doesn't bash treat brace expansions exactly like csh?
-18) Why doesn't bash have csh variable modifiers?
-19) How can I make my csh aliases work when I convert to bash?
-20) How can I pipe standard output and standard error from one command to
+D2) Why doesn't bash treat brace expansions exactly like csh?
+D3) Why doesn't bash have csh variable modifiers?
+D4) How can I make my csh aliases work when I convert to bash?
+D5) How can I pipe standard output and standard error from one command to
another, like csh does with `|&'?
-21) Now that I've converted from ksh to bash, are there equivalents 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?
-22) Why is the bash builtin `test' slightly different from /bin/test?
-23) Why does bash sometimes say `Broken pipe'?
-24) How can I get bash to read and display eight-bit characters?
-25) How do I write a function `x' to replace builtin command `x', but
- still invoke the command from within the function?
-26) When I have terminal escape sequences in my prompt, why does bash
+E1) Why is the bash builtin `test' slightly different from /bin/test?
+E2) Why does bash sometimes say `Broken pipe'?
+E3) When I have terminal escape sequences in my prompt, why does bash
wrap lines at the wrong column?
-27) How can I find the value of a shell variable whose name is the value
- of another shell variable?
-28) 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?
-29) 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?
-30) Why doesn't a while or for loop get suspended when I type ^Z?
-31) 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?
+E7) What about empty for loops in Makefiles?
+E8) Why does the arithmetic evaluation code complain about `08'?
+E9) Why does the pattern matching expression [A-Z]* match files beginning
+ with every letter except `z'?
Section F: Things to watch out for on certain Unix versions
-32) Why can't I use command line editing in my `cmdtool'?
-33) I built bash on Solaris 2. Why do globbing expansions and filename
+F1) Why can't I use command line editing in my `cmdtool'?
+F2) I built bash on Solaris 2. Why do globbing expansions and filename
completion chop off the first few characters of each filename?
-34) Why does bash dump core after I interrupt username completion or
+F3) Why does bash dump core after I interrupt username completion or
`~user' tilde expansion on a machine running NIS?
-35) I'm running SVR4.2. Why is the line erased every time I type `@'?
-36) Why does bash report syntax errors when my C News scripts use a
+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?
-37) 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?
-38) What kind of bash documentation is there?
-39) What's coming in future versions?
-40) What's on the bash `wish list'?
-41) 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
-1) What is it?
+A1) What is it?
Bash is a Unix command interpreter (shell). It is an implementation of
the Posix 1003.2 shell standard, and resembles the Korn and System V
Foundation. The current developer and maintainer is Chet Ramey
of Case Western Reserve University.
-2) What's the latest version?
+A2) What's the latest version?
-The latest version is 2.02, first made available on Monday, 20 April, 1998.
+The latest version is 2.05, first made available on Monday, 9 April 2001.
-3) Where can I get it?
+A3) Where can I get it?
Bash is the GNU project's shell, and so is available from the
-master GNU archive site, prep.ai.mit.edu, and its mirrors. 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.02:
+The following URLs tell how to get version 2.05:
-ftp://prep.ai.mit.edu/pub/gnu/bash-2.02.tar.gz
-ftp://ftp.cwru.edu/pub/bash/bash-2.02.tar.gz
+ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-2.05.tar.gz
Formatted versions of the documentation are available with the URLs:
-ftp://prep.ai.mit.edu/pub/gnu/bash-doc-2.02.tar.gz
-ftp://ftp.cwru.edu/pub/bash/bash-doc-2.02.tar.gz
+ftp://ftp.gnu.org/pub/gnu/bash/bash-doc-2.05.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-doc-2.05.tar.gz
-4) On what machines will bash run?
+A4) On what machines will bash run?
Bash has been ported to nearly every version of UNIX. All you
should have to do to build it on a machine for which a port
More information appears in the file `INSTALL' in the distribution.
-5) Will bash run on operating systems other than Unix?
+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.02 should
+LynxOS are included in the distribution. Bash-2.05 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
-project. For more information about the project, look at the URL
+The port was done by Cygnus Solutions as part of their CYGWIN
+project. For more information about the project, look at the URLs
-http://www.cygnus.com/misc/gnu-win32
+http://www.cygwin.com/
+http://sourceware.cygnus.com/cygwin
-Cygnus has ported bash-1.14.7, and their port is part of the current
-gnu-win32 release. Cygnus has also done a port of bash-2.01 to the
-GNU-Win32 environment, and it should be available as part of their next
-release.
+Cygnus originally ported bash-1.14.7, and that port was part of their
+early GNU-Win32 (the original name) releases. Cygnus has also done a
+port of bash-2.04 to the CYGWIN environment, and it is available as
+part of their current release.
-Bash-2.02 should require no local Cygnus changes to build and run under
-GNU-WIN32.
+Bash-2.05 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
ftp://ftp.gnustep.org//pub/win32/bash-alpha-nt-1.01.tar.gz
-Softway Systems has ported bash-2.01.1 to their Interix (nee OpenNT)
-system, a Unix subsystem for NT that replaces the Microsoft POSIX
-subsystem. Check out http://www.interix.com for more information.
-
-D. J. Delorie has ported bash-1.14.7 to run under MS-DOS, as part of
-the DJGPP project. For more information on the project, see
+DJ Delorie has a port of bash-1.14.7 which runs under MS-DOS, as part
+of the DJGPP project. For more information on the project, see
http://www.delorie.com/djgpp/
+I have been told that the original DJGPP port was done by Daisuke Aoyama.
+
I picked up a binary of bash-1.14.7 that is purported to work with
the DJGPP V2 environment from
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
I haven't looked at either, but the second appears to be a binary-only
distribution. Beware.
-6) How can I build bash with gcc?
+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
file INSTALL in the distribution for more information.
-7) How can I make bash my login shell?
+A7) How can I make bash my login shell?
Some machines let you use `chsh' to change your login shell. Other
systems use `passwd -s' or `passwd -e'. If one of these works for
a login shell. Once you have this working, you can copy your initialization
code from ~/.profile to ~/.bash_profile.
-8) I just changed my login shell to bash, and now I can't FTP into my
+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?
You must add the full pathname to bash to the file /etc/shells. As
Most versions of ftpd use this file to prohibit `special' users
such as `uucp' and `news' from using FTP.
-9) What's the `POSIX 1003.2 standard'?
+A9) What's the `POSIX 1003.2 standard'?
POSIX is a name originally coined by Richard Stallman for a
family of open system standards based on UNIX. There are a
standardized; emacs editing commands were left out due to
objections.
-10) What is the bash `posix mode'?
+A10) What is the bash `posix mode'?
Although bash is an implementation of the POSIX.2 shell
specification, there are areas where the bash default behavior
Section B: The latest version
-11) What's new in version 2.02?
-
-Bash-2.02 has a number of new features. Here's a short list:
+B1) What's new in version 2.05?
+
+Bash-2.05 contains the following new features (see the manual page for
+complete descriptions and the CHANGES and NEWS files in the bash-2.05
+distribution):
+
+o This version has once again reverted to using locales and strcoll(3) when
+ processing pattern matching bracket expressions, as POSIX requires.
+o Added a new `--init-file' invocation argument as a synonym for `--rcfile',
+ per the new GNU coding standards.
+o The /dev/tcp and /dev/udp redirections now accept service names as well as
+ port numbers.
+o `complete' and `compgen' now take a `-o value' option, which controls some
+ of the aspects of that compspec. Valid values are:
+
+ default - perform bash default completion if programmable
+ completion produces no matches
+ dirnames - perform directory name completion if programmable
+ completion produces no matches
+ filenames - tell readline that the compspec produces filenames,
+ so it can do things like append slashes to
+ directory names and suppress trailing spaces
+o A new loadable builtin, realpath, which canonicalizes and expands symlinks
+ in pathname arguments.
+o When `set' is called without options, it prints function defintions in a
+ way that allows them to be reused as input. This affects `declare' and
+ `declare -p' as well. This only happens when the shell is not in POSIX
+ mode, since POSIX.2 forbids this behavior.
+
+A short feature history dating from bash-2.0:
+
+Bash-2.04 introduced the following new features:
+
+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_cmd_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, had 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
+
+
+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
+ whether or not the shell was started in restricted mode
+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
+Bash may now be linked against an already-installed Readline library,
+ as long as the Readline library is version 4 or newer
+All shells begun with the `--login' option will source the login shell
+ startup files, even if the shell is not interactive
+
+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.
+
+Bash-2.02 contained the following new features:
a new version of malloc (based on the old GNU malloc code in previous
bash versions) that is more page-oriented, more conservative
lots of code now smaller and faster
test suite greatly expanded
-12) Are there any user-visible incompatibilities between bash-2.02 and
+B2) Are there any user-visible incompatibilities between bash-2.05 and
bash-1.14.7?
-There are a few incompatibilities between version 1.14.7 and version 2.02.
-They are detailed in the file COMPAT in the bash-2.02 distribution.
+There are a few incompatibilities between version 1.14.7 and version 2.05.
+They are detailed in the file COMPAT in the bash-2.05 distribution.
Section C: Differences from other Unix shells
-13) How does bash differ from sh, the Bourne shell?
+C1) How does bash differ from sh, the Bourne shell?
This is a non-comprehensive list of features that differentiate bash
from the SVR4.2 shell. The bash manual page explains these more
`!' 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})
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,
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
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
bash allows multiple option arguments when invoked (e.g. -x -v);
sh allows only a single option argument (`sh -x -v' attempts
to open a file named `-v', and, on SunOS 4.1.4, dumps core.
- On Solaris 2, sh goes into an infinite loop.)
+ On Solaris 2.4 and earlier versions, sh goes into an infinite
+ loop.)
sh exits a script if any builtin fails; bash exits only if one of
the POSIX.2 `special' builtins fails
-14) How does bash differ from the Korn shell, version ksh88?
+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,
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
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
+ trap on ERR
co-processes (|&, >&p, <&p)
weirdly-scoped functions
typeset +f to list all function names without definitions
bash has exported functions
bash command search finds functions before builtins
-15) Which new features in ksh-93 are not in bash, and which are?
+C3) Which new features in ksh-93 are not in bash, and which are?
-New things in ksh-93 not in bash-2.02:
+New things in ksh-93 not in bash-2.05:
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.02:
- ?: 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'
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
Section D: Why does bash do some things differently than other Unix shells?
-16) Why does bash run a different version of `command' than
+D1) Why does bash run a different version of `command' than
`which command' says it will?
-`which' is actually a csh script that assumes you're running csh.
-It reads the csh startup files from your home directory and uses
-those to determine which `command' will be invoked. Since bash
-doesn't use any of those startup files, there's a good chance
-that your bash environment differs from your csh environment.
+On many systems, `which' is actually a csh script that assumes
+you're running csh. In tcsh, `which' and its cousin `where'
+are builtins. On other Unix systems, `which' is a perl script
+that uses the PATH environment variable.
+
+The csh script version reads the csh startup files from your
+home directory and uses those to determine which `command' will
+be invoked. Since bash doesn't use any of those startup files,
+there's a good chance that your bash environment differs from
+your csh environment. The bash `type' builtin does everything
+`which' does, and will report correct results for the running
+shell. If you're really wedded to the name `which', try adding
+the following function definition to your .bashrc:
+
+ which()
+ {
+ builtin type "$@"
+ }
+
+If you're moving from tcsh and would like to bring `where' along
+as well, use this function:
-17) Why doesn't bash treat brace expansions exactly like csh?
+ where()
+ {
+ builtin type -a "$@"
+ }
+
+D2) Why doesn't bash treat brace expansions exactly like csh?
The only difference between bash and csh brace expansion is that
bash requires a brace expression to contain at least one unquoted
Bash, ksh, zsh, and pd-ksh all implement brace expansion this way.
-18) Why doesn't bash have csh variable modifiers?
+D3) Why doesn't bash have csh variable modifiers?
Posix has specified a more powerful, albeit somewhat more cryptic,
mechanism cribbed from ksh, and bash implements it.
$b:e ${b##*.} xxx
-19) How can I make my csh aliases work when I convert to bash?
+D4) How can I make my csh aliases work when I convert to bash?
Bash uses a different syntax to support aliases than csh does.
The details can be found in the documentation. We have provided
a shell script which does most of the work of conversion for you;
-this script can be found in ./examples/misc/alias-conv.sh. Here is
+this script can be found in ./examples/misc/aliasconv.sh. Here is
how you use it:
Start csh in the normal way for you. (e.g., `csh')
-Pipe the output of `alias' through `alias-conv.sh', saving the
+Pipe the output of `alias' through `aliasconv.sh', saving the
results into `bash_aliases':
- alias | alias-conv.sh >bash_aliases
+ alias | bash aliasconv.sh >bash_aliases
Edit `bash_aliases', carefully reading through any created
functions. You will need to change the names of some csh specific
environment, or as `cshtobash ~/.login' to convert your login
environment.
-20) How can I pipe standard output and standard error from one command to
+D5) How can I pipe standard output and standard error from one command to
another, like csh does with `|&'?
Use
file descriptor 1 points to the pipe when it is duplicated onto file
descriptor 2.
-21) Now that I've converted from ksh to bash, are there equivalents to
+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
-------------- ---------------
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?
-22) Why is the bash builtin `test' slightly different from /bin/test?
+E1) Why is the bash builtin `test' slightly different from /bin/test?
The specific example used here is [ ! x -o x ], which is false.
As you can see, the test becomes (not (x or x)), which is false.
-23) Why does bash sometimes say `Broken pipe'?
+E2) Why does bash sometimes say `Broken pipe'?
If a sequence of commands appears in a pipeline, and one of the
reading commands finishes before the writer has finished, the
will print `Broken pipe' to stderr when ps is killed by a
SIGPIPE.
-24) 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.
+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.
-25) 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.
-
-26) 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
Use the \[ escape to begin a sequence of non-printing characters,
and the \] escape to signal the end of such a sequence.
-27) How can I find the value of a shell variable whose name is the value
- of another shell variable?
-
-Bash-2.02 supports 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 bash-2.02,
-
- echo ${!#}
-
-does the same thing.
-
-28) 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
-processes.
+processes. It affects all commands run in pipelines, not just
+simple calls to `read'. For example, piping a command's output
+into a `while' loop that repeatedly calls `read' will result in
+the same behavior.
Each element of a pipeline runs in a separate process, a child of
the shell running the pipeline. A subprocess cannot affect its
This is the general approach -- in most cases you will not need to
set $IFS to a different value.
-29) 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
on. Be aware that this will cause some of the tests run when you
type `make tests' to fail.
-30) 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
within parentheses, which will force the loop into a subshell that
may be stopped (and subsequently restarted) as a single unit.
-31) How can I make the bash `time' reserved word print timing output that
- looks like the output from my system's /usr/bin/time?
+E7) What about empty for loops in Makefiles?
-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.
+It's fairly common to see constructs like this in automatically-generated
+Makefiles:
-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.
+SUBDIRS = @SUBDIRS@
-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'
+subdirs-clean:
+ for d in ${SUBDIRS}; do \
+ ( cd $$d && ${MAKE} ${MFLAGS} clean ) \
+ done
-The POSIX.2 default time format (used by `time -p command') is
+When SUBDIRS is empty, this results in a command like this being passed to
+bash:
- TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'
+ for d in ; do
+ ( cd $d && ${MAKE} ${MFLAGS} clean )
+ done
-The BSD /usr/bin/time format can be emulated with:
+This is a syntax error. If the reserved word `in' is present, a word must
+follow it before the semicolon or newline. The language in the manual page
+referring to the list of words being empty refers to the list after it is
+expanded. There must be at least one word following the `in' when the
+construct is parsed.
- TIMEFORMAT=$'\t%1R real\t%1U user\t%1S sys'
+The idiomatic Makefile solution is something like:
-The System V /usr/bin/time format can be emulated with:
+SUBDIRS = @SUBDIRS@
- TIMEFORMAT=$'\nreal\t%1R\nuser\t%1U\nsys\t%1S'
+subdirs-clean:
+ subdirs=$SUBDIRS ; for d in $$subdirs; do \
+ ( cd $$d && ${MAKE} ${MFLAGS} clean ) \
+ done
-The ksh format can be emulated with:
- TIMEFORMAT=$'\nreal\t%2lR\nuser\t%2lU\nsys\t%2lS'
+The POSIX.2 interpretation committee has considered this issue and declared
+that the bash implemenation is correct, according to the standard:
+
+http://www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-169.html
+
+E8) Why does the arithmetic evaluation code complain about `08'?
+
+The bash arithmetic evaluation code (used for `let', $(()), (()), and in
+other places), interprets a leading `0' in numeric constants as denoting
+an octal number, and a leading `0x' as denoting hexadecimal. This is
+in accordance with the POSIX.2 spec, section 2.9.2.1, which states that
+arithmetic constants should be handled as signed long integers as defined
+by the ANSI/ISO C standard.
+
+The POSIX.2 interpretation committee has confirmed this:
+
+http://www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-173.html
+
+E9) Why does the pattern matching expression [A-Z]* match files beginning
+ with every letter except `z'?
+
+Bash-2.05 and later versions have reverted to the bash-2.03 behavior of
+honoring the current locale setting when processing ranges within pattern
+matching bracket expressions ([A-Z]). This is what POSIX.2 and SUSv2/XPG5
+specify.
+
+The behavior of the matcher in bash-2.05 depends on the current LC_COLLATE
+setting. Setting this variable to `C' or `POSIX' will result in the
+traditional behavior ([A-Z] matches all uppercase ASCII characters).
+Many other locales, including the en_US locale (the default on many US
+versions of Linux) collate the upper and lower case letters like this:
+
+ AaBb...Zz
+
+which means that [A-Z] matches every letter except `z'.
+
+The portable way to specify upper case letters is [:upper:] instead of
+A-Z; lower case may be specified as [:lower:] instead of a-z.
+
+Look at the manual pages for setlocale(3), strcoll(3), and, if it is
+present, locale(1). If you have locale(1), you can use it to find
+your current locale information even if you do not have any of the
+LC_ variables set.
+
+My advice is to put
+
+ export LC_COLLATE=C
+
+into /etc/profile and inspect any shell scripts run from cron for
+constructs like [A-Z]. This will prevent things like
+
+ rm [A-Z]*
+
+from removing every file in the current directory except those beginning
+with `z' and still allow individual users to change the collation order.
+Users may put the above command into their own profiles as well, of course.
Section F: Things to watch out for on certain Unix versions
-32) Why can't I use command line editing in my `cmdtool'?
+F1) Why can't I use command line editing in my `cmdtool'?
The problem is `cmdtool' and bash fighting over the input. When
scrolling is enabled in a cmdtool window, cmdtool puts the tty in
cmdtool. If this works, you can put the assignment to TERMCAP
in your bashrc file.
-33) I built bash on Solaris 2. Why do globbing expansions and filename
+F2) I built bash on Solaris 2. Why do globbing expansions and filename
completion chop off the first few characters of each filename?
This is the consequence of building bash on SunOS 5 and linking
put /usr/ccs/bin and /opt/SUNWspro/bin into your $PATH before
/usr/ucb.
-34) Why does bash dump core after I interrupt username completion or
+F3) Why does bash dump core after I interrupt username completion or
`~user' tilde expansion on a machine running NIS?
This is a famous and long-standing bug in the SunOS YP (sorry, NIS)
run configure with the `--without-gnu-malloc' option to use
the C library malloc and avoid the problem.
-35) I'm running SVR4.2. Why is the line erased every time I type `@'?
+F4) I'm running SVR4.2. Why is the line erased every time I type `@'?
The `@' character is the default `line kill' character in most
versions of System V, including SVR4.2. You can change this
where the `^' and `U' can be two separate characters.
-36) Why does bash report syntax errors when my C News scripts use a
+F5) Why does bash report syntax errors when my C News scripts use a
redirection before a subshell command?
The actual command in question is something like
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.02 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.05 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?
-37) 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
template for reporting a problem and automatically includes
information about your configuration and build environment.
-`bashbug' sends its reports to bug-bash@prep.ai.mit.edu, which
+`bashbug' sends its reports to bug-bash@gnu.org, which
is a large mailing list gatewayed to the usenet newsgroup gnu.bash.bug.
Bug fixes, answers to questions, and announcements of new releases
and problems also take place there.
To reach the bash maintainers directly, send mail to
-bash-maintainers@prep.ai.mit.edu.
+bash-maintainers@gnu.org.
-38) 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:
bash.1 an extensive, thorough Unix-style manual page
builtins.1 a manual page covering just bash builtin commands
-bashref.texi a reference manual in GNU info format
-bash.html an HTML version of the manual page
-bashref.html an HTML version of the reference manual
+bashref.texi a reference manual in GNU tex`info format
+bashref.info an info version of the reference manual
FAQ this file
article.ms text of an article written for The Linux Journal
readline.3 a man page describing readline
-Postscript files created from the above source are available in
-the documentation distribution.
+Postscript, HTML, and ASCII files created from the above source are
+available in the documentation distribution.
There is additional documentation available for anonymous FTP from host
ftp.cwru.edu in the `pub/bash' directory.
The ISBN number is 1-56592-347-2. Look for it in the same fine bookstores
or on the web.
-39) 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
+a bash debugger (a minimally-tested version is included with bash-2.05)
+associative arrays
+changes to the DEBUG trap to be compatible with ksh93 (which runs the
+trap before each simple command, instead of after each one like previous
+versions)
+an implementation of the ksh-like ERR trap
-40) 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 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)
-41) When will the next release appear?
+H5) When will the next release appear?
-The next version will appear sometime in 1998. Never make
+The next version will appear sometime in 2001 or 2002. Never make
predictions.
-This document is Copyright 1995, 1996, 1998 by Chester Ramey.
+This document is Copyright 1995-2001 by Chester Ramey.
Permission is hereby granted, without written agreement and
without license or royalty fees, to use, copy, and distribute