Bash (Unix shell) explained

Author:Brian Fox
Developer:Chet Ramey
Genre:Shell (computing), Unix shell, command language
Language:Multilingual (gettext)
Platform:GNU
Programming Language:C

Bash (short for "Bourne Again SHell") is an interactive command interpreter and scripting language developed for Unix-like operating systems. Created in 1989 by Brian Fox for the GNU Project, it is designed as a completely free software alternative for the Bourne shell,, and other proprietary Unix shells,[1] supported by the Free Software Foundation. Having gained widespread adoption, Bash is commonly used as the default login shell for numerous Linux distributions.[2] It also supports the execution of commands from files, known as shell scripts, facilitating automation.

The Bash command syntax is a superset of the Bourne shell's syntax, from which all basic features of the Bash syntax were copied. As a result, Bash can execute the vast majority of Bourne shell scripts without modification. Some other ideas were borrowed from the C shell, its successor tcsh, and the Korn Shell. It is available on nearly all modern operating systems, making it a versatile tool in various computing environments.

Definitions

ASCII, strings and numbers

$ printf ': <%b>\n' $'\n': <>$ printf ': <%b>\n' $'\t': < >$ printf ': <%s>\n' " ": < >$ printf ': <%b>\n' $'\0': <>

Any series of characters is called a "string", or sometimes a "string literal". In Unix-like operating systems, all characters, printable and non-printing, except for a few such as the null character and forward slash, can be used in filenames. In addition, all strings are case-sensitive.[3]

Bash, like many other programming languages, uses zero-based numbering.

Control+key combinations

The Control+key functionality is provided by GNU Readline and is available in interactive mode only.Certain keypress combinations allow a user to operate Bash to use tab completion and to search the command history.

Some keypress combinations also allow a user to operate the terminal emulator in order to move the cursor within the terminal window and to control the emulator program. By default, these keypress combinations in Bash mirror those of Emacs.[4]

Default keybindings for control codes include:

Vi keybindings are also available and can be enabled by running .[5] [6]

Syntax

When Bash reads a full command line, the complete string is broken down into tokens."Tokens" are identified using, and separated from each other using metacharacters.

As of Bash 5.3, the 10 metacharacters are the space, tab, and newline, as well as the following characters:

"Blanks" are composed entirely of unquoted metacharacters, "operators" each contain at least one unquoted metacharacter and "words" may not include any unquoted metacharacters.

In practice, Bash breaks down full command strings into tokens or groups of tokens that do contain metacharacters and tokens or groups of tokens that do not contain any metacharactersβ€”called "words".From there it further breaks words down into more specific, meaningful pieces like command names, variable assignment statements, etc.

The two blanks are space and tab.

Operators

Control operators perform a control function. They can be either a newline or one of the following: ||, &&, &, ;, ;;, ;&, ;;&, |, |&, (, or ).

Redirection operators redirect the input or output streams. They include &lt;, &gt;, &amp;&gt;, &lt;&lt;, and &lt;&lt;&lt;.

Words

A word is a sequence of (non-meta-) characters treated as a single unit by the shell. A reserved word is a kind of a word that has a special meaning to the shell.[7] A name is a kind of a word separate from reserved words. Names consist solely of letters, underscores and numbers; which begins with either a letter or an underscore; which, however, may not begin with a number.Names also called identifiers, may be used for naming variables and functions.

Sixteen of the twenty-two "reserved words", which may be characters or words are as follows:

'!' ',}}, reserved words have a caret placed beneath them,, and other tokens have a backtick placed also beneath them, .

$ #,,,,,,,,,$ if echo foo; then bar=abc; fi$ # ^^ ```` ``` ^^^^ ``````` ^^

Subshells

A "subshell" is an additional instance of the shell which has been initialized by a current instance of the shell.When a "parent" shell creates a subshell, or a "child" shell, an exact copy of the parent's environment information is re-created and becomes the environment of the subshell.

In Bash, in non-arithmetic contexts, one can force the use of a subshell by enclosing a full command string in single parentheses.

$ echo foofoo$ (echo foo)foo$

For this simple case, the preceding two commands are equivalent, however, use of subshells can have certain unexpected side effects.There are numerous different forms of syntax which can cause the initialization of a subshell.

Expansion

See main article: String interpolation.

Data structures

Bash offers variables and arrays as data structures, and though there are numerous kinds of each of these available, the data structures are relatively simple compared to other languages like C or Java. All data is stored in memory as a string.

Beginning a word with a dollar character signifies that the word is the name of a variable or array. Surrounding the dollar / variable name syntax in double quotes is always advised. This practice shields the value(s) held by the parameter(s) from unwanted side effects.

Wrapping the variable name in curly brackets (braces) is recommended for readability and consistency between variables and arrays. When writing variables, curly brackets are optional and square brackets would be a syntax error. The parameter names are always on the left side of the equals sign and values are always on the right.

Variables

A variable is assigned to using the syntax name=value.

To use a variable, the syntax $name is used, or ${name}, which expands to the value assigned to the variable.

The latter syntax must be used for certain names to prevent unwanted side effects. For example, $10 will be parsed as ${1}0, so using ${10} means it will be parsed as intended.

Positional parameters, usually passed to a bash script, are denoted by the variables numbered starting from $0.Special parameters are signified by punctuation characters. For example, expands to a list of the first through last positional parameters, "individually requoted, separated by spaces".

Environment variables are signified by all capital letters. Environment variables include UNIX variables like, and Bourne shell variables such as . Scripting variables are signified by all lower case letters or CamelCase. This is only convention; any variable can be passed to the command to be made into an environment variable.

Arrays

Arrays are data structures which hold multiple values.[8] Arrays have a set of square brackets placed at the end of the variable name and inside the curly braces. When writing arrays, curly braces and square brackets are required.

An array is assigned using the syntax name=(one or more elements). It is expanded using or or, depending on the use case.

Each kind of parameter is distinguished by a specific naming convention.[9]

Since Bash 4.0,[10] Bash also supports associative arrays.

In this article, examples of variables from this section include, and .

Execution

See main article: Execution (computing).

"Execution" of a given program occurs when a user (or some other program) asks the operating system to act upon the instructions contained in the given program.

By default, Bash reads user code one line at a time, interprets any newline or semi-colon character as the end of the current command, and executes commands in sequence. If an interactive command extends beyond the width of the terminal emulator, it is usually possible to keep typing and the command will wrap around. To extend a command beyond a newline onto an additional line, it is necessary that the final character of the first line be an unescaped backslash,, which signals "line continuation".Bash always finishes parsing and executing one full commandline before moving on to and beginning with the parsing of the next commandline.

$ foo=aa bar=bb quux=cc zork=dd; set -o xtrace$ : "$"; : "$"+ : aa+ : bb$ : "$" \> : "$"+ : cc : dd$

The first word of a command line is known as the "command position".Under UNIX coventionality, the first word of the command line is always some kind of command, and the rest of the words in the command line string are either options for the command, arguments for the options, or some kind of input upon which the command will operate. "Options" are also called "flags", "switches", or, more formally, "operators". When Bash attempts to locate a command for execution, the directories it searches are those listed in the variable and the current working directory.[11]

$ # [COMMAND POSITION] [OPTION] [ARGUMENTS] $ #,--^,------------^,----^$ declare -p USER BASH_VERSIONdeclare -x USER="liveuser"declare -- BASH_VERSION="5.2.37(1)-release"$

Users and PS1

A user account can be created for either a human or a programmatic user.In Unix-like operating systems, there are two kinds of users: "privileged" and "regular". A privileged user, such as root or the operating system kernel, is allowed to do anything whatsoever on the machine. Unprivileged users are limited in various ways.

When an interactive shell session waits for user input, by default it prints a particular string of characters to the screen. In Bash, the value of this waiting-string is held in the shell variable . For regular users, a common default value for is the dollar character, . For the superuser, a common default value is hashtag

$ sudo --login --user root[sudo] password for liveuser:

  1. vim /home/liveuser/names.txt
  2. exit

$ grep -e bob ./names.txtgrep: ./names.txt: Permission denied

Modes

Programming paradigm

Bash is written in C. A modular style can be approximated through good style and careful design.[12] It is often used in an imperative or procedural style.

Interactive and non-interactive modes

As a command processor, Bash can operate in two modes: interactive or non-interactive.In interactive mode, commands are usually read from a terminal emulator. In non-interactive mode, which facilitates automation, commands are usually read from named files known today as shell scripts. When executed as a standalone command at the command-line interface (CLI), by default Bash opens a new shell in interactive mode.

Scripts

