1 This document details the incompatibilites between this version of bash,
2 bash-3.0, and a previous widely-available version, bash-1.14 (which
3 is still the `standard' version for a few Linux distributions). These
4 were discovered by users of bash-2.x and 3.x, so this list is not
5 comprehensive. Some of these incompatibilities occur between the current
6 version and versions 2.0 and above. (The differences between bash-1.14
7 and bash-2.0 were significant.)
9 1. Bash uses a new quoting syntax, $"...", to do locale-specific
10 string translation. Users who have relied on the (undocumented)
11 behavior of bash-1.14 will have to change their scripts. For
12 instance, if you are doing something like this to get the value of
13 a variable whose name is the value of a second variable:
17 you will have to change to a different syntax.
19 This capability is directly supported by bash-2.0:
23 This alternate syntax will work portably between bash-1.14 and bash-2.0:
27 2. One of the bugs fixed in the YACC grammar tightens up the rules
28 concerning group commands ( {...} ). The `list' that composes the
29 body of the group command must be terminated by a newline or
30 semicolon. That's because the braces are reserved words, and are
31 recognized as such only when a reserved word is legal. This means
32 that while bash-1.14 accepted shell function definitions like this:
36 bash-2.0 requires this:
40 This is also an issue for commands like this:
42 mkdir dir || { echo 'could not mkdir' ; exit 1; }
44 The syntax required by bash-2.0 is also accepted by bash-1.14.
46 3. The options to `bind' have changed to make them more consistent with
47 the rest of the bash builtins. If you are using `bind -d' to list
48 the readline key bindings in a form that can be re-read, use `bind -p'
49 instead. If you were using `bind -v' to list the key bindings, use
52 4. The `long' invocation options must now be prefixed by `--' instead
53 of `-'. (The old form is still accepted, for the time being.)
55 5. There was a bug in the version of readline distributed with bash-1.14
56 that caused it to write badly-formatted key bindings when using
57 `bind -d'. The only key sequences that were affected are C-\ (which
58 should appear as \C-\\ in a key binding) and C-" (which should appear
59 as \C-\"). If these key sequences appear in your inputrc, as, for
64 they will need to be changed to something like the following:
68 6. A number of people complained about having to use ESC to terminate an
69 incremental search, and asked for an alternate mechanism. Bash-2.03
70 uses the value of the settable readline variable `isearch-terminators'
71 to decide which characters should terminate an incremental search. If
72 that variable has not been set, ESC and Control-J will terminate a
75 7. Some variables have been removed: MAIL_WARNING, notify, history_control,
76 command_oriented_history, glob_dot_filenames, allow_null_glob_expansion,
77 nolinks, hostname_completion_file, noclobber, no_exit_on_failed_exec, and
78 cdable_vars. Most of them are now implemented with the new `shopt'
79 builtin; others were already implemented by `set'. Here is a list of
82 MAIL_WARNING shopt mailwarn
84 history_control HISTCONTROL
85 command_oriented_history shopt cmdhist
86 glob_dot_filenames shopt dotglob
87 allow_null_glob_expansion shopt nullglob
88 nolinks set -o physical
89 hostname_completion_file HOSTFILE
90 noclobber set -o noclobber
91 no_exit_on_failed_exec shopt execfail
92 cdable_vars shopt cdable_vars
94 8. `ulimit' now sets both hard and soft limits and reports the soft limit
95 by default (when neither -H nor -S is specified). This is compatible
96 with versions of sh and ksh that implement `ulimit'. The bash-1.14
97 behavior of, for example,
105 It may be useful to define an alias:
107 alias ulimit="ulimit -S"
109 9. Bash-2.01 uses a new quoting syntax, $'...' to do ANSI-C string
110 translation. Backslash-escaped characters in ... are expanded and
111 replaced as specified by the ANSI C standard.
113 10. The sourcing of startup files has changed somewhat. This is explained
114 more completely in the INVOCATION section of the manual page.
116 A non-interactive shell not named `sh' and not in posix mode reads
117 and executes commands from the file named by $BASH_ENV. A
118 non-interactive shell started by `su' and not in posix mode will read
119 startup files. No other non-interactive shells read any startup files.
121 An interactive shell started in posix mode reads and executes commands
122 from the file named by $ENV.
124 11. The <> redirection operator was changed to conform to the POSIX.2 spec.
125 In the absence of any file descriptor specification preceding the `<>',
126 file descriptor 0 is used. In bash-1.14, this was the behavior only
127 when in POSIX mode. The bash-1.14 behavior may be obtained with
131 12. The `alias' builtin now checks for invalid options and takes a `-p'
132 option to display output in POSIX mode. If you have old aliases beginning
133 with `-' or `+', you will have to add the `--' to the alias command
136 alias -x='chmod a-x' --> alias -- -x='chmod a-x'
138 13. The behavior of range specificiers within bracket matching expressions
139 in the pattern matcher (e.g., [A-Z]) depends on the current locale,
140 specifically the value of the LC_COLLATE environment variable. Setting
141 this variable to C or POSIX will result in the traditional ASCII behavior
142 for range comparisons. If the locale is set to something else, e.g.,
143 en_US (specified by the LANG or LC_ALL variables), collation order is
144 locale-dependent. For example, the en_US locale sorts the upper and
145 lower case letters like this:
149 so a range specification like [A-Z] will match every letter except `z'.
150 Other locales collate like
154 which means that [A-Z] matches every letter except `a'.
156 The portable way to specify upper case letters is [:upper:] instead of
157 A-Z; lower case may be specified as [:lower:] instead of a-z.
159 Look at the manual pages for setlocale(3), strcoll(3), and, if it is
162 You can find your current locale information by running locale(1):
164 caleb.ins.cwru.edu(2)$ locale
178 into /etc/profile and inspect any shell scripts run from cron for
179 constructs like [A-Z]. This will prevent things like
183 from removing every file in the current directory except those beginning
184 with `z' and still allow individual users to change the collation order.
185 Users may put the above command into their own profiles as well, of course.
187 14. Bash versions up to 1.14.7 included an undocumented `-l' operator to
188 the `test/[' builtin. It was a unary operator that expanded to the
189 length of its string argument. This let you do things like
191 test -l $variable -lt 20
195 This was included for backwards compatibility with old versions of the
196 Bourne shell, which did not provide an easy way to obtain the length of
197 the value of a shell variable.
199 This operator is not part of the POSIX standard, because one can (and
200 should) use ${#variable} to get the length of a variable's value.
201 Bash-2.x does not support it.
203 15. Bash no longer auto-exports the HOME, PATH, SHELL, TERM, HOSTNAME,
204 HOSTTYPE, MACHTYPE, or OSTYPE variables.
206 16. Bash no longer initializes the FUNCNAME, GROUPS, or DIRSTACK variables
207 to have special behavior if they appear in the initial environment.
209 17. Bash no longer removes the export attribute from the SSH_CLIENT or
210 SSH2_CLIENT variables, and no longer attempts to discover whether or
211 not it has been invoked by sshd in order to run the startup files.
213 18. Bash no longer requires that the body of a function be a group command;
214 any compound command is accepted.