1
Compatibility with previous versions
2
====================================
4
This document details the incompatibilities between this version of bash,
5
bash-4.3, and the previous widely-available versions, bash-3.x (which is
6
still the `standard' version for Mac OS X), 4.0/4.1 (which are still
7
standard on a few Linux distributions), and bash-4.2, the current
8
widely-available version. These were discovered by users of bash-2.x
9
through 4.x, so this list is not comprehensive. Some of these
10
incompatibilities occur between the current version and versions 2.0 and
13
1. Bash uses a new quoting syntax, $"...", to do locale-specific
14
string translation. Users who have relied on the (undocumented)
15
behavior of bash-1.14 will have to change their scripts. For
16
instance, if you are doing something like this to get the value of
17
a variable whose name is the value of a second variable:
21
you will have to change to a different syntax.
23
This capability is directly supported by bash-2.0:
27
This alternate syntax will work portably between bash-1.14 and bash-2.0:
31
2. One of the bugs fixed in the YACC grammar tightens up the rules
32
concerning group commands ( {...} ). The `list' that composes the
33
body of the group command must be terminated by a newline or
34
semicolon. That's because the braces are reserved words, and are
35
recognized as such only when a reserved word is legal. This means
36
that while bash-1.14 accepted shell function definitions like this:
40
bash-2.0 requires this:
44
This is also an issue for commands like this:
46
mkdir dir || { echo 'could not mkdir' ; exit 1; }
48
The syntax required by bash-2.0 is also accepted by bash-1.14.
50
3. The options to `bind' have changed to make them more consistent with
51
the rest of the bash builtins. If you are using `bind -d' to list
52
the readline key bindings in a form that can be re-read, use `bind -p'
53
instead. If you were using `bind -v' to list the key bindings, use
56
4. The `long' invocation options must now be prefixed by `--' instead
57
of `-'. (The old form is still accepted, for the time being.)
59
5. There was a bug in the version of readline distributed with bash-1.14
60
that caused it to write badly-formatted key bindings when using
61
`bind -d'. The only key sequences that were affected are C-\ (which
62
should appear as \C-\\ in a key binding) and C-" (which should appear
63
as \C-\"). If these key sequences appear in your inputrc, as, for
68
they will need to be changed to something like the following:
72
6. A number of people complained about having to use ESC to terminate an
73
incremental search, and asked for an alternate mechanism. Bash-2.03
74
uses the value of the settable readline variable `isearch-terminators'
75
to decide which characters should terminate an incremental search. If
76
that variable has not been set, ESC and Control-J will terminate a
79
7. Some variables have been removed: MAIL_WARNING, notify, history_control,
80
command_oriented_history, glob_dot_filenames, allow_null_glob_expansion,
81
nolinks, hostname_completion_file, noclobber, no_exit_on_failed_exec, and
82
cdable_vars. Most of them are now implemented with the new `shopt'
83
builtin; others were already implemented by `set'. Here is a list of
86
MAIL_WARNING shopt mailwarn
88
history_control HISTCONTROL
89
command_oriented_history shopt cmdhist
90
glob_dot_filenames shopt dotglob
91
allow_null_glob_expansion shopt nullglob
92
nolinks set -o physical
93
hostname_completion_file HOSTFILE
94
noclobber set -o noclobber
95
no_exit_on_failed_exec shopt execfail
96
cdable_vars shopt cdable_vars
98
8. `ulimit' now sets both hard and soft limits and reports the soft limit
99
by default (when neither -H nor -S is specified). This is compatible
100
with versions of sh and ksh that implement `ulimit'. The bash-1.14
101
behavior of, for example,
109
It may be useful to define an alias:
111
alias ulimit="ulimit -S"
113
9. Bash-2.01 uses a new quoting syntax, $'...' to do ANSI-C string
114
translation. Backslash-escaped characters in ... are expanded and
115
replaced as specified by the ANSI C standard.
117
10. The sourcing of startup files has changed somewhat. This is explained
118
more completely in the INVOCATION section of the manual page.
120
A non-interactive shell not named `sh' and not in posix mode reads
121
and executes commands from the file named by $BASH_ENV. A
122
non-interactive shell started by `su' and not in posix mode will read
123
startup files. No other non-interactive shells read any startup files.
125
An interactive shell started in posix mode reads and executes commands
126
from the file named by $ENV.
128
11. The <> redirection operator was changed to conform to the POSIX.2 spec.
129
In the absence of any file descriptor specification preceding the `<>',
130
file descriptor 0 is used. In bash-1.14, this was the behavior only
131
when in POSIX mode. The bash-1.14 behavior may be obtained with
135
12. The `alias' builtin now checks for invalid options and takes a `-p'
136
option to display output in POSIX mode. If you have old aliases beginning
137
with `-' or `+', you will have to add the `--' to the alias command
140
alias -x='chmod a-x' --> alias -- -x='chmod a-x'
142
13. The behavior of range specificiers within bracket matching expressions
143
in the pattern matcher (e.g., [A-Z]) depends on the current locale,
144
specifically the value of the LC_COLLATE environment variable. Setting
145
this variable to C or POSIX will result in the traditional ASCII behavior
146
for range comparisons. If the locale is set to something else, e.g.,
147
en_US (specified by the LANG or LC_ALL variables), collation order is
148
locale-dependent. For example, the en_US locale sorts the upper and
149
lower case letters like this:
153
so a range specification like [A-Z] will match every letter except `z'.
154
Other locales collate like
158
which means that [A-Z] matches every letter except `a'.
160
The portable way to specify upper case letters is [:upper:] instead of
161
A-Z; lower case may be specified as [:lower:] instead of a-z.
163
Look at the manual pages for setlocale(3), strcoll(3), and, if it is
166
You can find your current locale information by running locale(1):
168
caleb.ins.cwru.edu(2)$ locale
182
into /etc/profile and inspect any shell scripts run from cron for
183
constructs like [A-Z]. This will prevent things like
187
from removing every file in the current directory except those beginning
188
with `z' and still allow individual users to change the collation order.
189
Users may put the above command into their own profiles as well, of course.
191
14. Bash versions up to 1.14.7 included an undocumented `-l' operator to
192
the `test/[' builtin. It was a unary operator that expanded to the
193
length of its string argument. This let you do things like
195
test -l $variable -lt 20
199
This was included for backwards compatibility with old versions of the
200
Bourne shell, which did not provide an easy way to obtain the length of
201
the value of a shell variable.
203
This operator is not part of the POSIX standard, because one can (and
204
should) use ${#variable} to get the length of a variable's value.
205
Bash-2.x does not support it.
207
15. Bash no longer auto-exports the HOME, PATH, SHELL, TERM, HOSTNAME,
208
HOSTTYPE, MACHTYPE, or OSTYPE variables. If they appear in the initial
209
environment, the export attribute will be set, but if bash provides a
210
default value, they will remain local to the current shell.
212
16. Bash no longer initializes the FUNCNAME, GROUPS, or DIRSTACK variables
213
to have special behavior if they appear in the initial environment.
215
17. Bash no longer removes the export attribute from the SSH_CLIENT or
216
SSH2_CLIENT variables, and no longer attempts to discover whether or
217
not it has been invoked by sshd in order to run the startup files.
219
18. Bash no longer requires that the body of a function be a group command;
220
any compound command is accepted.
222
19. As of bash-3.0, the pattern substitution operators no longer perform
223
quote removal on the pattern before attempting the match. This is the
224
way the pattern removal functions behave, and is more consistent.
226
20. After bash-3.0 was released, I reimplemented tilde expansion, incorporating
227
it into the mainline word expansion code. This fixes the bug that caused
228
the results of tilde expansion to be re-expanded. There is one
229
incompatibility: a ${paramOPword} expansion within double quotes will not
230
perform tilde expansion on WORD. This is consistent with the other
231
expansions, and what POSIX specifies.
233
21. A number of variables have the integer attribute by default, so the +=
234
assignment operator returns expected results: RANDOM, LINENO, MAILCHECK,
237
22. Bash-3.x is much stricter about $LINENO correctly reflecting the line
238
number in a script; assignments to LINENO have little effect.
240
23. By default, readline binds the terminal special characters to their
241
readline equivalents. As of bash-3.1/readline-5.1, this is optional and
242
controlled by the bind-tty-special-chars readline variable.
244
24. The \W prompt string expansion abbreviates $HOME as `~'. The previous
245
behavior is available with ${PWD##/*/}.
247
25. The arithmetic exponentiation operator is right-associative as of bash-3.1.
249
26. The rules concerning valid alias names are stricter, as per POSIX.2.
251
27. The Readline key binding functions now obey the convert-meta setting active
252
when the binding takes place, as the dispatch code does when characters
253
are read and processed.
255
28. The historical behavior of `trap' reverting signal disposition to the
256
original handling in the absence of a valid first argument is implemented
257
only if the first argument is a valid signal number.
259
29. In versions of bash after 3.1, the ${parameter//pattern/replacement}
260
expansion does not interpret `%' or `#' specially. Those anchors don't
261
have any real meaning when replacing every match.
263
30. Beginning with bash-3.1, the combination of posix mode and enabling the
264
`xpg_echo' option causes echo to ignore all options, not looking for `-n'
266
31. Beginning with bash-3.2, bash follows the Bourne-shell-style (and POSIX-
267
style) rules for parsing the contents of old-style backquoted command
268
substitutions. Previous versions of bash attempted to recursively parse
269
embedded quoted strings and shell constructs; bash-3.2 uses strict POSIX
270
rules to find the closing backquote and simply passes the contents of the
271
command substitution to a subshell for parsing and execution.
273
32. Beginning with bash-3.2, bash uses access(2) when executing primaries for
274
the test builtin and the [[ compound command, rather than looking at the
275
file permission bits obtained with stat(2). This obeys restrictions of
276
the file system (e.g., read-only or noexec mounts) not available via stat.
278
33. Bash-3.2 adopts the convention used by other string and pattern matching
279
operators for the `[[' compound command, and matches any quoted portion
280
of the right-hand-side argument to the =~ operator as a string rather
281
than a regular expression.
283
34. Bash-4.0 allows the behavior in the previous item to be modified using
284
the notion of a shell `compatibility level'. If the compat31 shopt
285
option is set, quoting the pattern has no special effect.
287
35. Bash-3.2 (patched) and Bash-4.0 fix a bug that leaves the shell in an
288
inconsistent internal state following an assignment error. One of the
289
changes means that compound commands or { ... } grouping commands are
290
aborted under some circumstances in which they previously were not.
291
This is what Posix specifies.
293
36. Bash-4.0 now allows process substitution constructs to pass unchanged
294
through brace expansion, so any expansion of the contents will have to be
295
separately specified, and each process subsitution will have to be
298
37. Bash-4.0 now allows SIGCHLD to interrupt the wait builtin, as Posix
299
specifies, so the SIGCHLD trap is no longer always invoked once per
300
exiting child if you are using `wait' to wait for all children. As
301
of bash-4.2, this is the status quo only when in posix mode.
303
38. Since bash-4.0 now follows Posix rules for finding the closing delimiter
304
of a $() command substitution, it will not behave as previous versions
305
did, but will catch more syntax and parsing errors before spawning a
306
subshell to evaluate the command substitution.
308
39. The programmable completion code uses the same set of delimiting characters
309
as readline when breaking the command line into words, rather than the
310
set of shell metacharacters, so programmable completion and readline
311
should be more consistent.
313
40. When the read builtin times out, it attempts to assign any input read to
314
specified variables, which also causes variables to be set to the empty
315
string if there is not enough input. Previous versions discarded the
318
41. Beginning with bash-4.0, when one of the commands in a pipeline is killed
319
by a SIGINT while executing a command list, the shell acts as if it
320
received the interrupt. This can be disabled by setting the compat31 or
321
compat32 shell options.
323
42. Bash-4.0 changes the handling of the set -e option so that the shell exits
324
if a pipeline fails (and not just if the last command in the failing
325
pipeline is a simple command). This is not as Posix specifies. There is
326
work underway to update this portion of the standard; the bash-4.0
327
behavior attempts to capture the consensus at the time of release.
329
43. Bash-4.0 fixes a Posix mode bug that caused the . (source) builtin to
330
search the current directory for its filename argument, even if "." is
331
not in $PATH. Posix says that the shell shouldn't look in $PWD in this
334
44. Bash-4.1 uses the current locale when comparing strings using the < and
335
> operators to the `[[' command. This can be reverted to the previous
336
behavior (ASCII collating and strcmp(3)) by setting one of the
337
`compatNN' shopt options, where NN is less than 41.
339
45. Bash-4.1 conforms to the current Posix specification for `set -u':
340
expansions of $@ and $* when there are no positional parameters do not
341
cause the shell to exit.
343
46. Bash-4.1 implements the current Posix specification for `set -e' and
344
exits when any command fails, not just a simple command or pipeline.
346
47. Command substitutions now remove the caller's trap strings when trap is
347
run to set a new trap in the subshell. Previous to bash-4.2, the old
348
trap strings persisted even though the actual signal handlers were reset.
350
48. When in Posix mode, a single quote is not treated specially in a
351
double-quoted ${...} expansion, unless the expansion operator is
352
# or % or the new `//', `^', or `,' expansions. In particular, it
353
does not define a new quoting context. This is from Posix interpretation
356
49. Posix mode shells no longer exit if a variable assignment error occurs
357
with an assignment preceding a command that is not a special builtin.
359
50. Bash-4.2 attempts to preserve what the user typed when performing word
360
completion, instead of, for instance, expanding shell variable
361
references to their value.
363
51. When in Posix mode, bash-4.2 exits if the filename supplied as an argument
364
to `.' is not found and the shell is not interactive.
366
52. When compiled for strict Posix compatibility, bash-4.3 does not enable
367
history expansion by default in interactive shells, since it results in
368
a non-conforming environment.
370
53. Bash-4.3 runs the replacement string in the pattern substitution word
371
expansion through quote removal. The code already treats quote
372
characters in the replacement string as special; if it treats them as
373
special, then quote removal should remove them.
375
Shell Compatibility Level
376
=========================
378
Bash-4.0 introduced the concept of a `shell compatibility level', specified
379
as a set of options to the shopt builtin (compat31, compat32, compat40,
380
compat41, and compat42 at this writing). There is only one current
381
compatibility level -- each option is mutually exclusive. This list does not
382
mention behavior that is standard for a particular version (e.g., setting
383
compat32 means that quoting the rhs of the regexp matching operator quotes
384
special regexp characters in the word, which is default behavior in bash-3.2
387
Bash-4.3 introduces a new shell variable: BASH_COMPAT. The value assigned
388
to this variable (a decimal version number like 4.2, or an integer
389
corresponding to the compatNN option, like 42) determines the compatibility
393
- the < and > operators to the [[ command do not consider the current
394
locale when comparing strings; they use ASCII ordering
395
- quoting the rhs of the regexp matching operator (=~) has no
399
- the < and > operators to the [[ command do not consider the current
400
locale when comparing strings; they use ASCII ordering
403
- the < and > operators to the [[ command do not consider the current
404
locale when comparing strings; they use ASCII ordering
405
- interrupting a command list such as "a ; b ; c" causes the execution
406
of the entire list to be aborted (in versions before bash-4.0,
407
interrupting one command in a list caused the next to be executed)
410
- interrupting a command list such as "a ; b ; c" causes the execution
411
of the entire list to be aborted (in versions before bash-4.1,
412
interrupting one command in a list caused the next to be executed)
413
- when in posix mode, single quotes in the `word' portion of a
414
double-quoted parameter expansion define a new quoting context and
415
are treated specially
418
- the replacement string in double-quoted pattern substitution is not
419
run through quote removal, as in previous versions
420
-------------------------------------------------------------------------------
422
Copying and distribution of this file, with or without modification,
423
are permitted in any medium without royalty provided the copyright
424
notice and this notice are preserved. This file is offered as-is,
425
without any warranty.