Shell scripts are text files that contain code, often commands, intended to be read and acted upon by some particular interpreter in a batch process in a non-interactive mode and without any further user interaction. Interpreted scripts are programs that do not require their source code to be compiled: all of the relevant source code is contained within the script.There are many programs which can serve as a script interpreter: Perl, AWK, etc. Interpreted scripts are most often written for Unix shells.

The first two characters of the first line of any (executable) shell script begins with a something called a shebang: literally the characters hashtag and bang side by side.

$ cat ./example.sh

  1. ! /bin/env bash

echo fooexit

$

If a script is intended to be run by a user as a stand-alone program on the commandline, then it is referred to as an "executable". By convention, the filenames of executable unix shell scripts are identified the suffix . The "execute" bit can be enabled on a shell script with the utility :

$ ls -l ./example.sh-rw-r--r--.1 liveuser liveuser 32 Aug 3 22:33 example.sh$ ./example.shbash: ./example.sh: Permission denied$ chmod 0744 ./example.sh$ ls -l ./example.sh-rwxr--r--.1 liveuser liveuser 32 Aug 3 22:33 example.sh$ ./example.shfoo$

The builtin

With the, or synonymous command, Bash reads and executes shell commands from any text file by name.[13]

Login and non-login shells

See main article: Session (computer science).

Bash can be executed as a login shell, or "session leader," in both interactive and non-interactive modes via the option. "Logging in" requires user authentication. For this reason, only one login shell exists per user session. In GNU/Linux, a user's login shell is identified in the /etc/passwd file.

$ awk -F ':' '$1 ~ /root/' /etc/passwdroot:x:0:0:Super User:/root:/bin/bash

When a human user initiates a login session, this procedure often occurs in a graphical user interface (GUI).When a user opens a terminal emulator, the emulator executes a non-login instance of the user's login shell.

Logging out of a shell session from within a terminal emulator can be accomplished with the command or, by default in Bash, pressing .

Startup files

See main article: Unix shell and Hidden file and hidden directory.

When Bash starts, it uses to execute commands in a variety of dotfiles (see lists below).[14] These dotfiles, unlike shell scripts, typically have neither the execute permission enabled nor a hash-bang. By default Bash will source a somewhat different set of files, and in a different sequence, depending on:[15]

Of course, any startup file can also execute commands from any other file. Startup files can affect shell behavior, terminal emulators, the X window system and the window manager.

POSIX mode

See main article: POSIX and POSIX terminal interface.

The POSIX IEEE 1003.1 standard specifies a common set of definitions that any shell system application (bash, dash, zsh, etc.) may conform to.Any shell user script written in conformance with POSIX guidelines should be executable by any shell system application that has implemented the POSIX specification. As a result, there can be a reasonable expectation that POSIX-compliant scripts can be executed with success on any Unix or Unix-like operating systems which implements the POSIX standard (Linux, OpenBSD, Oracle Linux, HP-UX, etc.). These scripts are considered "portable" as they are and without any further modifications. The portion of POSIX that applies to shells and command line utilities is a subset of a larger group of POSIX standards that further specify how terminals and terminal emulators aught to function in order to also be considered portable.

When Bash is operating in POSIX mode, fewer features are available but the resulting code can be executed on a greater variety of operating systems.

To enable POSIX mode at the initialization of an interactive shell, Bash can be executed as either, or .[16] To cause a script to be initialized in POSIX mode, one would use the either the hashbang or the less portable . When an instance of Bash is operating in POSIX mode, the environment variable is defined, and the value of the environment variable includes the string .

$ declare -p POSIXLY_CORRECTbash: declare: POSIXLY_CORRECT: not found$ sh$ declare -p POSIXLY_CORRECTdeclare -- POSIXLY_CORRECT="y"$

The full list of features available in Bash which are not specified by POSIX is considerable.[17] Here is a partial list:

$ enable -s | wc --lines16$ enable | wc --lines61

System commands which are available in modern Unix-like operating systems, and which are also specified by POSIX, may have fewer option flags or fewer relevant environment variables available under POSIX. Most (such as) are standalone programs in the,, or directories (in Linux, typically provided by GNU coreutils or BusyBox) rather than Bash builtins.

Because of these and other differences, modern (version 5) Bash shell scripts are rarely runnable "as-is" under the Bourne or legacy Korn shell interpreters. Scripting with portability in mind is becoming less common as GNU/Linux becomes more widespread.[18]

Code that is valid syntax in Bash but not specified by POSIX is called a "bashism". The program can be used to make sure that a script can be executed in Debian Linux without any portability errors. Vidar Holen's is another static linter written in Haskell which can parse script syntax for compatibility with any or all of bash, dash, ksh, and Bourne sh.

The syntax requirements for each shell are each a little different. For example, Debian's policy allows some extensions in their scripts (as they are in the dash shell), while a script intending to support pre-POSIX Bourne shells, like autoconf's, are even more limited in the features they can use.[19]

Other modes

Restricted mode

A restricted shell is used to set up an environment more controlled than the standard shell. A restricted shell behaves identically to bash with the exception that numerous actions are disallowed or not performed, including:

Once restricted mode is enabled, it cannot be disabled. These restrictions are enforced after any startup files are read, and it does not apply to shell scripts. Restricted mode is rarely used.

Privileged mode

In Bash, "privileged mode" is a rarely used option inherited from the SVR4.2 UNIX System V shell (circa 1992).[20] It can be enabled with and disabled with .[21] When privileged mode is enabled, the shell variables includes the string "privileged".

Extended debugging mode

Enabled via at invocation or via during either interactive or non-interactive modes. It uses a separate program called .[22] is not available in POSIX mode. See documentation for more information. See also .

Compatibility modes

Observability

The option

When is enabled, simple debugging content is printed to the terminal.It can be enabled with or, and disabled with, or .These options are also accepted at the commandline and at hash-bangs:, etc.

$ bash -x$ echo $((2 + 2))+ echo 44$ set -- 1 2 3$ printf '<%s>\n' "$@"+ printf '<%s>\n' 1 2 3<1><2><3>$

The shell setting is specified by POSIX.See also .

The option

The verbose option prints strings to the terminal as they are read, and before any expansions are performed. Rarely used.[23]

Comments

Comments can be a valuable way of clarifying information or explaining a script or source file to someone else who might not be familiar with the scripter's intentions or context.

Standard comments in Bash are denoted with a hash character: .Any text to the right of the hash to the end of the line will be ignored.Inline comments are allowed, but hash comments will not print during debugging. See also: .

Comments denoted with a colon character,, originated with the Thompson shell. Any arguments to the right of colon builtin are ignored. Inline comments are not possible, but colon comments will print during debugging and any parameters will have been expanded.[24]

$ # Define foo$ foo=bar # An inline hash comment occurs on the same line as a command$ set -x$ # A regular comment (no output)$ : "$"+ : bar$

Exit codes

When bash executes commands, exit status codes, also called "return codes," are produced which can offer some insight into the manner in which a program ceased running.The value of the most recently captured exit code is held within the shell parameter, 'question mark:' .In non-arithmetic contexts, (i.e., most of the time) the numerical or "Boolean" value of "true" is zero (0), and the value of "false" is one (1).

When a system command has executed, the intended meaning of its exit status can most often be found in its man page; usually a zero indicates success and a nonzero exit status indicates some kind of failure condition or partial success. is a well known command with three meaningful exit codes: 0, 1, and 2.

In Bash, within arithmetic contexts, the numerical truth values are reversed: "true" is one and "false" is zero.An arithmetic context can usually be identified by the syntax or .If an arithmetic statement evaluates to the integer zero, then the statement is considered "true," and the exit code is one.If the statement evaluates to any number other than zero the arithmetic statement is "false" and the exit code is zero.

Not all Linux/UNIX commands provide meaningful exit codes beyond zero and one, and there is no standard system for definitions of exit codes in Linux.

$ true; echo "$?" # Exit code means "true"0$ false; echo "$?"; echo # Exit code means "false"1$$ bash -c 'exit 99'; printf 'exit-code: %d\n\n' "$?"exit-code: 99$$ ((1 - 1)); printf '%d\n' "$?" # This exit code means "true"1$ ((1 + 1)); printf '%d\n' "$?" # ...and this exit code means "false"0

Job control

See main article: Job control (Unix).

The Bash shell has two modes of execution for commands: batch (asynchronous), and concurrent (synchronous).To execute commands in batch mode (i.e., in sequence) they must be separated by the character, or on separate lines:

$ command1; command2$ command3$

In this example, when is finished, is executed, and when has completed, will execute.A background execution of can occur using symbol at the end of an execution command, and process will be executed in background while immediately returning control to the shell and allowing continued execution of commands.

