]> git.ipfire.org Git - thirdparty/bash.git/blob - COMPAT
Imported from ../bash-2.05.tar.gz.
[thirdparty/bash.git] / COMPAT
1 This document details the incompatibilites between this version of bash,
2 bash-2.05, and the previous widely-available version, bash-1.14 (which
3 is still the `standard' version for many Linux distributions). These
4 were discovered by users of bash-2.x, so this list is not comprehensive.
5
6 1. Bash now uses a new quoting syntax, $"...", to do locale-specific
7 string translation. Users who have relied on the (undocumented)
8 behavior of bash-1.14 will have to change their scripts. For
9 instance, if you are doing something like this to get the value of
10 a variable whose name is the value of a second variable:
11
12 eval var2=$"$var1"
13
14 you will have to change to a different syntax.
15
16 This capability is directly supported by bash-2.0:
17
18 var2=${!var1}
19
20 This alternate syntax will work portably between bash-1.14 and bash-2.0:
21
22 eval var2=\$${var1}
23
24 2. One of the bugs fixed in the YACC grammar tightens up the rules
25 concerning group commands ( {...} ). The `list' that composes the
26 body of the group command must be terminated by a newline or
27 semicolon. That's because the braces are reserved words, and are
28 recognized as such only when a reserved word is legal. This means
29 that while bash-1.14 accepted shell function definitions like this:
30
31 foo() { : }
32
33 bash-2.0 requires this:
34
35 foo() { :; }
36
37 This is also an issue for commands like this:
38
39 mkdir dir || { echo 'could not mkdir' ; exit 1; }
40
41 The syntax required by bash-2.0 is also accepted by bash-1.14.
42
43 3. The options to `bind' have changed to make them more consistent with
44 the rest of the bash builtins. If you are using `bind -d' to list
45 the readline keybindings in a form that can be re-read, use `bind -p'
46 instead. If you were using `bind -v' to list the keybindings, use
47 `bind -P' instead.
48
49 4. The `long' invocation options must now be prefixed by `--' instead
50 of `-'. (The old form is still accepted, for the time being.)
51
52 5. There was a bug in the version of readline distributed with bash-1.14
53 that caused it to write badly-formatted key bindings when using
54 `bind -d'. The only key sequences that were affected are C-\ (which
55 should appear as \C-\\ in a key binding) and C-" (which should appear
56 as \C-\"). If these key sequences appear in your inputrc, as, for
57 example,
58
59 "\C-\": self-insert
60
61 they will need to be changed to something like the following:
62
63 "\C-\\": self-insert
64
65 6. A number of people complained above having to use ESC to terminate an
66 incremental search, and asked for an alternate mechanism. Bash-2.03
67 uses the value of the settable readline variable `isearch-terminators'
68 to decide which characters should terminate an incremental search. If
69 that variable has not been set, ESC and Control-J will terminate a
70 search.
71
72 7. Some variables have been removed: MAIL_WARNING, notify, history_control,
73 command_oriented_history, glob_dot_filenames, allow_null_glob_expansion,
74 nolinks, hostname_completion_file, noclobber, no_exit_on_failed_exec, and
75 cdable_vars. Most of them are now implemented with the new `shopt'
76 builtin; others were already implemented by `set'. Here is a list of
77 correspondences:
78
79 MAIL_WARNING shopt mailwarn
80 notify set -o notify
81 history_control HISTCONTROL
82 command_oriented_history shopt cmdhist
83 glob_dot_filenames shopt dotglob
84 allow_null_glob_expansion shopt nullglob
85 nolinks set -o physical
86 hostname_completion_file HOSTFILE
87 noclobber set -o noclobber
88 no_exit_on_failed_exec shopt execfail
89 cdable_vars shopt cdable_vars
90
91 8. `ulimit' now sets both hard and soft limits and reports the soft limit
92 by default (when neither -H nor -S is specified). This is compatible
93 with versions of sh and ksh that implement `ulimit'. The bash-1.14
94 behavior of, for example,
95
96 ulimit -c 0
97
98 can be obtained with
99
100 ulimit -S -c 0
101
102 It may be useful to define an alias:
103
104 alias ulimit="ulimit -S"
105
106 9. Bash-2.01 uses a new quoting syntax, $'...' to do ANSI-C string
107 translation. Backslash-escaped characters in ... are expanded and
108 replaced as specified by the ANSI C standard.
109
110 10. The sourcing of startup files has changed somewhat. This is explained
111 more completely in the INVOCATION section of the manual page.
112
113 A non-interactive shell not named `sh' and not in posix mode reads
114 and executes commands from the file named by $BASH_ENV. A
115 non-interactive shell started by `su' and not in posix mode will read
116 startup files. No other non-interactive shells read any startup files.
117
118 An interactive shell started in posix mode reads and executes commands
119 from the file named by $ENV.
120
121 11. The <> redirection operator was changed to conform to the POSIX.2 spec.
122 In the absence of any file descriptor specification preceding the `<>',
123 file descriptor 0 is used. In bash-1.14, this was the behavior only
124 when in POSIX mode. The bash-1.14 behavior may be obtained with
125
126 <>filename 1>&0
127
128 12. The `alias' builtin now checks for invalid options and takes a `-p'
129 option to display output in POSIX mode. If you have old aliases beginning
130 with `-' or `+', you will have to add the `--' to the alias command
131 that declares them:
132
133 alias -x='chmod a-x' --> alias -- -x='chmod a-x'
134
135 13. There was a bug in bash-1.14 and previous versions that caused it to
136 accept as valid syntax for loops of the form
137
138 for f in ; do ... ; done
139
140 This should be a syntax error, and bash-2.x treats it as such.
141
142 14. 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:
150
151 AaBb...Zz
152
153 so a range specification like [A-Z] will match every letter except `z'.
154
155 The portable way to specify upper case letters is [:upper:] instead of
156 A-Z; lower case may be specified as [:lower:] instead of a-z.
157
158 Look at the manual pages for setlocale(3), strcoll(3), and, if it is
159 present, locale(1).
160
161 You can find your current locale information by running locale(1):
162
163 caleb.ins.cwru.edu(2)$ locale
164 LANG=en_US
165 LC_CTYPE="en_US"
166 LC_NUMERIC="en_US"
167 LC_TIME="en_US"
168 LC_COLLATE="en_US"
169 LC_MONETARY="en_US"
170 LC_MESSAGES="en_US"
171 LC_ALL=en_US
172
173 My advice is to put
174
175 export LC_COLLATE=C
176
177 into /etc/profile and inspect any shell scripts run from cron for
178 constructs like [A-Z]. This will prevent things like
179
180 rm [A-Z]*
181
182 from removing every file in the current directory except those beginning
183 with `z' and still allow individual users to change the collation order.
184 Users may put the above command into their own profiles as well, of course.
185
186 15. Bash versions up to 1.14.7 included an undocumented `-l' operator to
187 the `test/[' builtin. It was a unary operator that expanded to the
188 length of its string argument. This let you do things like
189
190 test -l $variable -lt 20
191
192 for example.
193
194 This was included for backwards compatibility with old versions of the
195 Bourne shell, which did not provide an easy way to obtain the length of
196 the value of a shell variable.
197
198 This operator is not part of the POSIX standard, because one can (and
199 should) use ${#variable} to get the length of a variable's value.
200 Bash-2.x does not support it.