This document details the changes between this version, bash-4.3-alpha, and the previous version, bash-4.2-release. 1. Changes to Bash a. Fixed several bugs concerning incomplete bracket expressions in filename generation (globbing) patterns. b. Fixed a bug with single quotes and WORD in ${param op WORD} when running in Posix mode. c. Fixed a bug that caused the pattern removal and pattern substitution word expansions and case statement word expansion to not match the empty string. d. Fixed a bug that caused the tzset() function to not work after changing the TZ enviroment variable. e. Fixed a bug that caused the RHS of an assignment statement to undergo word splitting when it contained an unquoted $@. f. Fixed bugs that caused the shell to not react to a SIGINT sent while waiting for a child process to exit. g. Bash doesn't try to run things in a signal handler context when it gets a signal (SIGINT/SIGHUP/etc) while reading input using readline but still be responsive to terminating signals. h. Fixed a bug that caused bash to go into an infinite loop if a filename to be matched contained an invalid multibyte character. i. Fixed a bug that caused PS4 to end up being truncated if it is longer than 128 bytes. j. Fixed a bug that caused brace expansion to not skip over double-quoted command substitution. k. System-specific updates for: DJGPP, HP/UX, Mac OS X l. Fixed a bug in displaying commands that caused redirections to be associated with the wrong part of the command. m. Fixed the coproc cleanup to unset the appropriate shell variables when a coproc terminates. n. Fixed a bug that caused `fc' to dump core due to incorrect calculation of the last history entry. o. Added workarounds for FreeBSD's implementation of faccessat/eaccess and `test -x'. p. Fixed a bug that caused the shell to not match patterns containing control-A. q. Fixed a bug that could result in doubled error messages when the `printf' builtin got a write error. r. Fixed a bug that caused the shell to not correctly expand words containing multiple consecutive quoted empty strings (""""""aa). s. Fixed a bug that caused the shell to not correctly parse multi-line process substitutions containing comments and quoted strings. t. Fixed a problem with the bash malloc's internal idea of the top of the memory heap that resulted in incorrect decisions to try to reduce the break and give memory back to the kernel. u. There are changes to the expansions peformed on compound array assignments, in an effort to make foo=( [ind1]=bar [ind2]=baz ) identical to foo[ind1]=bar foo[ind2]=baz. v. Bash now reports an error if `read -a name' is used when `name' is an existing associative array. w. Fixed a bug that allowed an attempted assignment to a readonly variable in an arithmetic expression to not return failure. x. Fixed several bugs that caused completion functions to be invoked even when the cursor was before the first word in the command. y. Fixed a bug that caused parsing a command substitution to overwrite the parsing state associated with the complete input line. z. Fixed several bugs with the built-in snprintf replacement and field widths and floating point. aa. Fixed a bug that caused incorrect offset calculations and input buffer corruption when reading files longer than 2^31 bytes. bb. Fixed several bugs where bash performed arithmetic evaluation in contexts where evaluation is suppressed. cc. Fixed a bug that caused bash to close FIFOs used for process substitution too early when a shell function was executing, but protect against using all file descriptors when the shell functions are invoked inside loops. dd. Added checks for printable (and non-printable) multibyte characters for use in error messages. ee. Fixed a bug that caused ^O (operate-and-get-next) to not work correctly at the end of the history list. ff. Fixed a bug that caused command-oriented history to incorrectly combine here documents into one line. gg. Fixed a bug that caused importing SHELLOPTS from the environment into a Posix-mode shell to print an error message and refuse to parse it. hh. Fixed a bug that caused the shell to delete an extra history entry when using `history -s'. ii. Fixed a bug that caused floating-point exceptions and overflow errors for the / and % arithmetic operators when using INTMAX_MIN and -1. jj. Fixed a bug that caused parsing errors when reading an arithmetic for loop inside a command substitution. kk. Fixed a bug that caused a readonly function to be unset when unset was called without the -f or -v option. ll. Fixed several bugs in the code that quotes characters special to regular expressions when used in a quoted string on the RHS of the =~ operator to the [[ command. mm. Fixed a bug that caused redirections to fail because the file descriptor limit was set to a value less than 10. nn. Fixed a bug that caused the `read' builtin to execute code in a signal handler context if read timed out. oo. Fixed a bug that caused extended globbing patterns to not match files beginning with `.' correctly when a `.' was explicitly supplied in the pattern. pp. Fixed a bug that caused key sequences longer than two characters to not work when used with `bind -x'. qq. Fixed a bug that resulted in redefined functions having the wrong source file names in BASH_SOURCE. rr. Fixed a bug that caused the read builtin to assign null strings to variables when using `read -N', which caused core dumps when referenced ss. Fixed a bug that caused `bash -m script' to not enable job control while running the script. tt. Fixed a bug that caused `printf -v var' to dump core when used with the %b format code. uu. Fixed a bug that caused the shell to exit with the wrong status if -e was active and the shell exited on a substitution error. vv. Fixed a bug that caused the shell to seg fault if an array variable with the same name as an existing associative array was implicitly created by an assignment (declare a[n]=b). ww. Fixed a bug that caused a redirection to misbehave if the number specified for a file descriptor overflows an intmax_t. xx. Fixed several bugs with the handling of valid and invalid unicode character values when used with the \u and \U escape sequences to printf and $'...'. yy. Fixed a bug that caused tildes to not be escaped in expanded filenames, making them subject to later expansion. zz. When using the pattern substitution word expansion, bash now runs the replacement string through quote removal, since it allows quotes in that string to act as escape characters. This is not backwards compatible, so it can be disabled by setting the bash compatibility mode to 4.2. aaa. Fixed the rest of the cases where the shell runs non-allowed code in a signal handler context. bbb. Fixed a bug that caused spurious DEL characters (\177) to appear in double-quoted expansion where the RHS is evaluated to the empty string. ccc. Fixed a bug that caused the use of the shell's internal random number generator for temporary file names to perturb the random number sequence. ddd. Fixed several bugs that caused `declare -g' to not set the right global variables or to misbehave when declaring global indexed arrays. eee. Fixed a logic bug that caused extended globbing in a multibyte locale to cause failures when using the pattern substititution word expansions. fff. Fixed a bug that caused the `lastpipe' option to corrupt the file descriptor used to read the script. ggg. Fixed a bug that causes the shell to delete DEL characters in the expanded value of variables used in the same quoted string as variables that expand to nothing. hhh. Fixed a bug that caused the shell to assign the wrong value from an assignment like (( x=7 )) when `x' was an existing array variable. iii. Fixed a bug that caused the shell to misbehave when generating sequences and the boundary values overflow an intmax_t. jjj. Fixed a bug caused expansion errors if an expansion of "$@" appeared next to another expansion (e.g.. "${@}${x}"). kkk. Fixed a potential buffer overflow bug when performing /dev/fd expansion. lll. Fixed a bug that resulted in an extra semicolon being added to compound assignments when they were added to the history list. mmm. Fixed a bug that caused mapfile to read one extra line from the input. nnn. Fixed a bug that caused the mail checking code to use uninitialized values. ooo. Fixed a bug that prevented history timestamps from being saved if the history comment character is unset. ppp. Fixed a bug that caused the case-modifying expansions to not work with multibyte characters. qqq. Fixed a bug that caused the edit-and-execute bindable readline command to see the wrong data if invoked in the middle of a multi-line quoted string. rrr. Fixed a bug that resulted in the shell returning the wrong exit status for a background command on systems that recycle PIDs very quickly. sss. Fixed a bug that caused asynchronous group commands to not run any EXIT trap defined in the body of the command. ttt. Fixed a bug that caused `eval "... ; return"' to not clean up properly. uuu. Fixed a bug that caused the shell to dump core if `read' reads an escaped IFS whitespace character. vvv. Fixed a bug that caused BASH_COMMAND to be set to an incorrect value when executing a (...) subshell. www. Fixed a pointer aliasing bug with the token string in arithmetic evaluation. xxx. Fixed a bug with parsing multi-line command substitutions when reading the `do' keyword followed by whitespace. yyy. Fixed a bug that caused the shell to seg fault if the time given to the printf %(...)T format overflowed the value accepted by localtime(3). zzz. Fixed a problem with displaying help topics in two columns when the translated text contained multibyte characters. aaaa. Fixed a bug with the extended globbing pattern matcher where a `*' was followed by a negated extended glob pattern. bbbb. Fixed a race condition with short-lived coproc creation and reaping that caused the child process to be reaped before the various coproc shell variables were initialized. cccc. Fixed a bug where turning off `errexit' in command substitution subshells was not reflected in $SHELLOPTS. dddd. Partially fixed an inconsistency in how the shell treated shell functions run from an EXIT trap. eeee. Fixed a bug in how the shell invalidated FIFOs used for process substitution when executing a pipeline (once rather than in every child). ffff. Fixed a bug that occurred when expanding a special variable ($@, $*) within double quotes and the expansion resulted in an empty string. gggg. Fixed bugs with executing a SIGCHLD trap handler to make sure that it's executed once per exited child. hhhh. Fixed a bug that caused `declare' and `test' to find variables that had been given attributes but not assigned values. Such variables are not set. iiii. Fixed a bug that caused commands in process substitutions to not look in the local temporary environment when performing word expansions. jjjj. Fixed several problems with globstar expansions (**/**) returning null filenames and multiple instances of the same pathname. kkkk. Fixed an oversight that did not allow the exit status of `coproc' to be inverted using `!'. llll. Fixed a bug that caused the -e option to be re-enabled using `set -e' even when executing in a context where -e is ignored. mmmm. Fixed a (mostly theoretical) bug with input lines longer than SIZE_MAX. 2. Changes to Readline a. Fixed a bug that did not allow the `dd', `cc', or `yy' vi editing mode commands to work on the entire line. b. Fixed a bug that caused redisplay problems with prompts longer than 128 characters and history searches. c. Fixed a bug that caused readline to try and run code to modify its idea of the screen size in a signal handler context upon receiving a SIGWINCH. d. Fixed a bug that caused the `meta' key to be enabled beyond the duration of an individual call top readline(). e. Added a workaround for a wcwidth bug in Mac OS X that caused readline's redisplay to mishandle zero-width combining characters. f. Fixed a bug that caused readline to `forget' part of a key sequence when a multiple-key sequence caused it to break out of an incremental search. g. Fixed bugs that caused readline to execute code in a signal handler context if interrupted while reading from the file system during completion. h. Fixed a bug that caused readline to `forget' part of a key sequence when reading an unbound multi-character key sequence. i. Fixed a bug that caused Readline's signal handlers to be installed beyond the bounds of a single call to readline(). j. Fixed a bug that caused the `.' command to not redo the most recent `R' command in vi mode. k. Fixed a bug that caused ignoring case in completion matches to result in readline using the wrong match. l. Paren matching now works in vi insert mode. m. Fix menu-completion to make show-all-if-ambiguous and menu-complete-display-prefix work together. n. Fixed a bug that didn't allow the `cc', `dd', or `yy' commands to be redone in vi editing mode. o. Fixed a bug that caused the filename comparison code to not compare multibyte characters correctly when using case-sensitive or case-mapping comparisons. p. Fixed the input reading loop to call the input hook function only when there is no terminal input available. q. Fixed a bug that caused binding a macro to a multi-character key sequence where the sequence and macro value share a common prefix to not perform the macro replacement. r. Fixed several redisplay errors with multibyte characters and prompts containing invisible characters when using horizontal scrolling. 3. New Features in Bash a. The `helptopic' completion action now maps to all the help topics, not just the shell builtins. b. The `help' builtin no longer does prefix substring matching, so `help read' does not match `readonly'. c. The shell can be compiled to not display a message about processes that terminate due to SIGTERM. d. Non-interactive shells now react to the setting of checkwinsize and set LINES and COLUMNS after a foreground job exits. e. There is a new shell option, `globasciiranges', which, when set to on, forces globbing range comparisons to use character ordering as if they were run in the C locale. f. There is a new shell option, `direxpand', which makes filename completion expand variables in directory names in the way bash-4.1 did. g. In Posix mode, the `command' builtin does not change whether or not a builtin it shadows is treated as an assignment builtin. h. The `return' and `exit' builtins accept negative exit status arguments. i. The word completion code checks whether or not a filename containing a shell variable expands to a directory name and appends `/' to the word as appropriate. The same code expands shell variables in command names when performing command completion. j. In Posix mode, it is now an error to attempt to define a shell function with the same name as a Posix special builtin. k. When compiled for strict Posix conformance, history expansion is disabled by default. l. The history expansion character (!) does not cause history expansion when followed by the closing quote in a double-quoted string. m. `complete' and its siblings compgen/compopt now takes a new `-o noquote' option to inhibit quoting of the completions. n. Setting HISTSIZE to a value less than zero causes the history list to be unlimited (setting it 0 zero disables the history list). o. Setting HISTFILESIZE to a value less than zero causes the history file size to be unlimited (setting it to 0 causes the history file to be truncated to zero size). p. The `read' builtin now skips NUL bytes in the input. q. There is a new `bind -X' option to print all key sequences bound to Unix commands. r. When in Posix mode, `read' is interruptible by a trapped signal. After running the trap handler, read returns 128+signal and throws away any partially-read input. s. The command completion code skips whitespace and assignment statements before looking for the command name word to be completed. t. The build process has a new mechanism for constructing separate help files that better reflects the current set of compilation options. u. The -nt and -ot options to test now work with files with nanosecond timestamp resolution. v. The shell saves the command history in any shell for which history is enabled and HISTFILE is set, not just interactive shells. w. The shell has `nameref' variables and new -n(/+n) options to declare and unset to use them, and a `test -R' option to test for them. x. The shell now allows assigning, referencing, and unsetting elements of indexed arrays using negative subscripts (a[-1]=2, echo ${a[-1]}) which count back from the last element of the array. y. The {x}