$ command1 &$

Or to have a concurrent execution of and, they must be executed in the Bash shell in the following way:

$ command1 & command2$

In this case is executed in the background, symbol, returning immediate control to the shell that executes in the foreground.A process can be stopped and control returned to bash by typing while the process is running in the foreground.[25] A list of all processes, both in the background and stopped, can be achieved by running :

$ jobs[1]- Running command1 &$ In the output, the number in brackets refers to the job id.The plus sign signifies the default process for and .The text "Running" and "Stopped" refer to the process state.The last string is the command that started the process. The state of a process can be changed using various commands.The command brings a process to the foreground, while sets a stopped process running in the background. and can take a job id as their first argument, to specify the process to act on.Without one, they use the default process, identified by a plus sign in the output of .The command can be used to end a process prematurely, by sending it a signal.The job id must be specified after a percent sign:

$ sleep 100 &[1] 4904$ kill %1$ jobs[1]+ Terminated sleep 100$

Job control, also known as "Monitor mode," is enabled by default in interactive shells, and can be disabled with .

Signals

Signaling is a means of inter-process communication (IPC). Sometimes a commandline process may seem to freeze in the middle of execution.In these instances it may become necessary to identify which process may be blocked and to manually end the offending process.

At an interactive terminal, it is usually sufficient to press to end the current foreground process and return control back to the user prompt, or to press to suspend it.Occasionally attempting to suspend a process will succeed when attempts to cancel a process appear unresponsive.In other cases it may be necessary to use the program to send an IPC signal.In this example, we use the command from a second terminal screen to terminate the process with PID 4331.

$ tty # Terminal one/dev/pts/0$ whoamiliveuser$ sleep 1000 # Command hangs

$ tty # Terminal two/dev/pts/1$ whoamiliveuser$ ps aux | grep -e sleep -e PIDUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND liveuser 4331 0.0 0.0 230336 2312 pts/1 S+ 11:19 0:00 sleep 1000liveuser 4333 0.0 0.0 231248 2516 pts/0 S+ 11:19 0:00 grep --color=auto -e sleep -e PID$ kill 4331$ ps aux | grep -e sleep -e PID # The sleep process has endedUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND liveuser 4333 0.0 0.0 231248 2516 pts/0 S+ 11:19 0:00 grep --color=auto -e sleep -e PID$

$ tty # Terminal one again/dev/pts/0$ whoamiliveuser$ sleep 1000Terminated$

In Unix-like operating systems, a user is allowed to instruct the kernel to send a signal to a process that is owned by the user.A regular user may not send a signal to a privileged process.Signals can be sent to a process using the builtin or using the system binary of the same name.

$ whoamiliveuser$ ps aux | awk '$2 ~ /\<1\>/' # Let\s view some info on the kernel process, process 1.root 1 0.0 0.2 37140 20440 ? Ss 04:44 0:18 /usr/lib/systemd/systemd --switched-root --system --deserialize=53 rhgb$ kill -s SIGKILL 1bash: kill: (1) - Operation not permitted$ type -a killkill is a shell builtinkill is /usr/bin/kill$ /usr/bin/kill -s SIGKILL 1kill: sending signal to 1 failed: Operation not permitted$

The most commonly used signals can be viewed with kill -L | head -n 4.Each IPC signal is associated with a signal number, but exit codes and signal codes are two different things. While sending a process an IPC signal of 9 (a "KILL" signal) will almost certainly terminate the process immediately, it will most likely not result in the process returning an exit code of 9.

By default in Bash, builtin kill sends a TERM ("terminate") signal.It's common for commandline utilities to respond to a SIGTERM by shutting down and exiting cleanly. (TERM and SIGTERM are the same, the SIG- prefix to all signal names can be omitted.)The Ctrl-c keypress sequence in Bash sends a SIGINT, interrupt signal, to the foreground process.The Ctrl-z keypress sequence sends the SIGSTOP, stop signal.[26] When a process receives a SIGKILL, the process terminates immediately and messily.It is recommended to use SIGKILL only as a last resort.[27] The SIGKILL signal cannot be blocked or handled.

Processes can "catch" and "handle" IPC signals they receive.A user can use the kill builtin to "send" an IPC signal to another process.That target process can set up a mechanism, some plan beforehand, for how to repsond whenever any particular signal might be received, or "caught."The way a target program responds is referred to as how the program "handles" receiving the signal.In the man pages one can see how some system commands will print out certain information to the terminal when they receive a SIGHUP: for example, the command.[28]

By default Bash shell scripts receive and respond to any and all IPC signals sent to them, however, Bash scripts can utilize the builtin to catch and handle signals.[29]

$ cat ./trap-example.sh

  1. ! /usr/bin/env bash

trap umask EXITecho barexit 0$ chmod 0700 trap-example.sh$ ./trap-example.sh bar0077$

There are a few signals which are only available from within Bash as GNU extensions:,, and .These signals can be useful in debugging, and can only be sent and handled by shell builtins.See also .

Values of parameters

There are many different implementations of . Some have the option, and some don't.[30] The list of options is not uniform across implementations, though and are both specified by POSIX.If a scripter wishes to know the precise value of a string contained by a variable, then the most consistent way of doing so is to use .

For any string containing any character (besides null?) including digits, the format specifier is .

$ foo=abc bar=123$ printf '<%s>\n' "$" "$"<123>$

For digits only, the format specifier is .

$ printf '<%d>\n' "$" "$"bash: printf: abc: invalid number<0><123>$

With, a newline is never included in the output unless the scripter includes a newline in the format string.In the example below, where a newline has been omitted from the format string, the value of PS1 is printed on the same line as the output of the previous command.

$ printf '<%s>' "$" "$"<123>$

Another very consistent method is to use .The output of can be reused as input.However, not all variables and parameters can be printed using, for example, the values of the Special Parameters.The Special Parameter hashtag,, reports how many Positional Parameters are currently defined.

$ declare -p foo bardeclare -- foo="abc"declare -- bar="123"$ declare -p "$#"bash: declare: 0: not found$

For a full string of input at an interactive shell...

$ declare -p #

...the hashtag would be interpreted by Bash as an inline comment.With the comment and all text to the right of it removed, the command that Bash would execute would be .This command would, according to, "display the values and attributes of each NAME," i.e., each variable, and, "if no NAMEs are given, display the values and attributes and values of all variables," which can be over 100 lines of output.

On the other hand, cannot display variables' attributes.See also .

$ readonly foo$ declare -p foodeclare -r foo="abc"$ printf '<%s>' "$"$

Environment

Configurable execution environment(s):[31]

Shell and session startup Files (a.k.a., "dot files")

When Bash starts, it executes the commands in a variety of dot files.Unlike Bash shell scripts, dot files typically have neither the execute permission enabled nor an interpreter directive like .

The example below is compatible with the Bourne shell and gives semantics similar to csh for the and .The [ -r ''filename'' ] && cmd is a short-circuit evaluation that tests if filename exists and is readable, skipping the part after the if it is not.

[-r ~/.profile ] && ~/.profile # set up environment, once, Bourne-sh syntax onlyif [-n "$PS1" ]; then # are we interactive? [-r ~/.bashrc ] && ~/.bashrc # tty/prompt/function setup for interactive shells [-r ~/.bash_login ] && ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block

Some versions of Unix and Linux contain Bash system startup scripts, generally under the directory.Bash executes these files as part of its standard initialization, but other startup files can read them in a different order than the documented Bash startup sequence.The default content of the root user's files may also have issues, as well as the skeleton files the system provides to new user accounts upon setup.The startup scripts that launch the X window system may also do surprising things with the user's Bash startup scripts in an attempt to set up user-environment variables before launching the window manager.These issues can often be addressed using a or file to read the β€” which provides the environment variables that Bash shell windows spawned from the window manager need, such as xterm or Gnome Terminal.

Standard streams

Standard streams - STDIN, STDOUT and STDERR

Commands

Keywords and reversed words

Builtin commands

PATH and system commands

When the shell looks for external commands, it relies on the Bourne shell variable . contains a list of directories separated by colons, .Beginning with the leftmost directory and selecting directories in a left to right pattern, each directory is searched until a match is found.In Linux, so that a user can locate additional commands, it's common practice for distribution administrators and package developers to alter the value of an end user's by including source files in and other locations.

When looking for the command,, for instance, after considering internal commands and finding nothing, Bash will search the directories in and will select the absolute path of the first executable found that has a basename which matches the search string.

If there is more than one command available in the directories listed in, during the process of parsing and executing a commandline, by default only the first command found will be selected. lookups are slow.The shell speeds up the commandline execution process by remembering command locations in a hash table.To perform a full search without any interference from the hash table, remove the current table with and search for all kinds of commands with .

