The Bash commandsyntax is asuperset of theBourne 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 theC shell, its successortcsh, and theKorn Shell. It is available on nearly all modern operating systems, making it a versatile tool in various computing environments.
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 thenull character and forward slash/, can be used infilenames. In addition, all strings are case-sensitive.[10]
The Control+key functionality is provided byGNU 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.
Tab ↹ – Activate tab completion
↑ – Scroll up (i.e. backward) in the command history
↓ – Scroll down (i.e. forward) in the command history
Ctrl+r – 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 ofEmacs.[11]
Default keybindings for control codes include:
Ctrl+f – Move the cursor one character to the right
Ctrl+b – Move the cursor one character to the left
Alt+f – Move the cursor one word to the right
Alt+b – Move the cursor one word to the left
Ctrl+a – Move the cursor to the beginning of the current commandline
Ctrl+c – Cancels the current command and presents a new prompt
Ctrl+d – Closes the current Bash instance, possibly also closing the terminal-emulator
Ctrl+e – Move the cursor to the end of the current commandline
Ctrl+q – Wake the terminal; buffered keypresses are then processed
Ctrl+s – Put the terminal to sleep
Ctrl+w – Remove one word to the left of the cursor
Ctrl+z – Stop a foregrounded process
Vi keybindings are also available and can be enabled by runningset-ovi.[12][13]
When Bash reads afull command line, the complete string is broken down intotokens."Tokens" are identified using, and separated from each other usingmetacharacters.
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 downfull command strings into tokens or groups of tokens thatdo contain metacharacters and tokens or groups of tokens that donot contain any metacharacters—called"words".From there it further breakswords down into more specific, meaningful pieces like command names, variable assignment statements, etc.
Aword is a sequence of (non-meta-) characters treated as a single unit by the shell. Areserved word is a kind of aword that has a special meaning to the shell.[14]Aname is a kind of a word separate fromreserved 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 calledidentifiers, may be used for naming variables and functions.
Sixteen of the twenty-two"reserved words", which may be characters or words are as follows:
Names may only contain the charactersABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.
In the following example of a full command string,metacharacters have a comma placed above them,,,reserved words have a caret placed beneath them,^, and othertokens have a backtick placed also beneath them,`.
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 insingle parentheses.
$echofoofoo$(echofoo)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.[clarification needed]
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 likeC orJava.[15] 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.[clarification needed]
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.
A variable is assigned to using the syntaxname=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.[15] For example,$@ expands to a list of the first through last positional parameters, "individually requoted, separated by spaces".[attribution needed]
Environment variables are signified by all capital letters. Environment variables include UNIX variables likeLESS_SIGUSR1, and Bourne shell variables such asHOME.[15] Scripting variables are signified by all lower case letters or CamelCase. This is only convention; any variable can be passed to theexport command to be made into an environment variable.
Arrays are data structures which hold multiple values.[16] 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 syntaxname=( one or more elements ). It is expanded using${quux[@]} or${quux[*]} or${quux[1]}, depending on the use case.
"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=aabar=bbquux=cczork=dd;set-oxtrace$:"${foo}";:"${bar}"+ : aa+ : bb$:"${quux}"\>:"${zork}"+ : 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$PATH variable and the current working directory.[18]
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, thevalue of this waiting-string is held in the shellvariable$PS1. For regular users, a common default value for$PS1 is the dollar character,$.[a] For thesuperuser, a common default value is hashtag (#)
$sudo--login--userroot[sudo] password for liveuser:#vim/home/liveuser/names.txt#exit$grep-ebob./names.txtgrep: ./names.txt: Permission denied
Although most users think of the shell as an interactive command interpreter, it is really a programming language in which each statement runs a command. Because it must satisfy both the interactive and programming aspects of command execution, it is a strange language, shaped as much by history as by design.
Bash is written in C. A modular style can be approximated through good style and careful design.[19] It is often used in animperative orprocedural style.
As acommand processor, Bash can operate in two modes: interactive or non-interactive.Ininteractive mode, commands are usually read from aterminal emulator. In non-interactive mode, which facilitatesautomation, commands are usually read from named files known today asshell scripts. When executed as a standalone command at thecommand-line interface (CLI), by default Bash opens a new shell in interactive mode.
Shell scripts are text files that containcode, oftencommands, intended to be read and acted upon by some particularinterpreter in abatch process in anon-interactive mode and without any further user interaction. Interpreted scripts areprograms that do not require theirsource code to becompiled: 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 ashebang: literally the characters hashtag (#) and bang (!) side by side.
$cat./example.sh#!/bin/envbashecho 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 ofexecutable unix shell scripts are identified the suffix.sh. The "execute" bit can be enabled on a shell script with the utilitychmod:
$ls-l./example.sh-rw-r--r--.1 liveuser liveuser 32 Aug 3 22:33 example.sh$./example.shbash: ./example.sh: Permission denied$chmod0744./example.sh$ls-l./example.sh-rwxr--r--.1 liveuser liveuser 32 Aug 3 22:33 example.sh$./example.shfoo$
Bash can be executed as alogin shell, or "session leader," in both interactive and non-interactive modes via the--login option. "Logging in" requires userauthentication. 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.
When a human user initiates a login session, this procedure often occurs in agraphical user interface (GUI).When a user opens aterminal emulator, the emulator executes anon-login instance of the user's login shell.
Logging out of a shell session from within a terminal emulator can be accomplished with the exit command or, by default in Bash, pressing Ctrl+d.
When Bash starts, it usessource to execute commands in a variety ofdotfiles (see lists below).[21]These dotfiles, unlike shell scripts, typically have neither the execute permission enabled nor ahash-bang. By default Bash will source a somewhat different set of files, and in a different sequence, depending on:[22]
How Bash is called: interactively, non-interactively, invoked with namesh
Which options are used:--login,--rcfile,--norc,--posix
Which environment variables are defined:BASH_ENV,ENV, and
Which files exist:
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
~/.bash_logout, and
~/.bashrc among others.
Of course, any startup file can also execute commands from any other file. Startup files can affect shell behavior, terminal emulators, theX window system and thewindow manager.
ThePOSIX IEEE 1003.1 standard specifies a common set of definitions that any shellsystem application (bash,dash,zsh, etc.) may conform to.Any shelluser script (./myscript.sh) written in conformance with POSIX guidelines should be executable by any shellsystem application that hasimplemented 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 ofPOSIX 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 eithersh,bash --posix orbash -o posix.[23] To cause a script to be initialized in POSIX mode, one would use the either the hashbang#! /bin/env sh or the less portable#!/bin/sh. When an instance of Bash is operating in POSIX mode, the environment variable$POSIXLY_CORRECT is defined, and the value of the environment variableSHELLOPTS includes the stringposix.
$declare-pPOSIXLY_CORRECTbash: declare: POSIXLY_CORRECT: not found$sh$declare-pPOSIXLY_CORRECTdeclare -- POSIXLY_CORRECT="y"$
The full list of features available in Bash which are not specified by POSIX is considerable.[24] Here is a partial list:
Any arrays other than the array of positional parameters,$@, are not POSIX
The double bracket extended test construct,[[...]], is not POSIX
[...] andtest are POSIX
One of the double-parentheses arithmetic-evaluation syntaxes,((...)), is not POSIX
$((...)) is POSIX
Brace expansion,kernel{,-headers}, is not POSIX
Dynamic scoping of parameters and thelocal builtin are not POSIX
Process substitution,<(...), is not POSIX
Certain string-manipulation operations in parameter expansions are not POSIX
Most Bash builtin commands are not POSIX
The commandenable-s prints the list of Bourne special builtins, which are POSIX
$enable-s|wc--lines16$enable|wc--lines61
Theenable builtin itself is not POSIX
In Bash, in non-POSIX mode, the. andsource builtins are synonymous
The. (i.e., 'dot') builtinis POSIX, however
Thesource builtinis not POSIX
The$EPOCHSECONDS and$EPOCHREALTIME shell variables are not POSIX
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 asls) are standalone programs in the/bin,/usr/bin,/sbin or/usr/sbin directories (in Linux, typically provided byGNU coreutils orBusyBox) 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.[23][25]
Code that is valid syntax in Bash but not specified by POSIX is called a "bashism". The programcheckbashisms can be used to make sure that a script can be executed inDebian Linux without any portability errors.[26] Vidar Holen'sshellcheck is another staticlinter written inHaskell which can parse script syntax for compatibility with any or all of bash, dash, ksh, and Bourne sh.[27]
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 thedash shell),[25] while a script intending to support pre-POSIX Bourne shells, likeautoconf'sconfigure, are even more limited in the features they can use.[28]
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:
Changing directories with thecd builtin.
Setting or unsetting the values of theSHELL,PATH,HISTFILE,ENV, orBASH_ENV variables.
Specifying command names containing slashes on the CLI.
Using absolute pathnames as arguments to the.,history, orhash-p commands.
Specifying a path search with. -p orcommand-p.
Importing function definitions and parsing the value ofSHELLOPTS from the shell environment at startup.
Redirecting output using the>,>,<>,>&,&>, and>> redirection operators.
Using theexec builtin to replace the shell with another command.
Altering shell builtins.
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.
In Bash, "privileged mode" is a rarely used option inherited[citation needed] from the SVR4.2UNIX System V shell (circa 1992).[29] It can be enabled withset-p and disabled withset+p.[30] When privileged mode is enabled, theSHELLOPTS shell variables includes the string "privileged".
Enabled viabash --debugger at invocation or viashopt-sextdebug during either interactive or non-interactive modes. It uses a separate program calledbashdb.[31]extdebug is not available in POSIX mode. See documentation for more information. See also§ Debugging.
Bash-4.0 introduced the concept of a shell compatibility level, specified as a set of options to the shopt builtin (compat31, compat32, compat40, compat41, and so on). There is only one current compatibility level – each option is mutually exclusive. The compatibility level is intended to allow users to select behavior from previous versions that is incompatible with newer versions while they migrate scripts to use current features and behavior. It's intended to be a temporary solution.[32]
When xtrace is enabled, simple debugging content is printed to the terminal.It can be enabled withset -o xtrace orset -x, and disabled withset +o xtrace,set +x orset -.These options are also accepted at the commandline and at hash-bangs:#!/bin/bash -x, etc.
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:§ xtrace.
Comments denoted with a colon character,:, originated with theThompson 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.[34]
$# Define foo$foo=bar# An inline hash comment occurs on the same line as a command$set-x$# A regular comment (no output)$:"${foo}"+ : bar$
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.ping 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
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 command1 is finished, command2 is executed, and when command2 has completed, command3 will execute.Abackground execution of command1 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 command1 and command2, they must be executed in the Bash shell in the following way:
$command1&command2$
In this case command1 is executed in the background,& symbol, returning immediate control to the shell that executes command2 in the foreground.A process can be stopped and control returned to bash by typingCtrl+z while the process is running in the foreground.[35]A list of all processes, both in the background and stopped, can be achieved by runningjobs:
$jobs[1]- Running command1 &$
In the output, the number in brackets refers to the job id.The plus sign signifies the default process forbg andfg.The text "Running" and "Stopped" refer to theprocess state.The last string is the command that started the process.
The state of a process can be changed using various commands.Thefg command brings a process to the foreground, whilebg sets a stopped process running in the background.bg andfg 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 ofjobs.Thekill command can be used to end a process prematurely, by sending it asignal.The job id must be specified after a percent sign:
Signaling is a means ofinter-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 Ctrl-c to end the current foreground process and return control back to the user prompt, or to press Ctrl-z 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 kill program to send an IPC signal.In this example, we use the kill command from a second terminal screen to terminate the process with PID 4331.
$tty# Terminal two/dev/pts/1$whoamiliveuser$psaux|grep-esleep-ePIDUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDliveuser 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$kill4331$psaux|grep-esleep-ePID# The sleep process has endedUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDliveuser 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$sleep1000Terminated$
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 kill builtin or using the system binary of the same name.
$whoamiliveuser$psaux|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-sSIGKILL1bash: kill: (1) - Operation not permitted$type-akillkill is a shell builtinkill is /usr/bin/kill$/usr/bin/kill-sSIGKILL1kill: sending signal to 1 failed: Operation not permitted$
The most commonly used signals can be viewed withkill -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.[36]When a process receives a SIGKILL, the process terminates immediately and messily.It is recommended to use SIGKILL only as a last resort.[37]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, thedd command.[38]
When bash is interactive, in the absence of any traps, it ignoresSIGTERM (so thatkill0 does not kill an interactive shell), and catches and handlesSIGINT (so that the wait builtin is interruptible). When bash receivesSIGINT, it breaks out of any executing loops. In all cases, bash ignoresSIGQUIT. If job control is in effect, bash ignoresSIGTTIN,SIGTTOU, andSIGTSTP.[39]
— bash(1)
By default Bash shell scripts receive and respond to any and all IPC signals sent to them, however, Bash scripts can utilize the trap builtin to catch and handle signals.[40]
There are a few signals which are only available from within Bash as GNU extensions:ERR,EXIT,RETURN andDEBUG.These signals can be useful in debugging, and can only be sent and handled by shell builtins.See also§ Debugging.
There are many different implementations ofecho. Some have the-e option, and some don't.[41]The list of options is not uniform across implementations, thoughecho andprintf 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 useprintf.
For any string containing any character (besides null?) including digits, the format specifier is%s.[citation needed]
Withprintf, 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>'"${foo}""${bar}"<abc><123>$
Another very consistent method is to usedeclare-p.The output ofdeclare-p can be reused as input.However, not all variables and parameters can be printed usingdeclare-p, for example, the values of the Special Parameters.The Special Parameter hashtag,"$#", reports how many Positional Parameters are currently defined.
$declare-pfoobardeclare -- 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 bedeclare-p.This command would, according tohelp declare, "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,printf cannot display variables' attributes.See also§ Debugging.
Shell andsession startup files such as~/.bashrc and~/.profile (i.e.,dotfiles);
Settings (setbuilt-in) and shell options (shoptbuilt-in) which alter shell behavior;
Shell and session startup Files (a.k.a., "dot files")
When Bash starts, it executes the commands in a variety ofdot files.[21]Unlike Bash shell scripts, dot files typically have neither the execute permission enabled nor aninterpreter directive like#!/bin/bash.
Legacy-compatible Bash startup example
The example~/.bash_profile below is compatible with the Bourne shell and gives semantics similar to csh for the~/.bashrc and~/.bash_login.The[ -rfilename ] && cmd is ashort-circuit evaluation that tests iffilename 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
Operating system issues in Bash startup
Some versions ofUnix andLinux contain Bash system startup scripts, generally under the/etc 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 theX 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 thewindow manager.These issues can often be addressed using a~/.xsession or~/.xprofile file to read the~/.profile — which provides the environment variables that Bash shell windows spawned from the window manager need, such asxterm orGnome Terminal.
Aliases allow a string to be substituted for a word that is in a position in the input where it can be the first word of a simple command. Aliases have names and corresponding values that are set and unset using the alias and unalias builtin commands.
Bash function declarations which include this particular keyword are not compatible with Bourne/Korn/POSIX scripts, however, Bash does accepts the function declaration syntax used by Bourne, Korn and POSIX-compliant shells.
Shell functions are a way to group commands for later execution using a single name for the group. They are executed just like a "regular" simple command. When the name of a shell function is used as a simple command name, the shell executes the list of commands associated with that function name. Shell functions are executed in the current shell context; there is no new process created to interpret them.
Xtrace: [set-x |set-oxtrace ]. The shell's primary means of debugging. Both xtrace and verbose can be turned off at the same time with the commandset-.
Verbose: [set-v |set-overbose ]. Prints a command to the terminal as Bash reads it. Bash reads constructs all at once, such as compound commands which include if-fi and case-esac blocks. If aset-v is included within a compound command, then "verbose" will be enabled the next time Bash reads code as input, i.e., after the end of the currently executing construct.[56]
Both xtrace and verbose can be turned off at the same time with the commandset-.
When the shell looks for external commands, it relies on the Bourne shell variable$PATH.$PATH 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$PATH by including source files in/etc/profile.d and other locations.
When looking for the command,chmod, for instance, after considering internal commands and finding nothing, Bash will search the directories in$PATH and will select the absolute path of the first executable found that has a basename which matches the search string.[18]
If there is more than one commandecho available in the directories listed in$PATH, during the process of parsing and executing a commandline, by default only the first command found will be selected.$PATH lookups are slow.The shell speeds up the commandline execution process by remembering command locations in a hash table.To perform a full$PATH search without any interference from the hash table, remove the current table withhash-r and search for all kinds of commands withtype-a.
$# Force a full path search$PATH=${PATH}:${HOME}$printf'echo script_file: "$@"\n'>./echo$chmod0700./echo$hash-r;type-aechoecho 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$PATH string, you can specify an absolute path or you can anchor path resolution relative to the current working directory.
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-stylepipelines:|.
Bash supplies "conditional execution" command separators that make execution of a command contingent on theexit code set by a precedent command.For example:
Where./do_something is only executed if thecd (change directory) command was "successful" (returned an exit status of zero) and theecho command would only be executed if either thecd or the./do_something command return an "error" (non-zero exit status).
ITERATION: Sometimes programs are repeated indefinitely or until a specific outcome is reached. Each execution of the instructions is an "iteration."[58]
while,until, andselect loop compound commands;
Arithmetic C-style and list-enumeratingfor loop compound commands; and
continue,break,return, andexit flow control commands;
Bash 3.0 supports in-processregular expression matching using a syntax reminiscent ofPerl.[61]Regexp matching is limited to strings on the right side of the=~ operator in the[[..]] extended test construct.[62]
[[$line=~[[:space:]]*(a)?b]] means values for line like 'aab', ' aaaaaab', 'xaby', and ' ab' will all match, as will a line containing a 'b' anywhere in its value.
A coprocess is a shell command preceded by the coproc reserved word. A coprocess is executed asynchronously in a subshell, as if the command had been terminated with the '&' control operator, with a two-way pipe established between the executing shell and the coprocess.[63]
Brace expansion, also called alternation, is a feature copied from theC shell.It generates a set of alternative combinations.[65]Generated results need not exist as files.The results of each expanded string are not sorted and left to right order is preserved:
$echoa{p,c,d,b}eape ace ade abe$echo{a,b,c}{d,e,f}ad ae af bd be bf cd ce cf
Users should not use brace expansions in portable shell scripts, because theBourne shell does not produce the same output.
$# bash shell$/bin/bash-c'echo a{p,c,d,b}e'ape ace ade abe$# A traditional shell does not produce the same output$/bin/sh-c'echo a{p,c,d,b}e'a{p,c,d,b}e
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*.{jpg,jpeg,png}# expands to *.jpg *.jpeg *.png – after which,# the wildcards are processedecho*.{png,jp{e,}g}# 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..10}1 2 3 4 5 6 7 8 9 10$echo{01..10}01 02 03 04 05 06 07 08 09 10$echofile{1..4}.txtfile1.txt file2.txt file3.txt file4.txt$echo{a..e}a b c d e$echo{1..10..3}1 4 7 10$echo{a..j..3}a d g j
When brace expansion is combined with variable expansion (a.k.a.,parameter expansion andparameter substitution) the variable expansion is performedafter the brace expansion, which in some cases may necessitate the use of theeval built-in, thus:
$start=1;end=10$echo{$start..$end}# fails to expand due to the evaluation order{1..10}$evalecho{$start..$end}# variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10
Bash supportsprocess substitution using the<(command) and>(command) 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 temporarynamed pipes where necessary).
Arithmetic expansion,((...)) or$((...)), including
Integerarithmetic in anybase from two to sixty-four, although
Floating-point arithmetic is not available from within the shell itself (for this functionality, see current versions ofbc andawk, among others),
Bash can perform integer calculations ("arithmetic evaluation") without spawning external processes.It uses the((...)) command and the$((...)) variable syntax for this purpose.
Here strings,<<<, which allow parameters to be used as input, and
A redirection operator,>|, which can force overwriting of a file when a shell'snoclobber setting is enabled;
Its syntax simplifiesI/O redirection.For example, it can redirectstandard output (stdout) andstandard error (stderr) at the same time using the&> operator.This is simpler to type than the Bourne shell equivalent 'command>file2>&1'.Bash supportshere documents.Since version 2.05b Bash can redirectstandard input (stdin) from a "here string" using the<<< operator.
Also known as "tab completion" or "command-line completion", when a user presses theTab ↹, within an interactive command-shell Bash automatically uses any available completion scripts to suggest partly typed program names, filenames and variable names.[73][4] 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 programmablecompletion via built-incomplete,compopt, andcompgen commands.[74]The feature has been available since the beta version of 2.04 released in 2000.[75]These commands enable complex and intelligent completion specification for commands (i.e., installed programs), functions, variables, and filenames.[76]
Thecomplete andcompopt two commands specify how arguments of some available commands or options are going to be listed in thereadline input.As of version 5.1 completion of the command or the option is usually activated by the Tab keystroke after typing its name.[76]This feature is available in interactive mode only.
Auser 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/usr/share/doc/bash,/usr/local/share/doc/bash, or similar directories on your system."[77]On GNU/Linux systems, if theinfo program is available then the GNU Manual version relevant for your installation should also be available atinfo bash.[78][79]
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 theman program atmanbash.[78][39][80]
With recent versions of Bash, information on shell built-in commands can be found by executinghelp,help[nameofbuiltin] orman builtins at a terminal prompt where bash is installed.
Theprintf command can be invoked viaenv to ensure that you run the program found via your shell's search path, and not a shell alias or built-in function:envprintf--help.[81]
For the purpose of allowing inter-operability among different shell programs running on different operating systems, thePOSIX 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)."[82]The most recent publication of the standard (2024) is available online.[83]
As the standard upon which bash is based, the POSIX Standard, or IEEE Std 1003.1,[84]et seq, is especially informative.
"The project maintainer also has a Bash page which includes Frequently Asked Questions",[77][85][86]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 atBash - GNU Project - Free Software Foundation.
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,rm-rf${dir}/, but the variable$dir is left undefined.In Linux, if the script was executed by a regular user, the shell would attempt to execute the commandrm -rf / 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 usesudo on a per-command basis instead.
"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."
Input validation is performed to ensure only properly formed data is entering the workflow in an information system, preventing malformed data from persisting in the database and triggering malfunction of various downstream components. Input validation should happen as early as possible in the data flow, preferably as soon as the data is received from the external party.[91]
Exploitation of the vulnerability could enablearbitrary code execution inCGI scripts executable by certain versions of Bash.The bug involved how Bash passed function definitions to subshells throughenvironment variables.[96]The bug had been present in thesource code since August 1989 (version 1.03)[97] 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 theCommon Vulnerability identifiers CVE-2014-6271, CVE-2014-6277 and CVE-2014-7169, among others.Under CVSS Metrics 2.x and 3.x, the bug is regarded as "high" and "critical", respectively.
Bash features which can be useful during debugging.[4][57][99]
Feature
POSIX 2024
Description
Bash ver.
Grammar type
Formal name
Syntax
Special Built-In Utility
set / xtrace
set-x
Yes
The shell'sprimary 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
"$?"
Yes
"Expands to the shortest representation of the decimal exit status."
?
Parameter Expansions
Indicate Null or Unset
"${parameter:?[word]}"
Yes
"Where the expansion of[word], 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
"$$"
Yes
"Expands to the shortest representation of the decimal process ID of the invoked shell."
?
Special Built-In Utility
set / verbose
set-v
Yes
"Writes its input to standard error as it is read."
?
Special Built-In Utility
set / pipefail
set-opipefail
Yes
"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
set-u
Yes
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
set-e
Yes
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
trap'[arg]'EXIT
Yes
"If a signal specifier is0 orEXIT,[arg] is executed when the shell exits." If[arg] contains expansions, then[arg] should be in single quotes.
?
Utility
printf
printf'<%s>\n'"${var}"
Yes
A means of reliably printing the contents of a variable.
?
Bash Variables
BASHPID
"${BASHPID}"
No
"Expands to the process ID of the current bash process."[100]
?
Bash Variables
BASH_ARGC
"${BASH_ARGC[@]}"
No
"An array variable whose values are the number of parameters in each frame of the current bash execution call stack."[101]
?
Bash Variables
BASH_ARGV
"${BASH_ARGV[@]}"
No
"An array variable containing all of the parameters in the current bash execution call stack."[102]
?
Bash Variables
BASH_LINENO
"${BASH_LINENO[@]}"
No
"An array variable whose members are the line numbers in source files where each corresponding member of"${FUNCNAME[@]}" was invoked."[103]
?
Bash Variables
BASH_REMATCH
"${BASH_REMATCH[@]}"
No
"An array variable whose members are assigned by the=~ binary operator to the[[ conditional command."[104]
?
Bash Variables
BASH_SOURCE
"${BASH_SOURCE[@]}"
No
"An array variable whose members are the source filenames where the corresponding shell function names in the"${FUNCNAME[@]}" array variable are defined."[105]
?
Bash Variables
BASH_XTRACEFD
"${BASH_XTRACEFD}"
No
"If set to an integer corresponding to a valid file descriptor, Bash will write the trace output generated whenset-x is enabled to that file descriptor."[106]
?
Bash Variables
EPOCHREALTIME
"${EPOCHREALTIME}"
No
"Each time this parameter is referenced, it expands to the number of seconds since the Unix Epoch (seetime(3)) as a floating point value with micro-second granularity."[107]
?
Bash Variables
FUNCNAME
"${FUNCNAME[@]}"
No
"An array variable containing the names of all shell functions currently in the execution call stack."[108]
?
Bash Variables
LINENO
"${LINENO}"
No
"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."[109]
?
Bash Variables
PIPESTATUS
"${PIPESTATUS[@]}"
No
"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)."[110]
"The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace."[112]
?
Shell Builtin
set / restricted
set-r
No
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.
?
Shell Builtin
shopt / extdebug
shopt-sextdebug
No
"Behavior intended for use by debuggers."
?
Shell Builtin
trap / DEBUG
trap'[arg]'DEBUG
No
"If a sigspec is DEBUG, the command arg is executed before" certain kinds of commands.
?
Shell Builtin
trap / ERR
trap'[arg]'ERR
No
"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.
?
Shell Builtin
trap / RETURN
trap'[arg]'RETURN
No
"If a sigspec is RETURN, the command arg is executed each time a shell function or a script executed with the. orsource builtins finishes executing."
With the"${var:?}" parameter expansion, an unset or null variable can halt a script.
$catex.sh#!/bin/bashbar="foo is not defined"echo "${foo:?$bar}"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 theset 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-parraydeclare -a array=([0]="a" [1]=" b" [2]=$' \n c ')
Printing an error message when there's a problem.
$caterror.sh#!/bin/envbashif ! lsblk | grep sdbthen echo Error, line "${LINENO}"fi$./error.shError, line 130
Usingxtrace.If errexit had been enabled, thenechoquux would not have been executed.
"bashbug" redirects here. For The widely reported September 2014 bug found in Bash, seeShellshock (software bug).
An external command calledbashbug 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).[126][127]
Shell script functionality originated with files called "runcoms" in reference to the 1963macro processor of the same name.The suffix "rc" is short for "runcom."[128]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.[129][130]TheASCII standard forcharacter encoding was defined in 1969 in a document calledRequest for Comments (RFC) 20.[131]
Significant events in Bash history are listed below:
Date
Event
1988-01-10
Brian Fox begancoding Bash afterRichard Stallman became dissatisfied with the lack of progress being made by a prior developer.[132]Stallman and theFSF considered a free shell that could run existing shell scripts so strategic to a completely free system built from BSD and GNU code that this was one of the few projects they funded themselves.Fox undertook the work as an employee of FSF.[132][133]
1989-06-08
Fox released Bash as a beta, version 0.99.[134]The license was GPL-1.0-or-later."In addition to supporting backward-compatibility for scripting, Bash has incorporated features from the Korn and C shells.You'll find command history, command-line editing, a directory stack (pushd and popd), many useful environment variables, command completion, and more."[135]Eventually it supported "regular expressions (similar to Perl), and associative arrays".
1991
Bash holds historical significance as one of the earliest programs ported to Linux byLinus Torvalds, alongside the GNU Compiler (GCC).[136]
1992 ~ 1994
Brian Fox retired as the primary maintainer sometime between mid-1992[137]and mid-1994.[138][139]His responsibility was transitioned to another early contributor, Chet Ramey.[85][140][7][9]Since then, Bash has become the most popular default interactive shell among the major GNU/Linux distributions, such asFedora,Debian, andopenSUSE, as well as among their derivatives and competitors.[141][142]
1994-01-26
Debian – initial release.Bash is the default interactive and non-interactive shell.[143]
1996-12-31
Chet Ramey released bash 2.0.The license was GPL-2.0-or-later
Bash became the default shell on Apple's operating systems (i.e., MacOS) starting with OS X 10.3 Panther.[146][147]It was available on OS X 10.2 Jaguar as well where the default shell was tcsh.
Termux and other terminal emulation applications provide availability of Bash onAndroid.
2016-09-15
Bash 4.4 released.
2009 ~ 2018
Apple declines to accept version 4 of Bash being licensed under version 3 of theGNU GPL, and ceases to supply upgrades to Bash beyond version 3.2 (as supplied inMacOS Mojave).
^abShell scripts do not require compilation before execution and, when certain requirements are met, can be invoked as commands by using their filename.
^In February 2009,[66]Bash 4.0[d][67]introduced support forassociative arrays.[4] Associative array indices are strings, in a manner similar toAWK orTcl.[68] They can be used to emulate multidimensional arrays.
^ab Although they can be used in conjunction, the use of brackets in pattern matching,[...], and the use of brackets in the testing commands,[ and[[ ... ]], are each one different things.
^for this functionality, see current versions ofbc andawk, among others.
^"GNU Bash".Free Software Foundation, Inc.GNU Project.Archived from the original on 26 April 2019. Retrieved8 August 2025.Bash is free software, distributed under the terms of the [GNU] General Public License as published by the Free Software Foundation, version 3 of the License (or any later version).
^"bash-1.11".oldlinux.org. Archived fromthe original on 15 October 2021. Retrieved8 August 2025.See test.c for GPL-2.0-or-later
Hamilton, Naomi (30 March 2008)."The A–Z of Programming Languages: BASH/Bourne-Again Shell".computerworld.com.au.Computerworld Australia. p. 2. Archived fromthe original on 11 August 2016. Retrieved8 August 2025.When Richard Stallman decided to create a full replacement for the then-encumbered Unix systems, he knew that he would eventually have to have replacements for all of the common utilities, especially the standard shell, and those replacements would have to have acceptable licensing.
^Michael, Randal (2008).Mastering Unix Shell Scripting (2nd ed.). Indianapolis, Indiana:Wiley. p. 3.ISBN978-0-470-18301-4. Retrieved16 August 2025.UNIX is case sensitive. Because UNIX is case sensitive, our shell scripts are also case sensitive.
^abStevens, Al (1 July 2021)."I Almost Get a Linux Editor and Compiler".Dr. Dobbs' Journal. Archived fromthe original on 2 March 2021. Retrieved8 August 2025.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.
^GNU Project. "B.1 Implementation Differences from the SVR4.2 Shell".Bash Reference Manual.Free Software Foundation. Retrieved13 August 2025.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....
^GNU Project. "4.3.1 The Set Builtin".Bash Reference Manual.Free Software Foundation. Retrieved13 August 2025.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.
^Michael, Randal (2008).Mastering Unix Shell Scripting, 2e. Wiley Publishing, Inc., Indianapolis, Indiana. p. 20.ISBN978-0-470-18301-4. Retrieved16 August 2025.In Korn shell theecho command recognizes these command options by default. In Bash shell we must add the-e switch to theecho command,echo-e"\n" for one new line.
^"Bash Reference Manual, 6.6 Aliases".Free Software Foundation, Inc.GNU Project. Retrieved14 August 2025.Aliases allow a string to be substituted for a word that is in a position in the input where it can be the first word of a simple command. Aliases have names and corresponding values that are set and unset using the alias and unalias builtin commands.
^"Bash Reference Manual, 3.3 Shell Functions".Free Software Foundation, Inc.GNU Project. Retrieved14 August 2025.Shell functions are a way to group commands for later execution using a single name for the group. They are executed just like a "regular" simple command. When the name of a shell function is used as a simple command name, the shell executes the list of commands associated with that function name. Shell functions are executed in the current shell context; there is no new process created to interpret them.
^Stephen R Bourne (12 June 2015)."Early days of Unix and design of sh"(PDF).bsdcan.org. BSDcan 2015: The Technical BSD Conference. Retrieved8 August 2025.
^Mallett, Andrew (24 December 2015).Mastering Linux Shell Scripting. Packt Publishing, Ltd. p. 56.ISBN978-1-78439-759-3. Retrieved16 August 2025.Learning this now can save us a lot of pain and heartache later, especially....
^"CGI Security".BITS: computing and communications news. Los Alamos National Laboratory. March 1996. Archived fromthe original on 16 April 2000. Retrieved17 August 2025.
^abStallman, Richard; Ramey, Chet (10 February 1988)."GNU + BSD = ?".google.com.Newsgroup: comp.unix.questions.Usenet:2362@mandrill.CWRU.Edu.Archived from the original on 28 December 2021. Retrieved28 December 2021.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.
^Stallman, Richard (3 October 2010)."About the GNU Project".Free Software Foundation, Inc.GNU Project.Archived from the original on 24 April 2011. Retrieved8 August 2025.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.
^Danesh, Arman; Jang, Michael (February 2006).Mastering Linux. John Wiley & Sons, Inc. p. 363.ISBN978-0-7821-5277-7.Archived from the original on 2 March 2021. Retrieved6 June 2016.The Bourne Again Shell (bash) is the most common shell installed with Linux distributions.
^Foster-Johnson, Eric; Welch, John C.; Anderson, Micah (April 2005).Beginning Shell Scripting. John Wiley & Sons, Inc. p. 6.ISBN978-0-7645-9791-6.Archived from the original on 2 March 2021. Retrieved8 August 2025.Bash is by far the most popular shell and forms the default shell on Linux and Mac OSX systems.
^"CVE-2014-6271".cve.org. Retrieved8 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."
^Warren, Tom (4 June 2019)."Apple replaces bash with zsh as the default shell in macOS Catalina".theverge.com.The Verge.Archived from the original on 10 June 2019. Retrieved8 August 2025.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.