diff --git a/docs/bash4.md b/docs/bash4.md new file mode 100644 index 0000000..5565392 --- /dev/null +++ b/docs/bash4.md @@ -0,0 +1,219 @@ +# Bash 4 - a rough overview + +:V4: + +\Attention: Since Bash 4 has been around for quite some time now +(4.3 will come soon), I consider it to be \"standard\". This page is not +maintained anymore and is left here to keep your links working. See the +[bashchanges](/scripting/bashchanges) page for new stuff +introduced.\ + +Besides many bugfixes since Bash 3.2, Bash 4 will bring some interesting +new features for shell users and scripters. See also +[bashchanges](/scripting/bashchanges) for a small general overview with +more details. + +Not all of the changes and news are included here, just the biggest or +most interesting ones. The changes to completion, and the readline +component are not covered. **Though, if you\'re familiar with these +parts of Bash (and Bash 4), feel free to write a chapter here.** + +The complete list of fixes and changes is in the CHANGES or NEWS file of +your Bash 4 distribution. + +\ The current available **stable** +version is 4.4.18 release (February 03, 2018): + +- +- + +\ + +## New or changed commands and keywords + +### The new \"coproc\" keyword + +Bash 4 introduces the concepts of coprocesses, a well known feature of +other shells. The basic concept is simple: It will start any command in +the background and set up an array that is populated with accessible +files that represent the filedescriptors of the started process. + +In other words: It lets you start a process in background and +communicate with its input and output data streams. + +See [The coproc keyword](/syntax/keywords/coproc) + +### The new \"mapfile\" builtin + +The `mapfile` builtin is able to map the lines of a file directly into +an array. This avoids having to fill an array yourself using a loop. It +enables you to define the range of lines to read, and optionally call a +callback, for example to display a progress bar. + +See: [mapfile](/commands/builtin/mapfile) + +### Changes to the \"case\" keyword + +The `case` construct understands two new action list terminators: + +The `;&` terminator causes execution to continue with the next action +list (rather than terminate the `case` construct). + +The `;;&` terminator causes the `case` construct to test the next given +pattern instead of terminating the whole execution. + +See [case](/syntax/ccmd/case) + +### Changes to the \"declare\" builtin + +The `-p` option now prints all attributes and values of declared +variables (or functions, when used with `-f`). The output is fully +re-usable as input. + +The new option `-l` declares a variable in a way that the content is +converted to lowercase on assignment. For uppercase, the same applies to +`-u`. The option `-c` causes the content to be capitalized before +assignment. + +`declare -A` declares associative arrays (see below). + +### Changes to the \"read\" builtin + +The `read` builtin command has some interesting new features. + +The `-t` option to specify a timeout value has been slightly tuned. It +now accepts fractional values and the special value 0 (zero). When +`-t 0` is specified, `read` immediately returns with an exit status +indicating if there\'s data waiting or not. However, when a timeout is +given, and the `read` builtin times out, any partial data recieved up to +the timeout is stored in the given variable, rather than lost. When a +timeout is hit, `read` exits with a code greater than 128. + +A new option, `-i`, was introduced to be able to preload the input +buffer with some text (when Readline is used, with `-e`). The user is +able to change the text, or press return to accept it. + +See [read](/commands/builtin/read) + +### Changes to the \"help\" builtin + +The builtin itself didn\'t change much, but the data displayed is more +structured now. The help texts are in a better format, much easier to +read. + +There are two new options: `-d` displays the summary of a help text, +`-m` displays a manpage-like format. + +### Changes to the \"ulimit\" builtin + +Besides the use of the 512 bytes blocksize everywhere in POSIX mode, +`ulimit` supports two new limits: `-b` for max socket buffer size and +`-T` for max number of threads. + +## Expansions + +### Brace Expansion + +The brace expansion was tuned to provide expansion results with leading +zeros when requesting a row of numbers. + +See [brace](/syntax/expansion/brace) + +### Parameter Expansion + +Methods to modify the case on expansion time have been added. + +On expansion time you can modify the syntax by adding operators to the +parameter name. + +See [Case modification on parameter +expansion](/syntax/pe#case_modification) + +### Substring expansion + +When using substring expansion on the positional parameters, a starting +index of 0 now causes \$0 to be prepended to the list (if the positional +parameters are used). Before, this expansion started with \$1: + + # this should display $0 on Bash v4, $1 on Bash v3 + echo ${@:0:1} + +### Globbing + +There\'s a new shell option `globstar`. When enabled, Bash will perform +recursive globbing on `**` \-- this means it matches all directories and +files from the current position in the filesystem, rather than only the +current level. + +The new shell option `dirspell` enables spelling corrections on +directory names during globbing. + +See [globs](/syntax/expansion/globs) + +## Associative Arrays + +Besides the classic method of integer indexed arrays, Bash 4 supports +associative arrays. + +An associative array is an array indexed by an arbitrary string, +something like + + declare -A ASSOC + + ASSOC[First]="first element" + ASSOC[Hello]="second element" + ASSOC[Peter Pan]="A weird guy" + +See [arrays](/syntax/arrays) + +## Redirection + +There is a new `&>>` redirection operator, which appends the standard +output and standard error to the named file. This is the same as the +good old `>>FILE 2>&1` notation. + +The parser now understands `|&` as a synonym for `2>&1 |`, which +redirects the standard error for a command through a pipe. + +See [redirection](/syntax/redirection) + +## Interesting new shell variables + + Variable Description + ---------------------------------------------------- -------------------------------------------------------------------------------- + [BASHPID](/syntax/shellvars#BASHPID) contains the PID of the current shell (this is different than what `$$` does!) + [PROMPT_DIRTRIM](/syntax/shellvars#PROMPT_DIRTRIM) specifies the max. level of unshortened pathname elements in the prompt + [FUNCNEST](/syntax/shellvars#FUNCNEST) control the maximum number of shell function recursions + +See [shellvars](/syntax/shellvars) + +## Interesting new Shell Options + +The mentioned shell options are **off by default** unless otherwise +mentioned. + + Option Description + ------------- -------------------------------------------------------------------------------------------------------- + `checkjobs` check for and report any running jobs at shell exit + `compat*` set compatiblity modes for older shell versions (influences regular expression matching in `[[ ... ]]` + `dirspell` enables spelling corrections on directory names during globbing + `globstar` enables recursive globbing with `**` + `lastpipe` (4.2) to execute the last command in a pipeline in the current environment + +See [shell_options](/internals/shell_options) + +## Misc + +- If a command is not found, the shell attempts to execute a shell + function named `command_not_found_handle`, supplying the command + words as the function arguments. This can be used to display + userfriendly messages or perform different command searches +- The behaviour of the `set -e` (`errexit`) mode was changed, it now + acts more intuitive (and is better documented in the manpage). +- The output target for the `xtrace` (`set -x`/`set +x`) feature is + configurable **since Bash 4.1** (previously, it was fixed to + `stderr`): a variable named + [BASH_XTRACEFD](/syntax/shellvars#BASH_XTRACEFD) can be set to the + filedescriptor that should get the output +- Bash 4.1 is able to log the history to syslog (only to be enabled at + compile time in `config-top.h`)