$ # Force a full path search$ PATH=$:$$ printf 'echo script_file: "$@"\n' > ./echo$ chmod 0700 ./echo$ hash -r; type -a echoecho is a shell builtinecho is /usr/bin/echoecho is /home/liveuser/echo$

In order to execute a commandline with a command found later in the string, you can specify an absolute path or you can anchor path resolution relative to the current working directory.

$ /home/liveuser/echo fooscript_file: foo$ ./echo barscript_file: bar$

For security reasons it is advisable to make sure the directories in PATH are not world-writeable, or are writeable only by root and trusted users.

Command lookup

Control structures

See also: [[Control flow, Control structures]] for [[Conditional (computer programming) and Condition testing]] and [[short-circuit evaluation]].

Subshells

Subshells

;

Pipelines

However, by using a pipeline, they can engage in multiple cycles of computation at the same time, substantially increasing their speed. In a pipelined control unit, different instructions simultaneously go through the process but at different points. While one instruction is being fetched, a second is being decoded, and so forth.Unix-style pipelines: |.

Logical operators

Bash supplies "conditional execution" command separators that make execution of a command contingent on the exit code set by a precedent command.For example:

$ cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2 </syntaxhighlight>

Where is only executed if the (change directory) command was "successful" (returned an exit status of zero) and the command would only be executed if either the or the command return an "error" (non-zero exit status).

Iteration

See main article: Iteration#Computing.

Compound commands

Bash also supports and forms of conditional command evaluation.

Testing

Built in commands for testing file attributes, comparing string and integer values, etc.:

For all commands the exit status is stored in the special variable .

Regular Expressions

Bash 3.0 supports in-process regular expression matching using a syntax reminiscent of Perl.[36] Regexp matching is limited to strings on the right side of the =~ operator in the extended test construct.[37]

means values for line like 'aab', ' aaaaaab', 'xaby', and ' ab' will all match, as will a line containing a 'b' anywhere in its value.

Coprocesses

Data manipulation

Word Splitting

Split into words (i.e., word splitting)

Quoting

Bash has certain quoting rules: uses of

See also,

See also backticks : .

Unicode

Support for Unicode in and ANSI-C quoting.

Brace Expansion

$ echo kernelkernel kernel-headers

Brace expansion, also called alternation, is a feature copied from the C shell.It generates a set of alternative combinations.[38] Generated results need not exist as files.The results of each expanded string are not sorted and left to right order is preserved:

$ echo aeape ace ade abe$ echo ad ae af bd be bf cd ce cf

Users should not use brace expansions in portable shell scripts, because the Bourne shell does not produce the same output.

$ # bash shell$/bin/bash -c 'echo ae'ape ace ade abe$ # A traditional shell does not produce the same output$ /bin/sh -c 'echo ae'ae

When brace expansion is combined with wildcards, the braces are expanded first, and then the resulting wildcards are substituted normally.Hence, a listing of JPEG and PNG images in the current directory could be obtained using:

ls *. # expands to *.jpg *.jpeg *.png – after which, # the wildcards are processedecho *. # echo just shows the expansions – # and braces in braces are possible.

In addition to alternation, brace expansion can be used for sequential ranges between two integers or characters separated by double dots.Newer versions of Bash allow a third integer to specify the increment.

$ echo 1 2 3 4 5 6 7 8 9 10$ echo 01 02 03 04 05 06 07 08 09 10$ echo file.txtfile1.txt file2.txt file3.txt file4.txt$ echo a b c d e$ echo 1 4 7 10$ echo a d g j

When brace expansion is combined with variable expansion (a.k.a., parameter expansion and parameter substitution) the variable expansion is performed after the brace expansion, which in some cases may necessitate the use of the built-in, thus:

$ start=1; end=10$ echo # fails to expand due to the evaluation order$ eval echo # variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10

Parameter and variable expansion

Expansion syntaxes which can perform some tasks more quickly than external utilities, including, among others:

Pathname expansion

Pathname expansion, i.e., shell-style globbing and pattern matching using,, .

Locales

Locale-specific translation via quoting syntax.[39]

Process redirections and parsing

Command substitution

Command substitution

,

Process substitution

Process substitution, or, when a system supports it:

Bash supports process substitution using the and syntax, which substitutes the output of (or input to) a command where a filename is normally used.(This is implemented through /proc/fd/ unnamed pipes on systems that support that, or via temporary named pipes where necessary).

Arithmetic expansion

Arithmetic expansion, or, including

Bash can perform integer calculations ("arithmetic evaluation") without spawning external processes.It uses the command and the variable syntax for this purpose.

Redirection

Redirections of Standard Input, Standard Output and Standard Error data streams are performed, including

Its syntax simplifies I/O redirection.For example, it can redirect standard output (stdout) and standard error (stderr) at the same time using the operator.This is simpler to type than the Bourne shell equivalent ''.Bash supports here documents.Since version 2.05b Bash can redirect standard input (stdin) from a "here string" using the operator.

Command parsing

Interactive-only features

Command History

Unlimited size command history.[42] This feature is available in interactive mode only.

Directory stack

A directory stack ( and built-ins) feature is available in interactive mode only.

Programmable completion

Also known as "tab completion" or "command-line completion", when a user presses the, within an interactive command-shell Bash automatically uses any available completion scripts to suggest partly typed program names, filenames and variable names.[43] The Bash command-line completion system is very flexible and customizable, and is often packaged with functions that complete arguments and filenames for specific programs and tasks.

Bash supports programmable completion via built-in,, and commands.[44] The feature has been available since the beta version of 2.04 released in 2000.[45] These commands enable complex and intelligent completion specification for commands (i.e., installed programs), functions, variables, and filenames.[46]

The and two commands specify how arguments of some available commands or options are going to be listed in the readline input.As of version 5.1 completion of the command or the option is usually activated by the keystroke after typing its name.This feature is available in interactive mode only.

Prompts

Configurable prompts.This feature is available in interactive mode only.

Documentation

User Manual

A user manual for Bash is provided by the GNU Project.It is sometimes considered to be a more user-friendly document than the man page."You may also find information about Bash ...by looking at,, or similar directories on your system."[47] On GNU/Linux systems, if the program is available then the GNU Manual version relevant for your installation should also be available at .[48] [49]

Man page

The most recent technical manual, or 'man page', is intended to be the authoritative explanatory technical document for the understanding of how bash operates.On GNU/Linux systems, the version relevant for your installation is usually available through the program at .[50]

help builtin

With recent versions of Bash, information on shell built-in commands can be found by executing, or at a terminal prompt where bash is installed.

The command can be invoked via to ensure that you run the program found via your shell's search path, and not a shell alias or built-in function: .[51]

POSIX Specification

For the purpose of allowing inter-operability among different shell programs running on different operating systems, the POSIX Specification influences how modern UNIX-like shells are written.Bash "is intended to be a conformant implementation of the IEEE POSIX "Shell and Utilities" portion of the IEEE POSIX specification (IEEE Standard 1003.1)."[52] The most recent publication of the standard (2024) is available online.[53]

As the standard upon which bash is based, the POSIX Standard, or IEEE Std 1003.1,[54] et seq, is especially informative.

Further resources

"The project maintainer also has a Bash page which includes Frequently Asked Questions",[55] [56] this FAQ is current as of bash version 5.1 and is no longer updated.

Informal avenues of support are available via IRC at libera.chat, in the #bash channel, and mailing lists are available at Bash - GNU Project - Free Software Foundation.

Security and vulnerabilities

Root scripts

Running any shell scripts as the root user has, for years, been widely criticized as poor security practice.One commonly given reason is that, when a script is executed as root, the negative effects of any bugs in a script would be magnified by root's elevated privileges.

One common example: a script contains the command,, but the variable is left undefined.In Linux, if the script was executed by a regular user, the shell would attempt to execute the command as a regular user, and the command would fail.However, if the script was executed by the root user, then the command would likely succeed and the filesystem would be erased.

It is recommended to use on a per-command basis instead.

CGI scripts

CGI scripts are a significant source of vulnerability.[57] [58] [59]

builtin

"The eval command is extremely powerful and extremely easy to abuse."[60]

Input validation

"Input validation is the process of ensuring data has undergone data cleansing to confirm it has data quality, that is, that it is both correct and useful."

Shellshock

In September 2014, a security bug was discovered[61] in the program.It was dubbed "Shellshock." Public disclosure quickly led to a range of attacks across the Internet.[62] [63] [64]

