mirror of
https://github.com/flokoe/bash-hackers-wiki.git
synced 2024-11-01 14:53:06 +01:00
334 lines
36 KiB
Markdown
334 lines
36 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)
|
|
- [set](/commands/builtin/set)
|
|
|
|
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)
|
|
|
|
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)
|
|
- [classictest](/commands/classictest)
|
|
|
|
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)
|
|
`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)
|
|
`readonly` option `-a` 2.0 [arrays](/syntax/arrays)
|
|
`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)
|
|
`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)
|
|
`caller` new 3.0 [caller](/commands/builtin/caller)
|
|
`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).
|
|
|
|
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)
|
|
- [arith](/syntax/expansion/arith)
|
|
|
|
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)
|
|
|
|
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
|