1This document details the incompatibilities between this version of bash,
2bash-4.0, and the previous widely-available versions, bash-1.14 (which is
3still the `standard' version for a few Linux distributions) and bash-2.x. 
4These were discovered by users of bash-2.x and 3.x, so this list is not
5comprehensive.  Some of these incompatibilities occur between the current
6version and versions 2.0 and above.  (The differences between bash-1.14 and
7bash-2.0 were significant.)
8
91.  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:
14
15	eval var2=$"$var1"
16
17    you will have to change to a different syntax.
18
19    This capability is directly supported by bash-2.0:
20
21	var2=${!var1}
22
23    This alternate syntax will work portably between bash-1.14 and bash-2.0:
24
25	eval var2=\$${var1}
26
272.  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:
33
34	foo() { : }
35
36    bash-2.0 requires this:
37
38	foo() { :; }
39
40    This is also an issue for commands like this:
41
42	mkdir dir || { echo 'could not mkdir' ; exit 1; }
43
44    The syntax required by bash-2.0 is also accepted by bash-1.14.
45
463.  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
50    `bind -P' instead.
51
524.  The `long' invocation options must now be prefixed by `--' instead
53    of `-'.  (The old form is still accepted, for the time being.)
54
555.  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
60    example,
61
62	"\C-\": self-insert
63
64    they will need to be changed to something like the following:
65
66	"\C-\\": self-insert
67
686.  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
73    search.
74
757.  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
80    correspondences:
81
82	MAIL_WARNING			shopt mailwarn
83	notify				set -o notify
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
93
948. `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,
98
99		ulimit -c 0
100
101    can be obtained with
102
103		ulimit -S -c 0
104
105    It may be useful to define an alias:
106
107		alias ulimit="ulimit -S"
108
1099.  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.
112
11310. The sourcing of startup files has changed somewhat.  This is explained
114    more completely in the INVOCATION section of the manual page.
115
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.
120
121    An interactive shell started in posix mode reads and executes commands
122    from the file named by $ENV.
123
12411. 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
128
129	<>filename 1>&0
130
13112. 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
134    that declares them:
135
136	alias -x='chmod a-x' --> alias -- -x='chmod a-x'
137
13813. 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:
146
147	AaBb...Zz
148
149    so a range specification like [A-Z] will match every letter except `z'.
150    Other locales collate like
151
152        aAbBcC...zZ
153
154    which means that [A-Z] matches every letter except `a'.
155
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.
158
159    Look at the manual pages for setlocale(3), strcoll(3), and, if it is
160    present, locale(1).
161
162    You can find your current locale information by running locale(1):
163
164	caleb.ins.cwru.edu(2)$ locale
165	LANG=en_US
166	LC_CTYPE="en_US"
167	LC_NUMERIC="en_US"
168	LC_TIME="en_US"
169	LC_COLLATE="en_US"
170	LC_MONETARY="en_US"
171	LC_MESSAGES="en_US"
172	LC_ALL=en_US
173
174    My advice is to put
175
176	export LC_COLLATE=C
177
178    into /etc/profile and inspect any shell scripts run from cron for
179    constructs like [A-Z].  This will prevent things like
180
181	rm [A-Z]*
182
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.
186
18714. 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
190
191	test -l $variable -lt 20
192
193    for example.
194
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.
198
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.
202
20315. Bash no longer auto-exports the HOME, PATH, SHELL, TERM, HOSTNAME,
204    HOSTTYPE, MACHTYPE, or OSTYPE variables.  If they appear in the initial
205    environment, the export attribute will be set, but if bash provides a
206    default value, they will remain local to the current shell.
207
20816. Bash no longer initializes the FUNCNAME, GROUPS, or DIRSTACK variables
209    to have special behavior if they appear in the initial environment.
210
21117. Bash no longer removes the export attribute from the SSH_CLIENT or
212    SSH2_CLIENT variables, and no longer attempts to discover whether or
213    not it has been invoked by sshd in order to run the startup files.
214
21518. Bash no longer requires that the body of a function be a group command;
216    any compound command is accepted.
217
21819. As of bash-3.0, the pattern substitution operators no longer perform
219    quote removal on the pattern before attempting the match.  This is the
220    way the pattern removal functions behave, and is more consistent.
221
22220. After bash-3.0 was released, I reimplemented tilde expansion, incorporating
223    it into the mainline word expansion code.  This fixes the bug that caused
224    the results of tilde expansion to be re-expanded.  There is one
225    incompatibility:  a ${paramOPword} expansion within double quotes will not
226    perform tilde expansion on WORD.  This is consistent with the other
227    expansions, and what POSIX specifies.
228
22921. A number of variables have the integer attribute by default, so the +=
230    assignment operator returns expected results: RANDOM, LINENO, MAILCHECK,
231    HISTCMD, OPTIND.
232
23322. Bash-3.x is much stricter about $LINENO correctly reflecting the line
234    number in a script; assignments to LINENO have little effect.
235
23623. By default, readline binds the terminal special characters to their
237    readline equivalents.  As of bash-3.1/readline-5.1, this is optional and
238    controlled by the bind-tty-special-chars readline variable.
239
24024. The \W prompt string expansion abbreviates $HOME as `~'.  The previous
241    behavior is available with ${PWD##/*/}.
242
24325. The arithmetic exponentiation operator is right-associative as of bash-3.1.
244
24526. The rules concerning valid alias names are stricter, as per POSIX.2.
246
24727. The Readline key binding functions now obey the convert-meta setting active
248    when the binding takes place, as the dispatch code does when characters
249    are read and processed.
250
25128. The historical behavior of `trap' reverting signal disposition to the
252    original handling in the absence of a valid first argument is implemented
253    only if the first argument is a valid signal number.
254
25529. In versions of bash after 3.1, the ${parameter//pattern/replacement}
256    expansion does not interpret `%' or `#' specially.  Those anchors don't
257    have any real meaning when replacing every match.
258
25930. Beginning with bash-3.1, the combination of posix mode and enabling the
260    `xpg_echo' option causes echo to ignore all options, not looking for `-n'
261
26231. Beginning with bash-3.2, bash follows the Bourne-shell-style (and POSIX-
263    style) rules for parsing the contents of old-style backquoted command
264    substitutions.  Previous versions of bash attempted to recursively parse
265    embedded quoted strings and shell constructs; bash-3.2 uses strict POSIX
266    rules to find the closing backquote and simply passes the contents of the
267    command substitution to a subshell for parsing and execution.
268
26932. Beginning with bash-3.2, bash uses access(2) when executing primaries for
270    the test builtin and the [[ compound command, rather than looking at the
271    file permission bits obtained with stat(2).  This obeys restrictions of
272    the file system (e.g., read-only or noexec mounts) not available via stat.
273
27433. Bash-3.2 adopts the convention used by other string and pattern matching
275    operators for the `[[' compound command, and matches any quoted portion
276    of the right-hand-side argument to the =~ operator as a string rather
277    than a regular expression.
278
27934. Bash-4.0 allows the behavior in the previous item to be modified using
280    the notion of a shell `compatibility level'.
281
28235. Bash-3.2 (patched) and Bash-4.0 fix a bug that leaves the shell in an
283    inconsistent internal state following an assignment error.  One of the
284    changes means that compound commands or { ... } grouping commands are
285    aborted under some circumstances in which they previously were not.
286    This is what Posix specifies.
287
28836. Bash-4.0 now allows process substitution constructs to pass unchanged
289    through brace expansion, so any expansion of the contents will have to be
290    separately specified, and each process subsitution will have to be
291    separately entered.
292
29337. Bash-4.0 now allows SIGCHLD to interrupt the wait builtin, as Posix
294    specifies, so the SIGCHLD trap is no longer always invoked once per
295    exiting child if you are using `wait' to wait for all children.
296
29738. Since bash-4.0 now follows Posix rules for finding the closing delimiter
298    of a $() command substitution, it will not behave as previous versions
299    did, but will catch more syntax and parsing errors before spawning a
300    subshell to evaluate the command substitution.
301
30239. The programmable completion code uses the same set of delimiting characters
303    as readline when breaking the command line into words, rather than the
304    set of shell metacharacters, so programmable completion and readline
305    should be more consistent.
306
30740. When the read builtin times out, it attempts to assign any input read to
308    specified variables, which also causes variables to be set to the empty
309    string if there is not enough input.  Previous versions discarded the
310    characters read.
311
31241. Beginning with bash-4.0, when one of the commands in a pipeline is killed
313    by a SIGINT while executing a command list, the shell acts as if it
314    received the interrupt.
315
31642. Bash-4.0 changes the handling of the set -e option so that the shell exits
317    if a pipeline fails (and not just if the last command in the failing
318    pipeline is a simple command).  This is not as Posix specifies.  There is
319    work underway to update this portion of the standard; the bash-4.0
320    behavior attempts to capture the consensus at the time of release.
321