mirror of
https://github.com/flokoe/bash-hackers-wiki.git
synced 2024-11-01 14:53:06 +01:00
334 lines
16 KiB
Markdown
334 lines
16 KiB
Markdown
# Bash changes
|
|
|
|
This article is an **incomplete overview** of changes to Bash over time.
|
|
Not all changes are listed, just the ones most likely to be useful for
|
|
normal scripting. The overviews are categorized by topic and ordered by
|
|
version.
|
|
|
|
A useful starting point is the [NEWS
|
|
file](https://github.com/bminor/bash/blob/master/NEWS) in bash sources.
|
|
If you have more detailed information, or historical information about
|
|
Bash versions earlier than V2, feel free to mail me, or use the
|
|
discussion below.
|
|
|
|
Status: 5.1 (alpha)
|
|
|
|
## Shell options
|
|
|
|
Note that the `shopt` builtin command first appeared in Bash 2.0.
|
|
|
|
For this topic, see also
|
|
|
|
- [shell_options](../internals/shell_options.md)
|
|
- [set](../commands/builtin/set.md)
|
|
|
|
|Feature or change description|Appeared in Bash version|See also/remarks|
|
|
|--|--|--|
|
|
|`posix` (for `set -o`)|1.14.0||
|
|
|`hostcomplete`|2.0-alpha3||
|
|
|`expand_aliases`|2.0||
|
|
|`huponexit`|2.02-alpha1||
|
|
|`nocaseglob`|2.02-alpha1||
|
|
|`extglob`|2.02-alpha1|together with extended globbing, KSH88|
|
|
|`restricted_shell`|2.03-alpha||
|
|
|`xpg_echo`|2.04-beta1||
|
|
|`progcomp`|2.04-alpha1||
|
|
|`no_empty_command_completion`|2.04||
|
|
|`login_shell`|2.05a-alpha1||
|
|
|`nolog` (for `set -o`)|2.05a||
|
|
|`gnu_errfmt`|3.0-alpha||
|
|
|`force_fignore`|3.0-alpha||
|
|
|`failglob`|3.0-alpha||
|
|
|`extquote`|3.0-alpha|unsure -- verify!|
|
|
|`extdebug`|3.0-alpha||
|
|
|`pipefail` (for `set -o`)|3.0||
|
|
|`functrace` (for `set -o`)|3.0||
|
|
|`errtrace` (for `set -o`)|3.0||
|
|
|`nocasematch`|3.1-alpha1||
|
|
|`dirspell`|4.0-alpha||
|
|
|`globstar`|4.0-alpha||
|
|
|`checkjobs`|4.0-alpha||
|
|
|`autocd`|4.0-alpha||
|
|
|`set -e` effects more intuitive|4.0|not directly specified by POSIX, but in consensus with POSIX WG|
|
|
|`compat40`|4.1-beta||
|
|
|`lastpipe`|4.2-alpha|only works with job control disabled|
|
|
|`compat41`|4.2-alpha||
|
|
|`globasciiranges`|4.3-alpha|enable "character range globbing" to always act as if in `C` locale|
|
|
|`compat42`|4.3-alpha||
|
|
|`compat43`|4.4-alpha||
|
|
|`compat44`|5.0-alpha||
|
|
|`localvar_inherit`|5.0-alpha|local variables inherit preceeding scope values if they have the same name|
|
|
|`syslog_history`|5.0-alpha|send history lines to syslog (undocumented, default off) if syslog is supported|
|
|
|`assoc_expand_once`|5.0-alpha|expand associative array subscripts only one|
|
|
|`globasciiranges`|5.0-beta|New default: on (default may be configured at compile time)|
|
|
|`localvar_inherit`|5.0-beta|guard code against inheriting from an incompatible data type|
|
|
|`checkwinsize`|5.0-beta2|New default: on|
|
|
|`shift_verbose`|5.0-beta2|Default on when in POSIX mode|
|
|
|
|
### General (all/many builtins)
|
|
|
|
|Feature or change description|Appeared in Bash version|See also/remarks|
|
|
|--|--|--|
|
|
|generally return 2 on usage error|2.0||
|
|
|generally accept `--` (end of options)|2.0||
|
|
|(where applicable) implement a `-p` option to produce reusable output|2.0|`shopt` and `umask` builtins were fixed to support that in 2.02|
|
|
|
|
### printf
|
|
|
|
For this topic, see also
|
|
|
|
- [printf](../commands/builtin/printf.md)
|
|
|
|
|Feature or change description|Appeared in Bash version|See also/remarks|
|
|
|--|--|--|
|
|
|new `printf` command|2.02-alpha1||
|
|
|respects `0..` and `0x..` prefixed numbers|2.04-beta1|consistency with arithmetic|
|
|
|POSIX(r) length specifiers `j`, `t` and `z`|2.05a-alpha1|ISO C99|
|
|
|POSIX(r) flag `'`|2.05a-alpha1||
|
|
|conversion `a` and `A`|2.05a-rc1|if provided by the underlying printf(3)|
|
|
|conversion `F`|2.05a-rc1||
|
|
|conversion `n`|2.05a-rc1||
|
|
|new option `-v`|3.1-alpha1||
|
|
|escape sequences `\"` and `\?`|3.0-beta1||
|
|
|modified option `-v` to assign to individual array elements|4.1-alpha||
|
|
|conversion `(...)T`|4.2-alpha|support stftime(3) date/time format; uses current time|
|
|
|`\uNNNN` and `\UNNNNNNNN` escape sequences|4.2-alpha|for: `printf`, `echo -e`, `$'...'`|
|
|
|
|
### Conditional expressions and test command
|
|
|
|
For this topic, see also
|
|
|
|
- [conditional_expression](../syntax/ccmd/conditional_expression.md)
|
|
- [classictest](../commands/classictest.md)
|
|
|
|
|Feature or change description|Appeared in Bash version|See also/remarks|
|
|
|--|--|--|
|
|
|`test`: `-o`, `==`, `<` and `>`|2.0||
|
|
|`test`: `-N`|2.02||
|
|
|`[[...]]`: new|2.02-alpha1|KSH93|
|
|
|`[[...]]`: regex support (`=~`)|3.0-alpha||
|
|
|`[[...]]`: quotable right-hand-side of `=~` forces string matching|3.2-alpha|for consistency with pattern matching|
|
|
|`[[...]]`: `<` and `>` operators respect locale|4.1-alpha|for consistency, since 4.1-beta: ensure you have set compatiblity to \>4.0 (default)|
|
|
|`test`/`[`/`[[`: `-v`|4.2-alpha|check if a variable is set|
|
|
|`test`/`[`/`[[`: `-v`|4.2-alpha|support array syntax to check for elements|
|
|
|`test`/`[`/`[[`: `-N` accepts nanoseconds|5.1-alpha||
|
|
|`test`/`[`/`[[`: `-v` accepts positional parameters|5.1-alpha||
|
|
|
|
### Other builtins and keywords
|
|
|
|
|Builtin|Feature or change description|Appeared in Bash version|See also/remarks|
|
|
|--|--|--|--|
|
|
|`bashbug`|new|1.14.0||
|
|
|`select`|new|1.14.0||
|
|
|`disown`|new|2.0||
|
|
|`shopt`|new|2.0|[shopt](../commands/builtin/shopt.md)|
|
|
|`declare`|new options `-a` and `-F`|2.0||
|
|
|`enable`|builtin has basic plugin support (dlopen)|2.0||
|
|
|`exec`|options `-l`, `-c` and `-a`|2.0||
|
|
|`read`|options `-p`, `-e` and `-a`|2.0|[read](../commands/builtin/read.md)|
|
|
|`readonly`|option `-a`|2.0|[arrays](../syntax/arrays.md)|
|
|
|`time`|new keyword|2.0||
|
|
|`shopt`|`-p` (reusable output)|2.02||
|
|
|`umask`|`-p` (reusable output)|2.02||
|
|
|`complete`|new|2.04-devel|for and together with support for programmable completion|
|
|
|`compgen`|new|2.04-devel|for and together with support for programmable completion|
|
|
|`read`|options `-t`, `-n`, `-d`, `-s`|2.04-devel|[read](../commands/builtin/read.md)|
|
|
|`for ((...;...;...))`|new|2.04-devel|KSH93|
|
|
|`set`|print shell functions in a format reusable as input|2.05-beta1||
|
|
|`for`|allow an empty word list|2.05a-alpha1||
|
|
|`read`|new option `-u`|2.05b-alpha1|[read](../commands/builtin/read.md)|
|
|
|`caller`|new|3.0|[caller](../commands/builtin/caller.md)|
|
|
|`coproc`|new|4.0-alpha||
|
|
|`declare`|new options `-l` and `-u`|4.0-alpha|together with case-changing expansion forms|
|
|
|`case`|new action list terminators '';;& and '';&|4.0-alpha|ksh93: only `;&`. zsh and mksh: `;|`. mksh: all 4, (`;;&` is undocumented Bash compatibility)|
|
|
|`read`|changed `-t` (fractional seconds)|4.0-alpha||
|
|
|`mapfile`|new|4.0-alpha||
|
|
|`read`|new option `-i`|4.0-alpha||
|
|
|`compopt`|new|4.0-alpha||
|
|
|`read`|modified option `-t` to test for data|4.0-beta||
|
|
|`read`|new option `-N`|4.1-alpha||
|
|
|`mapfile`|changed behaviour regarding history spamming|4.1-alpha||
|
|
|`declare`|new option `-g`|4.2-alpha||
|
|
|`mapfile`|calls the callback with an additional argument: The line (data)|4.2-alpha||
|
|
|`cd`|new option `-e`|4.2-alpha||
|
|
|`echo`|`\uNNNN` and `\UNNNNNNNN` escape sequences|4.2-alpha|for: `printf`, `echo -e`, `$'...'`|
|
|
|`exec`|option `-a` to give a `argv[0]` string|4.2-alpha||
|
|
|`time`|allowed as a command by itself to display timing values of the shell and its children|4.2-alpha|POSIX change|
|
|
|`help`|`help` now searches exact topic-strings (i.e. `help read` won't find `readonly` anymore)|4.3-alpha||
|
|
|`return`|accept negative values as return value (e.g. `return -1` will show as (8 bit) 255 in the caller)|4.3-alpha||
|
|
|`exit`|accept negative values as return value (e.g. `return -1` will show as (8 bit) 255 in the caller)|4.3-alpha||
|
|
|`read`|`read` skips `NUL` (ASCII Code 0) in input|4.3-alpha||
|
|
|`declare`|new option `-n`/`+n` to support nameref variable type|4.3-alpha||
|
|
|`wait`|new option `-n` to wait for the next background job to finish, returning its exit status.|4.3-alpha||
|
|
|`read`|`read` checks first variable argument for validity before trying to read inout|4.3-beta||
|
|
|`help`|attempts substring matching (as it did through bash-4.2) if exact string matching fails|4.3-beta2||
|
|
|`fc`|interprets option `-0` (zero) as the current command line|4.3-beta2||
|
|
|`cd`|new option `-@` to browse a file's extended attributes (on systems that support `O_XATTR`)|4.3-rc1||
|
|
|`kill`|new option `-L` (upper case ell) to list signals like the normal lowercase option `-l` (compatiblity with some standalone `kill` commands)|4.4-beta||
|
|
|`mapfile`|new option `-d`|4.4-alpha||
|
|
|`wait`|new option `-f`|5.0-alpha||
|
|
|`history`|option `-d` allows negative numbers to index from the end of the history list|5.0-alpha||
|
|
|`umask`|allows modes greater than octal 777|5.0-alpha||
|
|
|`times`|honors current locale settings when printing decimal points|5.0-alpha||
|
|
|`kill`|New options `-n SIGNUMBER` and `-s SIGNAME`|5.0-beta2|[kill](/commands/builtin/kill)|
|
|
|`select`|Support for an empty wordlist following `in`|5.0-beta2||
|
|
|`read`|Option `-e` (use ReadLine to obtain input) now works with arbitrary file descriptors (given by `-u` option)|5.1-alpha||
|
|
|`trap`|`-p` option prints signals with SIG_DFL/SIG_IGN on shell start (POSIX mode)|5.1-alpha||
|
|
|`unset`|automatically tries to unset a function if the given name is an invalid variable name|5.1-aplha||
|
|
|`wait`|option `-n` now accepts a list of jobs|5.1-alpha||
|
|
|`wait`|new option `-p NAME` to store PID/JobID (useful when waiting for a list of jobs)|5.1-alpha||
|
|
|`local`|new option `-p` to print local variables in the current scope|5.1-alpha||
|
|
|`ulimit`|new option `-R` to get/set `RLIMIT_RTTIME` resource|5.1-alpha||
|
|
|
|
## Builtin variables
|
|
|
|
|Feature or change description|Appeared in Bash version|See also|
|
|
|--|--|--|
|
|
|`HISTCMD`|1.14.0|interactive usage|
|
|
|`PS1`, `PS2`, `PATH`, and `IFS` are unsettable|2.0||
|
|
|`DIRSTACK` array variable|2.0||
|
|
|`PIPESTATUS` array variable|2.0||
|
|
|`BASH_VERSINFO` array variable|2.0||
|
|
|`HOSTNAME`|2.0||
|
|
|`SHELLOPTS`|2.0||
|
|
|`MACHTYPE`|2.0||
|
|
|`GLOBIGNORE`|2.0||
|
|
|`HISTIGNORE`|2.0||
|
|
|respect `LC_ALL`|2.0||
|
|
|respect `LC_MESSAGES`|2.0||
|
|
|respect `LC_CTYPE`|2.0||
|
|
|respect `LC_COLLATE`|2.0||
|
|
|respect `LANG`|2.0||
|
|
|`GROUPS` array variable|2.01||
|
|
|`GROUPS` unsettable/takes (discarded) assignments|2.04||
|
|
|`FUNCNAME`|2.04||
|
|
|respect `LC_NUMERIC`|2.04||
|
|
|`TMOUT`|2.05b||
|
|
|`BASH_REMATCH`|3.0|together with regex support in `[[...]]`|
|
|
|`BASH_ARGC`|3.0|debugger support|
|
|
|`BASH_ARGV`|3.0|debugger support|
|
|
|`BASH_SOURCE`|3.0|debugger support|
|
|
|`BASH_LINENO`|3.0|debugger support|
|
|
|`BASH_SUBSHELL`|3.0|debugger support|
|
|
|`BASH_EXECUTION_STRING`|3.0|debugger support|
|
|
|`BASH_COMMAND`|3.0|debugger support|
|
|
|`HISTTIMEFORMAT`|3.0||
|
|
|`COMP_WORDBREAKS`|3.0||
|
|
|respect `LC_TIME`|3.1||
|
|
|`BASHPID`|4.0-alpha|Added to mksh R41.|
|
|
|`PROMPT_DIRTRIM`|4.0||
|
|
|`BASH_XTRACEFD`|4.1-alpha||
|
|
|`BASHOPTS`|4.1-alpha||
|
|
|`FUNCNEST`|4.2-alpha||
|
|
|`HISTSIZE`|4.3-alpha|can be set to negative values for unlimited history length|
|
|
|`HISTFILESIZE`|4.3-alpha|can be set to negative values for unlimit history file size|
|
|
|`CHILD_MAX`|4.3-alpha|max. number of exit status of children the shell remembers|
|
|
|`BASH_COMPAT`|4.3-alpha|set shell compatiblity levels|
|
|
|`EPOCHSECONDS`|5.0-alpha|expands to the time in seconds since Unix epoch|
|
|
|`EPOCHREALTIME`|5.0-alpha|expands to the time in seconds since Unix epoch with microsecond granularity|
|
|
|`BASH_ARGV0`|5.0-alpha|get/set `$0`|
|
|
|`PATH`|5.0-alpha|Possibility to set a static path for use in a restricted shell (at compile time)|
|
|
|`HISTSIZE`|5.0-beta|Default can now be set at runtime|
|
|
|`SRANDOM`|5.1-alpha|New random generator for 32bit numbers (using various methods in the backend)|
|
|
|`ARGV0`|5.1-alpha|Respected when set in initial shell environment, then initially used to set `$0`|
|
|
|`BASH_REMATCH`|5.1-alpha|Not readonly anymore|
|
|
|`PROMPT_COMMANDS`|5.1-alpha|New array variable. List of commands to be executed like `PROMPT_COMMAND`|
|
|
|`SECONDS`|5.1-alpha|Assignment using arithmetic expressions (is nominally an integer variabnle)|
|
|
|`RANDOM`|5.1-alpha|Assignment using arithmetic expressions (is nominally an integer variabnle)|
|
|
|`LINENO`|5.1-alpha|Not an integer variabe|
|
|
|
|
## Quoting, expansions, substitutions and related
|
|
|
|
For this topic, see also
|
|
|
|
- [pe](../syntax/pe.md).
|
|
|
|
|Feature or change description|Appeared in Bash version|Remarks|
|
|
|--|--|--|
|
|
|Support for integer-indexed arrays|2.0|relevant builtins also got array support|
|
|
|`${PARAMETER//PATTERN/REPLACEMENT}`|2.0||
|
|
|`${PARAMETER:OFFSET:LENGTH}`|2.0||
|
|
|`${!PARAMETER}` (indirection)|2.0||
|
|
|`$"..."` (localized strings)|2.0||
|
|
|`$'...'` (ANSI-C-like strings)|2.0||
|
|
|`\xNNN` in `$'...'` (and `echo -e`)|2.02-alpha1||
|
|
|`$(< FILENAME)` (file content)|2.02-alpha1||
|
|
|globbing (`fnmatch()`) capable of POSIX(r) character classes etc.|2.02-alpha1||
|
|
|extended globbing|2.02-alpha1|KSH88|
|
|
|globbing inside array mass-assignment: `ARRAY=(*.txt)`|2.03-alpha||
|
|
|`$'...\'...'` escaped single quote inside ANSI-C-like strings|2.04-devel|KSH93|
|
|
|`${!PREFIX*}` (parameter name expansion)|2.04|KSH93|
|
|
|`$'...'` expands `\cx` (Control-x)|2.05b||
|
|
|`[:class:]` syntax for pattern matching|2.05b|KSH93|
|
|
|`${!ARRAY[@]}` (array index expansion)|3.0-alpha|KSH93|
|
|
|`{x..y}` (range brace expansion)|3.0-alpha||
|
|
|`$'...'` expands `\xNNN` (Hexdigits)|3.0||
|
|
|`+=` operator for arrays and strings|3.1-alpha1||
|
|
|`${PARAMETER//PATTERN/REPLACEMENT}` behaviour changed|3.2-alpha|anchoring for global substitution is no longer allowed, changes the way old syntax may work|
|
|
|`${@:0:x}` includes `$0`|4.0-alpha||
|
|
|Support for associative arrays|4.0-alpha|relevant builtins also got associative array support|
|
|
|case modification operators for expansions|4.0-alpha||
|
|
|`{0x..0y}` (zeropadding brace expansion)|4.0-alpha||
|
|
|numerically indexed arrays can be accessed (on expansion time) from the end using negative indexes|4.1-alpha||
|
|
|`\uNNNN` and `\uNNNNNNNN` in `$'...'`|4.2-alpha|for: `printf`, `echo -e`, `$'...'`|
|
|
|`${PARAMETER:OFFSET:LENGTH}`: Negative `LENGTH` values are used as offset from the end of the string|4.2-alpha|Substrings only for Bash and ksh93. Works also for argument expansions in zsh. ksh93 can use `${arr[n..-m]}`.|
|
|
|Word expansions like `${foo##bar}` understand indirect variable references|4.3-beta||
|
|
|Transformations|4.4||
|
|
|Process substitution now works in POSIX mode|5.1-alpha||
|
|
|New transformations: `U`, `u`, `L`|5.1-alpha|Case-transformation|
|
|
|New transformation: `K`|5.1-alpha|Display associative arrays as key/value pairs|
|
|
|
|
## Arithmetic
|
|
|
|
For this topic, see also
|
|
|
|
- [arith_expr](../syntax/arith_expr.md)
|
|
- [arith](../syntax/expansion/arith.md)
|
|
|
|
|Feature or change description|Appeared in Bash version|Remarks|
|
|
|--|--|--|
|
|
|`((...))`|2.0-beta2|KSH93|
|
|
|ternary operator|2.0||
|
|
|base 64 integer constants|2.0|the max. base before is unknown. Anybody?|
|
|
|deprecated `$[...]` in favor of `$((...))`|2.0||
|
|
|exponentiaition operator (`**`)|2.02-alpha1||
|
|
|comma operator `EXPR,EXPR`|2.04-devel||
|
|
|pre- and postfix operators|2.04-devel||
|
|
|
|
## Redirection and related
|
|
|
|
For this topic, see also
|
|
|
|
- [redirection](../syntax/redirection.md)
|
|
|
|
|Feature or change description|Appeared in Bash version|Remarks|
|
|
|--|--|--|
|
|
|socket redirection (`/dev/tcp/`, `/dev/udp/`)|2.04-devel||
|
|
|OS/filesystem-independent support for `/dev/std(in|out|err)` and `/dev/fd/*`|2.04||
|
|
|socket redirection accepts service names|2.05||
|
|
|`[n]<&word-` and `[n]>&word-` FD-duplicate/closing|2.05b-alpha1|KSH93|
|
|
|Here strings: `<<< WORD`|2.05b-alpha1||
|
|
|`|&` (synonym for `2>&1|`)|4.0-alpha||
|
|
|`&>>` (equiv. to `>>FILE 2>&1`)|4.0-alpha||
|
|
|`{varname}` style automatic file descriptor allocation|4.1-alpha|ksh93|
|
|
|`{varname[idx]}` fd allocation accepts array subscripts and special-meaning variables|4.3-alpha|ksh93|
|
|
|
|
## Misc
|
|
|
|
|Feature or change description|Appeared in Bash version|See also/remarks|
|
|
|--|--|--|
|
|
|`DEBUG` trap|2.0||
|
|
|`ERR` trap|2.05a|KSH93|
|
|
|Support for multibyte characters: Unicode / UTF8|2.05b||
|
|
|`RETURN` trap|3.0|ksh93 `EXIT` trap evaluates in caller scope (for `function name {`). Bash `RETURN` in same scope.|
|
|
|`command_not_found_handle` handler function|4.0-alpha||
|
|
|official introduction of switchable "compatiblity levels"|4.0-alpha|`compat31` was introduced in a 3.2 version, mainly because of the incompatibilities that were introduced by the changed `=~` operator|
|
|
|`[[...]]` and `((...))` conditional commands are subject to the `ERR` trap and `set -e` feature|4.1-alpha||
|
|
|ACL support for file status checks|4.1-alpha||
|
|
|Assignment to negative array indices|4.3-alpha|ksh93, zsh|
|
|
|`declare`/`typeset -n`|4.3-alpha|Support for nameref variable type, a variable referencing another one by name|
|
|
|shells started to run process substitutions now run any trap set on `EXIT`|4.3-beta||
|
|
|process substitution does not inherit the `v` flag|5.0-alpha||
|
|
|`ERR` trap|5.0-alpha|Reports more reliable line numbers|
|
|
|Variable assignment|5.0-beta|Assignments preceeding a special builtin that chages variable attributes are not propagated back unless compatiblity mode is 44 or lower|
|