bash-hackers-wiki/docs/bash4.md

217 lines
8.3 KiB
Markdown
Raw Normal View History

2023-07-04 12:59:22 +02:00
# Bash 4 - a rough overview
2023-07-04 13:11:57 +02:00
!!! warning "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.md) page for new stuff introduced.
2023-07-04 12:59:22 +02:00
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.md) for a small general overview with
2023-07-04 12:59:22 +02:00
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
2023-07-04 13:11:57 +02:00
component are not covered. **Though, if you're familiar with these parts of Bash (and Bash 4), feel free to write a chapter here.**
2023-07-04 12:59:22 +02:00
The complete list of fixes and changes is in the CHANGES or NEWS file of
your Bash 4 distribution.
2023-07-04 13:11:57 +02:00
The current available **stable** version is 4.4.18 release (February 03, 2018):
2023-07-04 12:59:22 +02:00
2023-07-04 13:11:57 +02:00
- <ftp://ftp.cwru.edu/pub/bash/bash-4.4.18.tar.gz>
- <ftp://ftp.gnu.org/pub/gnu/bash/bash-4.4.18.tar.gz>
2023-07-04 12:59:22 +02:00
## New or changed commands and keywords
2023-07-04 13:11:57 +02:00
### The new "coproc" keyword
2023-07-04 12:59:22 +02:00
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.md)
2023-07-04 12:59:22 +02:00
2023-07-04 13:11:57 +02:00
### The new "mapfile" builtin
2023-07-04 12:59:22 +02:00
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.md)
2023-07-04 12:59:22 +02:00
2023-07-04 13:11:57 +02:00
### Changes to the "case" keyword
2023-07-04 12:59:22 +02:00
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.md)
2023-07-04 12:59:22 +02:00
2023-07-04 13:11:57 +02:00
### Changes to the "declare" builtin
2023-07-04 12:59:22 +02:00
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).
2023-07-04 13:11:57 +02:00
### Changes to the "read" builtin
2023-07-04 12:59:22 +02:00
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
2023-07-04 12:59:22 +02:00
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.md)
2023-07-04 12:59:22 +02:00
2023-07-04 13:11:57 +02:00
### Changes to the "help" builtin
2023-07-04 12:59:22 +02:00
2024-03-30 20:09:26 +01:00
The builtin itself didn't change much, but the data displayed is more
2023-07-04 12:59:22 +02:00
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.
2023-07-04 13:11:57 +02:00
### Changes to the "ulimit" builtin
2023-07-04 12:59:22 +02:00
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.md)
2023-07-04 12:59:22 +02:00
### 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.md#case_modification)
2023-07-04 12:59:22 +02:00
### 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:
2023-07-04 13:11:57 +02:00
```bash
# this should display $0 on Bash v4, $1 on Bash v3
echo ${@:0:1}
```
2023-07-04 12:59:22 +02:00
### Globbing
2023-07-04 13:11:57 +02:00
There's a new shell option `globstar`. When enabled, Bash will perform
recursive globbing on `**` this means it matches all directories and
2023-07-04 12:59:22 +02:00
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.md)
2023-07-04 12:59:22 +02:00
## 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
2023-07-04 13:11:57 +02:00
```bash
declare -A ASSOC
2023-07-04 12:59:22 +02:00
2023-07-04 13:11:57 +02:00
ASSOC[First]="first element"
ASSOC[Hello]="second element"
ASSOC[Peter Pan]="A weird guy"
```
2023-07-04 12:59:22 +02:00
See [arrays](syntax/arrays.md)
2023-07-04 12:59:22 +02:00
## 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.md)
2023-07-04 12:59:22 +02:00
## Interesting new shell variables
2023-07-04 13:11:57 +02:00
| Variable | Description |
| -------------------------------------------------- | ------------------------------------------------------------------------------- |
| [BASHPID](syntax/shellvars.md#BASHPID) | contains the PID of the current shell (this is different than what `$$` does!) |
| [PROMPT_DIRTRIM](syntax/shellvars.md#PROMPT_DIRTRIM) | specifies the max. level of unshortened pathname elements in the prompt |
| [FUNCNEST](syntax/shellvars.md#FUNCNEST) | control the maximum number of shell function recursions |
2023-07-04 12:59:22 +02:00
See [shellvars](syntax/shellvars.md)
2023-07-04 12:59:22 +02:00
## Interesting new Shell Options
The mentioned shell options are **off by default** unless otherwise
mentioned.
2023-07-04 13:11:57 +02:00
| 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 |
2023-07-04 12:59:22 +02:00
See [shell_options](internals/shell_options.md)
2023-07-04 12:59:22 +02:00
## Misc
2023-07-04 13:11:57 +02:00
- 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.md#BASH_XTRACEFD) can be set to the
2023-07-04 13:11:57 +02:00
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`)