Exploitation of the vulnerability could enable arbitrary code execution in CGI scripts executable by certain versions of Bash.The bug involved how Bash passed function definitions to subshells through environment variables.[65] The bug had been present in the source code since August 1989 (version 1.03)[66] and was patched in September 2014 (version 4.3).

Patches to fix the bugs were made available soon after the bugs were identified.Upgrading to a current version is strongly advised.

It was assigned the Common Vulnerability identifiers, among others.Under CVSS Metrics 2.x and 3.x, the bug is regarded as "high" and "critical", respectively.

Deprecated syntax

Debugging

Table of Features

Bash features which can be useful during debugging.[68]
Feature POSIX 2024 Description Bash ver.
Grammar type Formal name Syntax
Special Built-In Utility set / xtrace The shell's primary means of debugging.It "writes to standard error a trace for each command after it expands the command and before it executes it."
Special Parameters Exit Status "Expands to the shortest representation of the decimal exit status."
Parameter Expansions Indicate Null or Unset "Where the expansion of, perhaps an error message or a line number, is written to standard error and the shell exits with a non-zero exit code."
Special Parameters PID of Invoked Shell "Expands to the shortest representation of the decimal process ID of the invoked shell."
Special Built-In Utility set / verbose "Writes its input to standard error as it is read."
Special Built-In Utility set / pipefail "Derive the exit status of a pipeline from the exit statuses of all of the commands in the pipeline, not just the last (rightmost) command."
Special Built-In Utility set / nounset When enabled, will cause the shell to exit with an error message when it encounters an unset variable expansion.Its use has a number of counter-intuitive pitfalls.
Special Built-In Utility set / errexit Errexit is a setting that, when enabled, will, under certain very specific conditions, cause the shell to exit without an error message whenever the shell receives a non-zero exit code.Its use is somewhat controversial, to the extent that any somewhat obscure computer program can be controversial.Adherents claim that Errexit provides an assurance of verifiability in situations where shell scripts "must not fail." However, opponents claim that its use is unreliable, deceptively simple, highly counter-intuitive, rife with gotchas and pitfalls, and in essence "security theater." Numerous developers of Bash have strongly discouraged the use of this particular setting.
Special Built-In Utility trap / EXIT "If a signal specifier is or, is executed when the shell exits." If contains expansions, then should be in single quotes.
Utility printf A means of reliably printing the contents of a variable.
Bash Variables BASHPID "Expands to the process ID of the current bash process."[69]
Bash Variables BASH_ARGC "An array variable whose values are the number of parameters in each frame of the current bash execution call stack."[70]
Bash Variables BASH_ARGV "An array variable containing all of the parameters in the current bash execution call stack."[71]
Bash Variables BASH_LINENO "An array variable whose members are the line numbers in source files where each corresponding member of was invoked."[72]
Bash Variables BASH_REMATCH "An array variable whose members are assigned by the =~ binary operator to the access-date = 8 August 2025| id = BASH_REMATCH| publisher = GNU Project| title = Bash Reference Manual: 5.2: Bash Variables| url = https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-BASH_005fREMATCH | website = Free Software Foundation, Inc.}} |

|- | style="text-align:left" | Bash Variables || BASH_SOURCE | style="text-align:left" | | | style="text-align:left" | "An array variable whose members are the source filenames where the corresponding shell function names in the array variable are defined."[73] |

|- | style="text-align:left" | Bash Variables || BASH_XTRACEFD | style="text-align:left" | | | style="text-align:left" | "If set to an integer corresponding to a valid file descriptor, Bash will write the trace output generated when is enabled to that file descriptor."[74] |

|- | style="text-align:left" | Bash Variables || EPOCHREALTIME | style="text-align:left" | | | style="text-align:left" | "Each time this parameter is referenced, it expands to the number of seconds since the Unix Epoch (see) as a floating point value with micro-second granularity."[75] |

|- | style="text-align:left" | Bash Variables || FUNCNAME | style="text-align:left" | | | style="text-align:left" | "An array variable containing the names of all shell functions currently in the execution call stack."[76] |

|- | style="text-align:left" | Bash Variables || LINENO | style="text-align:left" | | | style="text-align:left" | "Each time this parameter is referenced, the shell substitutes a decimal number representing the current sequential line number (starting with 1) within a script or function."[77] |

|- | style="text-align:left" | Bash Variables || PIPESTATUS | style="text-align:left" | | | style="text-align:left" | "An array variable containing a list of exit status values from the processes in the most-recently-executed foreground pipeline (which may contain only a single command)."[78] |

|- | style="text-align:left" | Bash Variables || PPID | style="text-align:left" | | | style="text-align:left" | "The process ID of the shell's parent."[79] |

|- | style="text-align:left" | Bash Variables || PS4 | style="text-align:left" | | | style="text-align:left" | "The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace."[80] |

|- | style="text-align:left" | Shell Builtin || set / restricted | style="text-align:left" | | | style="text-align:left" | Restricted mode is intended to improve the security of an individual shell instance from a malicious human with physical access to a machine.As threat models have changed, it has become less commonly used now than it once was. |

|- | style="text-align:left" | Shell Builtin || shopt / extdebug | style="text-align:left" | | | style="text-align:left" | "Behavior intended for use by debuggers." |

|- | style="text-align:left" | Shell Builtin || trap / DEBUG | style="text-align:left" | | | style="text-align:left" | "If a sigspec is DEBUG, the command arg is executed before" certain kinds of commands. |

|- | style="text-align:left" | Shell Builtin || trap / ERR | style="text-align:left" | | | style="text-align:left" | "If a sigspec is ERR, the command arg is executed whenever..." certain kinds of commands "return a non-zero exit status", subject to similar restrictions as with ErrExit. |

|- | style="text-align:left" | Shell Builtin || trap / RETURN | style="text-align:left" | | | style="text-align:left" | "If a sigspec is RETURN, the command arg is executed each time a shell function or a script executed with the or builtins finishes executing." | |}

  • Shell features specified by POSIX:
    • Parameter Expansions:
    • Special Parameters:[81] [82]
    • Special Built-In Utility :[83]
    • Special Built-In Utility :[84]
      • POSIX does specify certain uses of the builtin: ...
    • Utility : a means of reliably printing the contents of a variable:
  • Bash features not specified by POSIX:
    • Bash Variables:[85] [86]
    • Shell Builtin :
    • Shell Builtin :[87]
    • Shell Builtin :
      • While POSIX does specify certain uses of the builtin, the following signal specs are Bash extensions: ...
  • Third party debugging utilities:
    • ShellCheck: Shell script analysis tool;
    • devscripts-checkbashisms: Check whether a /bin/sh script contains any common bash-specific constructs;[88]
    • kcov: Code coverage tool without special compilation options;[89]
    • Bashdb: The Bash symbolic debugger.[90]

Examples

With the parameter expansion, an unset or null variable can halt a script.

$ cat ex.sh

  1. !/bin/bash

bar="foo is not defined"echo "$"echo this message doesn't print

$ ./ex.sh./ex.sh: line 3: foo: foo is not defined$

Reliably printing the contents of an array that contains spaces and newlines first in a portable syntax, and then the same thing in Bash.Note that POSIX doesn't have named array, only the list of arguments,, which can be re-set by the builtin.

$ # In POSIX shell:$ set -- "a" " b" " > c "$ printf ',%s,\n' "$@",a,, b,, c,

Note that in Bash, the number of spaces before the newline is made clear.

$ # In Bash:$ array=("a" " b" " > c ")$ declare -p arraydeclare -a array=([0]="a" [1]=" b" [2]=$' \n c ')

Printing an error message when there's a problem.

$ cat error.sh

  1. !/bin/env bash

if ! lsblk | grep sdbthen echo Error, line "$"fi$ ./error.shError, line 130

Using xtrace.If errexit had been enabled, then would not have been executed.

$ cat test.sh

  1. !/bin/env bash

set -xfoo=bar; echo "$"falseecho quux$ ./test.sh+ foo=bar+ echo barbar+ false+ echo quuxquux

Note: differs from in certain circumstances, such as subshells that do not require bash to be reinitialized.

$ echo $(echo $BASHPID $$) $$ $BASHPID 25680 16920 16920 16920

  1. | | | |
  2. | | | \-- $BASHPID outside of the subshell
  3. | | \-- $$ outside of the subshell
  4. | \-- $$ inside of the subshell
  5. \-- $BASHPID inside of the subshell

Bug reporting

An external command called bashbug reports Bash shell bugs.When the command is invoked, it brings up the user's default editor with a form to fill in.The form is mailed to the Bash maintainers (or optionally to other email addresses).[91] [92]

History

Shell script functionality originated with files called "runcoms" in reference to the 1963 macro processor of the same name.The suffix "rc" is short for "runcom."[93] The term "shell" was coined by Louis Pouzin in 1964 or 1965,and appeared in his 1965 paper, "The SHELL, A Global Tool for Calling and Chaining Procedures in the System," which describes many features later found in many UNIX shells.[94] [95] The ASCII standard for character encoding was defined in 1969 in a document called Request for Comments (RFC) 20.[96]

Timeline

Significant events in Bash history are listed below:

See also

Unix shells

Graphical interface to scripts

There are many programs that allow you to create a graphical interface for shell scripts.

  • curses - curses is a terminal control library for Unix-like systems, enabling the construction of text user interfaces (TUI) applications.
  • dialog - is a utility that allows you to create dialog boxes in the console, using the curses and ncurses libraries.
  • gtkdialog - is the most functional utility for creating graphical applications on bash scripts.[129]
  • kdialog - is a KDE equivalent of zenity.[130]
  • ncurses - a programming library for creating textual user interfaces (TUI's) that work across a wide variety of terminals.
  • whiptail - is an analogue of the dialog utility, it uses the newt library.[131]
  • xdialog - is a replacement for dialog that is designed to give programs launched from the terminal an X Window System interface.
  • yad - is a fork of zenity, with more features.[132]
  • zenity - is the most popular application for creating a graphical interface for scripts.[133]

Further reading

References

Notes and References

  1. Web site: Bash - GNU Project - Free Software Foundation. www.gnu.org.
  2. Web site: 8 August 2025. 31 July 2020. https://web.archive.org/web/20200731032216/https://www.red-gate.com/simple-talk/opinion/geek-of-the-week/chet-ramey-geek-of-the-week/. 14 December 2015. Richard. Morris. Chet Ramey: Geek of the Week. live. Simple Talk.
  3. Book: Michael , Randal . 16 August 2025. 2008. 978-0-470-18301-4. 3. . Indianapolis, Indiana. UNIX is case sensitive. Because UNIX is case sensitive, our shell scripts are also case sensitive.. Mastering Unix Shell Scripting . 2nd.
  4. Web site: 8 August 2025. GNU Project. GNU Bash Manual: 8.2.1 Readline Bare Essentials. Free Software Foundation.
  5. Web site: 8 August 2025. GNU Project. GNU Bash Manual: 8.5 Readline vi mode. Free Software Foundation, Inc..
  6. Web site: 8 August 2025. 2 March 2021. https://web.archive.org/web/20210302213519/http://www.hypexr.org/bash_tutorial.php#emacs. 5 October 2012. Scott. Rippee. Getting started with BASH: A Bash Tutorial. hypexr.org.
  7. Web site: 18 August 2025. Bash Reference Manual, D.2 Index of Shell Reserved Words.
  8. Web site: Arrays (Bash Reference Manual). www.gnu.org.
  9. Web site: Bash Reference Manual. www.gnu.org.
  10. Web site: Bash 4.0 Introduces Associative Arrays Β» Linux Magazine. Mathias. Huber. Linux Magazine.
  11. Book: 13 August 2025. Introduction to Linux . 3.2.1. The path. https://tldp.org/LDP/intro-linux/html/sect_03_02.html#sect_03_02_01. Linux Documentation Project.
  12. Web site: 15 August 2025. Dartmouth University. Modular data structures in C. dartmouth.edu.
  13. Web site: 26 August 2025. Free Software Foundation. 4.1 Bourne Shell Builtins . gnu.org.
  14. Web site: 8 August 2025. 2 March 2021. https://web.archive.org/web/20210302212410/https://www.drdobbs.com/i-almost-get-a-linux-editor-and-compiler/184404693. 1 July 2021. Al. Stevens. But virtually all the configure and install scripts that come with open-source programs are written for bash, and if you want to understand those scripts, you have to know bash.. I Almost Get a Linux Editor and Compiler. Dr. Dobbs' Journal.
  15. Web site: 12 August 2025. GNU Project. Bash reference manual, 6.2 Bash startup files. Free Software Foundation.
  16. Book: Cooper , Mendel . 8 August 2025. 27 January 2012. https://web.archive.org/web/20120127105451/http://tldp.org/LDP/abs/html/portabilityissues.html. The Public's Library and Digital Archive. Advanced Bash Scripting Guide. 36.9: Portability Issues. live. Linux Documentation Project.
  17. Web site: 8 August 2025. Chet . Ramey . Case Western Reserve University. 6.11 Bash and POSIX.
  18. Book: 11 May 2020. 12 May 2020. https://web.archive.org/web/20200512050159/https://www.debian.org/doc/debian-policy/ch-files.html#scripts. Debian Policy Manual v4.5.0.2 . 10 – Files. live. Debian Project.
  19. Book: 20 January 2020. 2 March 2021. https://web.archive.org/web/20210302212413/https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.70/html_node/Portable-Shell.html. GNU Project. Autoconf . 11: Portable Shell. live. Free Software Foundation.
  20. Book: 13 August 2025. GNU Project. In a questionable attempt at security, the SVR4.2 shell, when invoked without the -p option, will alter its real and effective UID and GID..... Bash Reference Manual . B.1 Implementation Differences from the SVR4.2 Shell. Free Software Foundation.
  21. Book: 13 August 2025. GNU Project. In this mode, the $BASH_ENV and $ENV files are not processed, shell functions are not inherited from the environment, and the SHELLOPTS, BASHOPTS, CDPATH and GLOBIGNORE variables, if they appear in the environment, are ignored.. Bash Reference Manual . 4.3.1 The Set Builtin. Free Software Foundation.
  22. Web site: 18 August 2025. BASH Debugger. SourceForge.
  23. See in the documentation.
  24. Web site: 8 August 2025. Base Specifications Issue 8: IEEE Std 1003.1-2024. The Open Group. 2.15 Special Builtins: colon - null utility. opengroup.org.
  25. Web site: 8 August 2025. 15 March 2018. https://web.archive.org/web/20180315115230/http://www.gnu.org/software/bash/manual/bash.html#index-background. GNU Project. Bash Reference Manual: 7.1 Job Control Basics. live. Free Software Foundation, Inc..
  26. Book: Michael , Randal . 16 August 2025. 2008. 978-0-470-18301-4. 25. Wiley Publishing, Inc., Indianapolis, Indiana. 19 :: SIGSTOP :: Stop, usually Ctrl + z. Mastering Unix Shell Scripting, 2e.
  27. Book: Newham , Cameron . 16 August 2025. 29 March 2005. 205. O'Reilly Media, Inc.. Use KILL only as a last resort!. Learning the bash Shell: Unix Shell Programming. 978-0-596-55500-9.
  28. Web site: 19 October 2025. dd(1). www.man7.org.
  29. Web site: 5 August 2025. Sending and Trapping Signals. wooledge.org.
  30. Book: Michael , Randal . 16 August 2025. 2008. 978-0-470-18301-4. 20. Wiley Publishing, Inc., Indianapolis, Indiana. In Korn shell the command recognizes these command options by default. In Bash shell we must add the switch to the command, for one new line. . Mastering Unix Shell Scripting, 2e.
  31. Web site: 8 August 2025. GNU Project. Bash Reference Manual: 3.7.3: Command Execution Environment. Free Software Foundation, Inc..
  32. Web site: 8 August 2025. GNU Project. Bash Reference Manual: 4.1: Bourne Shell Builtins. Free Software Foundation, Inc..
  33. Web site: 8 August 2025. GNU Project. Bash Reference Manual: 4.3.1: The Set Builtin. Free Software Foundation, Inc..
  34. 8 August 2025. 20 April 2021. GNU Project. bug-bash. bug-bash archives, Re: Document that set -v inside case statements is special .
  35. Web site: 8 August 2025. 23 September 2019. https://web.archive.org/web/20190923203509/https://wiki-dev.bash-hackers.org/scripting/bashchanges. Bash changes. bash-hackers.org.
  36. Web site: 5 March 2017 . 5 May 2017. https://web.archive.org/web/20170505161903/http://tldp.org/LDP/abs/html/bashver3.html#BASH3REF. Section 37.2 (Bash, version 3). Advanced Bash Scripting Guide: 37.2: Bash, version 3. live. Linux Documentation Project.
  37. Web site: 8 August 2025. GNU Project. GNU Bash Manual: 3.2.5.2: Conditional Constructs. .
  38. Web site: 8 August 2025. 15 March 2018. https://web.archive.org/web/20180315115230/http://www.gnu.org/software/bash/manual/bash.html#Programmable-Completion. GNU Project. Bash Reference Manual: 5.3.1 Brace Expansion. live. Free Software Foundation, Inc..
  39. Web site: 16 August 2025. Free Software Foundation. Prefixing a double-quoted string with a dollar sign, such as $"hello, world", causes the string to be translated according to the current locale. The infrastructure performs the lookup and translation, using the,, and shell variables.. Bash Reference Manual, 3.1.2.5 Locale-Specific Translation. Free Software Foundation, Inc..
  40. Web site: 15 August 2025. The Bash Parser. wooledge.org.
  41. Web site: 15 August 2025. Chet. Ramey. The Architecture of Open Source Applications (Volume 1): The Bourne-Again Shell. aosabook.org.
  42. Web site: 8 August 2025. 15 September 2019. https://web.archive.org/web/20190915123105/http://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-History-Builtins. GNU Project. Bash Reference Manual: 9.2: Bash History Builtins. live. Free Software Foundation, Inc..
  43. Web site: 8 August 2025. GNU Project. Bash Reference Manual: 8.6: Programmable Completion. Free Software Foundation, Inc..
  44. Web site: 8 August 2025. Case Western Reserve University. Bash Reference Manual: 8.6 Programmable completion. case.edu.
  45. Web site: 8 August 2025. 8 March 2020. https://web.archive.org/web/20200308104032/http://ftp.swin.edu.au/gnu/bash/ . Swinburne University of Technology. Index of /gnu/bash. live. swin.edu.au.
  46. Web site: 21 January 2022. Advanced Bash Scripting Guide: Appendix J: An Introduction to Programmable Completion . Linux Documentation Project.
  47. Web site: 8 August 2025. GNU Project. Bash. Free Software Foundation, Inc..
  48. Web site: 8 August 2025. Free Software Foundation. GNU Project. GNU Bash manual. Free Software Foundation, Inc..
  49. Web site: 8 August 2025. Case Western Reserve University. Bash Reference Manual. case.edu.
  50. Web site: 8 August 2025. GNU Project. git: index: bash.git. Free Software Foundation, Inc..
  51. Web site: 11 August 2025. GNU Project. GNU Coreutils manual v.9.7, 15.2 printf: Format and print data. Free Software Foundation, Inc..
  52. Web site: 8 August 2025. GNU Project. GNU Bash Manual: 1.1: What is Bash?. Free Software Foundation, Inc..
  53. Web site: 30 July 2025. Open Group. POSIX 2024. Free Software Foundation, Inc..
  54. Web site: The Open Group Base Specifications Issue 7, 2018 edition . opengroup.org.
  55. Web site: 8 August 2025. Case Western Reserve University. The GNU Bourne-Again Shell, Top Page. case.edu.
  56. Web site: 8 August 2025. Case Western Reserve University. Frequently Asked Questions. case.edu.
  57. Web site: 17 August 2025. 23 April 2024. Rhino Security Labs, Inc. CVE-2024-2448: Authenticated Command Injection In Progress Kemp LoadMaster. rhinosecuritylabs.com.
  58. Web site: 17 August 2025. January 1999. University of California, Davis. CGI-BIN Specific Vulnerabilities. ucdavis.edu.
  59. Web site: 17 August 2025. 16 April 2000. https://web.archive.org/web/20000416053740/http://www.lanl.gov/projects/ia/library/bits/bits0396.html. March 1996. Los Alamos National Laboratory. CGI Security. BITS: computing and communications news.
  60. Web site: 17 August 2025. 21 July 2025. https://web.archive.org/web/20250721233452/http://mywiki.wooledge.org/BashFAQ/048. Eval command and security issues. live. wooledge.org.
  61. News: 21 June 2019. 21 June 2019. https://web.archive.org/web/20190621183753/https://www.techolac.com/linux/linux-bash-exit-status-and-how-to-set-exit-status-in-bash/. 10 June 2017. Cino. Juliana. Linux bash exit status and how to set exit status in bash - Techolac . live. techolac.com.
  62. Web site: 25 September 2014. 16 October 2014. https://web.archive.org/web/20141016214010/http://www.theregister.co.uk/2014/09/24/bash_shell_vuln . 24 September 2014. John. Leyden. The Register. Patch Bash NOW: 'Shell Shock' bug blasts OS X, Linux systems wide open . live. theregister.co.uk.
  63. News: 25 September 2014. 5 April 2019. https://web.archive.org/web/20190405000511/https://www.nytimes.com/2014/09/26/technology/security-experts-expect-shellshock-software-bug-to-be-significant.html. 25 September 2014. Nicole. Perlroth. Security Experts Expect 'Shellshock' Software Bug in Bash to Be Significant . live. The New York Times.
  64. Web site: 14 May 2016. https://web.archive.org/web/20160514191755/http://www.zdnet.com/article/hackers-jump-on-the-shellshock-bash-bandwagon/. 29 September 2014. Larry. Seltzer. ZDNet. Shellshock makes Heartbleed look insignificant . live. zdnet.com.
  65. Web site: 25 September 2014. 25 September 2014. https://web.archive.org/web/20140925035842/https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/. 24 September 2014. Huzaifa. Sidhpurwala. Red Hat. Bash specially-crafted environment variables code injection attack . live. redhat.com.
  66. Web site: 4 October 2014. 6 October 2014. https://web.archive.org/web/20141006093452/http://seclists.org/oss-sec/2014/q4/102 . 4 October 2014. Stephane. Chazelas. oss-sec mailing list archives. live. seclists.org.
  67. Web site: Command Substitution (Bash Reference Manual) . 2026-01-14 . www.gnu.org.
  68. Web site: 8 August 2025. 4 November 2018. https://web.archive.org/web/20181104185300/http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html. Advanced Bash Scripting Guide: 2.3: Debugging Bash scripts. live. Linux Documentation Project.
  69. Web site: 8 August 2025. BASHPID. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  70. Web site: 8 August 2025. BASH_ARGC. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  71. Web site: 8 August 2025. BASH_ARGV. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  72. Web site: 8 August 2025. BASH_LINENO. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  73. Web site: 8 August 2025. BASH_SOURCE. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  74. Web site: 8 August 2025. BASH_XTRACEFD. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  75. Web site: 8 August 2025. EPOCHREALTIME. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  76. Web site: 8 August 2025. FUNCNAME. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  77. Web site: 8 August 2025. LINENO. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  78. Web site: 8 August 2025. PIPESTATUS. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  79. Web site: 8 August 2025. PPID. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  80. Web site: 8 August 2025. PS4. GNU Project. Bash Reference Manual: 5.2: Bash Variables. Free Software Foundation, Inc..
  81. Web site: 8 August 2025. GNU Project. Bash Reference Manual: 3.4.2: Special Parameters . Free Software Foundation, Inc..
  82. Web site: Shell Command Language . opengroup.org.
  83. Web site: 8 August 2025. Case Western Reserve University. Bash(1), Shell builtin commands. case.edu.
  84. Web site: 8 August 2025. GNU Project. Bourne Shell Builtins (Bash Reference Manual) . Free Software Foundation, Inc..
  85. Web site: 8 August 2025. GNU Project. Bash Reference Manual: 5.2: Bash Variables . Free Software Foundation, Inc..
  86. Web site: 8 August 2025. Case Western Reserve University. Bash(1), Special parameters. case.edu.
  87. Web site: 8 August 2025. GNU Project. The Shopt Builtin (Bash Reference Manual) . Free Software Foundation, Inc..
  88. Web site: Debian -- Details of package devscripts in sid . debian.org.
  89. Web site: Kcov - code coverage. github.io.
  90. 8 August 2025. GNU Project. bug-bash. [Bashdb-devel] Re: [PATCH] fix bashdb script handling of tmp directory ].
  91. Web site: 2 October 2018. https://web.archive.org/web/20181002232146/https://linux.die.net/man/1/bashbug. 21 October 2017. bashbug(1). die.net.
  92. Web site: 6 October 2014. https://web.archive.org/web/20141006131347/https://developer.apple.com/library/prerelease/mac/documentation/Darwin/Reference/ManPages/man1/bashbug.1.html. 4 June 2014. bashbug(1) Mac OS X Manual Page. apple.com.
  93. Web site: 8 August 2025. 10 June 2010. https://web.archive.org/web/20100610011504/http://kb.iu.edu/data/abnd.html. 5 February 2009. Indiana University. In Unix, what do some obscurely named commands stand for?. iu.edu.
  94. Web site: Louis Pouzin. 25 November 2000. The Origin of the Shell. multicians.org.
  95. Web site: The SHELL, A Global Tool for Calling and Chaining Procedures in the System. mit.edu.
  96. Web site: 8 August 2025. 16 October 1969. Vint. Cerf. UCLA, Network Working Group. ASCII Format for Network Interchange. ietf.org.
  97. 28 December 2021. 28 December 2021. https://web.archive.org/web/20211228023030/https://groups.google.com/g/comp.unix.questions/c/iNjWwkyroR8/m/yedr9yDWSuQJ. 10 February 1988. Stallman. Richard. Ramey. Chet. [email protected]. comp.unix.questions. For a year and a half, the GNU shell was "just about done". The author made repeated promises to deliver what he had done, and never kept them. Finally I could no longer believe he would ever deliver anything. So Foundation staff member Brian Fox is now implementing an imitation of the Bourne shell.. GNU + BSD = ?. live. google.com.
  98. Web site: 8 August 2025. 24 April 2011. https://web.archive.org/web/20110424064815/https://www.gnu.org/gnu/thegnuproject.html. 3 October 2010. Richard. Stallman. GNU Project. Free Software Foundation employees have written and maintained a number of GNU software packages. Two notable ones are the C library and the shell. ... We funded development of these programs because the GNU Project was not just about tools or a development environment. Our goal was a complete operating system, and these programs were needed for that goal.. About the GNU Project . live. Free Software Foundation, Inc..
  99. 28 October 2010. 4 May 2013. https://web.archive.org/web/20130504075535/http://groups.google.com/group/gnu.announce/msg/a509f48ffb298c35?hl=en. 8 June 1989. Brian. Leonard H.. Fox. Tower Jr.. gnu.announce. Bash is in beta release!. live. google.com.
  100. Web site: 9 December 2011. IBM. Evolution of shells in Linux. ibm.com.
  101. 8 August 2025. 26 August 1991. Linus. Torvalds. comp.os.minix. To make things really clear - yes I can run gcc on it, and bash, and most of the gnu [bin/file]utilities. What would you like to see most in Minix?. google.com.
  102. 28 October 2010. 2 March 2021. https://web.archive.org/web/20210302213455/https://groups.google.com/forum/. 20 April 1993. [email protected]. gnu.announce. January 1993 GNU's Bulletin. live. google.com.
  103. Web site: 13 November 2008. 5 December 2008. https://web.archive.org/web/20081205082152/http://www.linuxjournal.com/article/2800. 1 August 1994. Chet. Ramey. Linux Journal. Bash – the GNU shell (Reflections and Lessons Learned). live. linuxjournal.com.
  104. Book: 6 June 2016. 2 March 2021. https://web.archive.org/web/20210302212409/https://books.google.com/books?id=2P3zBgAAQBAJ&q=%22most+popular%22+linux+shell&pg=PA5. April 2015. 3rd. Christine. Richard. 978-1-119-02122-3. Bresnahan. Blum. 5. John Wiley & Sons, Inc.. In Linux, most users run bash because it is the most popular shell.. CompTIA Linux+ Powered by Linux Professional Institute Study Guide: Exam LX0-103 and Exam LX0-104. live.
  105. Book: 6 June 2016. 2 March 2021. https://web.archive.org/web/20210302212410/https://books.google.com/books?id=tIjrVYbZmUAC&q=bash+most+popular+unix+shell&pg=PA363. February 2006. Arman. Michael. 978-0-7821-5277-7. Danesh. Jang. 363. John Wiley & Sons, Inc.. The Bourne Again Shell (bash) is the most common shell installed with Linux distributions.. Mastering Linux. live.
  106. Web site: Debian Wiki: Shell. debian.org.
  107. 8 August 2025. 14 September 2000. Chet. Ramey. bug-bash. GNU Project. Re: Line-Edit mode is lost if "set -o vi" is in any files sourced on login..
  108. 8 August 2025. 9 April 2001. Chet. Ramey. bug-bash. GNU Project. Bash-2.05 available for FTP.
  109. https://www.google.com/books/edition/Essential_Mac_OS_X_Panther_Server_Admini/zrI-U0KWj3cC?hl=en&gbpv=1&dq=bash&pg=PA189&printsec=frontcover Essential Mac OS S Panther Server Administration, pg 189
  110. Book: 8 August 2025. 2 March 2021. https://web.archive.org/web/20210302212410/https://books.google.com/books?id=dwIRERUpQPEC&q=bash+most+popular+unix+shell&pg=PA6. April 2005. Eric. John C.. Micah. 978-0-7645-9791-6. Foster-Johnson. Welch. Anderson. 6. John Wiley & Sons, Inc.. Bash is by far the most popular shell and forms the default shell on Linux and Mac OSX systems.. Beginning Shell Scripting. live.
  111. 8 August 2025. bug-bash. GNU Project. Bash-3.0 available for FTP.
  112. 8 August 2025. bug-bash. GNU Project. Bash-3.1 released.
  113. 8 August 2025. bug-bash. GNU Project. Bash-3.2 available for FTP.
  114. 8 August 2025. bug-bash. GNU Project. Bash-4.0 available for FTP.
  115. 8 August 2025. bug-bash. GNU Project. Bash-4.1 available for FTP.
  116. 8 August 2025. bug-bash. GNU Project. Bash-4.2 available for FTP.
  117. Web site: 8 August 2025. 12 June 2018. https://web.archive.org/web/20180612144748/https://docs.oracle.com/cd/E23824_01/html/E24456/userenv-1.html. Oracle Corporation. User Environment Feature Changes. live. oracle.com.
  118. 8 August 2025. bug-bash. GNU Project. Bash-4.3 available for FTP.
  119. Web site: 8 August 2025. GNU Bash through 4.3 processes trailing strings after function definitions in the values of environment variables, which allows remote attackers to execute arbitrary code via a crafted environment, as demonstrated by vectors involving the ForceCommand feature in OpenSSH sshd, the mod_cgi and mod_cgid modules in the Apache HTTP Server, scripts executed by unspecified DHCP clients, and other situations in which setting the environment occurs across a privilege boundary from Bash execution, aka "ShellShock.". CVE-2014-6271. cve.org.
  120. Web site: 8 August 2025. CVE-2014-7169. cve.org.
  121. 8 August 2025. bug-bash. GNU Project. Bash 3.0 Official Patch 1.
  122. Web site: 8 August 2025. 5 June 2019. Armin. Briegel. Moving to zsh. scriptingosx.com.
  123. Web site: 8 August 2025. 2 December 2019. https://web.archive.org/web/20191202143802/https://support.apple.com/en-us/HT208050. Apple Support – Use zsh as the default shell on your Mac. live. apple.com.
  124. Web site: 8 August 2025. 10 June 2019. https://web.archive.org/web/20190610051842/https://www.theverge.com/2019/6/4/18651872/apple-macos-catalina-zsh-bash-shell-replacement-features. 4 June 2019. Tom. Warren. The Verge. The bash binary bundled with macOS has been stuck on version 3.2 for a long time now. Bash v4 was released in 2009 and bash v5 in January 2019. The reason Apple has not switched to these newer versions is that they are licensed with GPL v3. Bash v3 is still GPL v2.. Apple replaces bash with zsh as the default shell in macOS Catalina. live. theverge.com.
  125. Web site: 8 August 2025. 31 December 2020. https://web.archive.org/web/20201231231721/https://thenextweb.com/dd/2019/06/04/why-does-macos-catalina-use-zsh-instead-of-bash-licensing/. 4 June 2019. Matthew. en-us. Hughes. The Next Web. Why does macOS Catalina use Zsh instead of Bash? Licensing. live.
  126. 8 August 2025. bug-bash. GNU Project. Bash-5.0 release available.
  127. 8 August 2025. bug-bash. GNU Project. Bash-5.1 release available.
  128. Web site: 8 August 2025. 5 February 2025. Command-line shell. archlinux.org.
  129. Web site: 18 August 2025. Hanny Helal. 7 January 2015. Tecmint. Gtkdialog – Create Graphical (GTK+) Interfaces and Dialog Boxes Using Shell Scripts in Linux. tecmint.com.
  130. Web site: 18 August 2025. Issue 99. Kristian Kißling. 2009. Linux Magazine. Adding graphic elements to your scripts with Zenity and KDialog. linux-magazine.com.
  131. Web site: 18 August 2025. WikiMedia. Bash Shell Scripting/Whiptail. wikibooks.org.
  132. Web site: 18 August 2025. Dmitri Popov. 12 March 2012. Linux Magazine. Dress Up Bash Scripts with YAD. linux-magazine.com.
  133. Web site: 18 August 2025. Issue 247. Pete Metcalfe. 2021. Linux Magazine. Create GUI dialogs in one line of code. linux-magazine.com.