Bash (Bourne-again Shell) is a command-line shell/programming language by the GNU Project. Its name is a homaging reference to its predecessor, the long-deprecated Bourne shell. Bash can be run on most UNIX-like operating systems, including GNU/Linux.
- 1 Invocation
- 2 Command line
- 3 Aliases
- 4 Tips and tricks
- 5 Troubleshooting
- 6 See also
Bash behaviour can be altered depending on how it is invoked. Some descriptions of different modes follow.
If Bash is spawned by
login in a TTY, by an SSH daemon, or similar means, it is considered a login shell. This mode can also be engaged using the
--login command line option.
Bash is considered an interactive shell when its standard input and error are connected to a terminal (for example, when run in a terminal emulator), and it is not started with the
-c option or non-option arguments (for example,
bash script). All interactive shells source
~/.bashrc, while interactive login shells also source
/bin/sh(which used to be the Bourne shell executable) is symlinked to
/bin/bash. If Bash is invoked with the name
sh, it tries to mimic the startup behavior of historical versions of
sh, including POSIX compability.
|File||Description||Login shells (see note)||Interactive, non-login shells|
||Sources application settings in
||After exit of a login shell.||Yes||No|
||Depends on the
- Login shells can be non-interactive when called with the
- While interactive, non-login shells do not source
~/.bash_profile, they still inherit the environment from their parent process (which may be a login shell). See GregsWiki:ProcessManagement#On processes, environments and inheritance for details.
Shell and environment variables
The behavior of Bash and programs run by it can be influenced by a number of environment variables. Environment variables are used to store useful values such as command search directories, or which browser to use. When a new shell or script is launched it inherits its parent's variables, thus starting with an internal set of shell variables.
These shell variables in Bash can be exported in order to become environment variables:
VARIABLE=content export VARIABLE
or with a shortcut
Environment variables are conventionally placed in
/etc/profile so that other Bourne-compatible shells can use them.
See Environment variables for more general information.
Bash command line is managed by the separate library called Readline. Readline provides emacs and vi styles of shortcuts for interacting with the command line, i.e. moving back and forth on the word basis, deleting words etc. It is also Readline's responsibility to manage history of input commands. Last, but not least, it allows you to create macros.
Tab completion is the option to auto-complete typed commands by pressing
Tab (enabled by default).
It may require up to three tab-presses to show all possible completions for a command. To reduce the needed number of tab-presses, see Readline#Faster completion.
Common programs and options
By default, Bash only tab-completes commands, filenames, and variables. The package
/usr/share/bash-completion/bash_completion. With , normal completions (such as
$ ls file.*<tab><tab>) will behave differently; however, they can be re-enabled with
$ compopt -o bashdefault program (see  and  for more detail).
completebuiltin may cause conflicts with .
By default Bash only tab-completes file names following a command. You can change it to complete command names using
complete -c man which
or complete command names and file names with
complete -cf sudo
See the Bash man page for more completion options.
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
or to affect all readline programs:
"\e[A": history-search-backward "\e[B": history-search-forward
HISTCONTROL variable can prevent certain commands from being logged to the history. For example, to stop logging of repeated identical commands
or set it to
erasedups to ensure that Bash's history will only contain one copy of each command (regardless of order). See the Bash man page for more options.
To disable the bash history only temporarily:
set +o history
The commands entered now are not logged to the
For example, now you can hash passwords with
printf secret | sha256sum, or hide GPG usage like
gpg -eaF secret-pubkey.asc
and your secret is not written to disk.
To enable history:
set -o history
ignorespace, commands starting with a space will not be saved into the history file. See for details.
To disable all bash history:
~/.bashrc or /etc/profile
... and just to make sure:
# warning. this will destroy your old histfile forever wipe -i -l2 -x4 -p4 "$HISTFILE" ln -sv /dev/null "$HISTFILE"
Mimic Zsh run-help ability
bind '"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"'
This assumes are you using the (default) Emacs editing mode.
alias is a command, which enables a replacement of a word with another string. It is often used for abbreviating a system command, or for adding default arguments to a regularly used command.
Personal aliases are preferably stored in
~/.bashrc, and system-wide aliases (which affect all users) belong in
/etc/bash.bashrc. See  for example aliases.
For functions, see Bash/Functions.
Tips and tricks
Command not found
pkgfile includes a "command not found" hook that will automatically search the official repositories, when entering an unrecognized command.
You need to source the hook to enable it, for example:
Then attempting to run an unavailable command will show the following info:
abiword may be found in the following packages: extra/abiword 3.0.1-2 /usr/bin/abiword
An alternative "command not found" hook is provided byAUR, which looks like this:
The command 'abiword' is provided by the following packages: abiword (2.8.6-7) from extra [ abiword ] abiword (2.8.6-7) from staging [ abiword ] abiword (2.8.6-7) from testing [ abiword ]
Disable Ctrl+z in terminal
You can disable the
Ctrl+z feature (pauses/closes your application) by wrapping your command like this:
#!/bin/bash trap "" 20 adom
Now when you accidentally press
Ctrl+z in AUR instead of
Shift+z nothing will happen because
Ctrl+z will be ignored.
Clear the screen after logging out
To clear the screen after logging out on a virtual terminal:
Auto "cd" when entering just a path
Bash can automatically prepend
cd when entering just a path in the shell. For example:
bash: /etc: Is a directory
But after adding one line into
... shopt -s autocd ...
[user@host ~]$ /etc cd /etc [user@host etc]$
allows navigating the file system by searching for strings in a database with the user's most-visited paths.
/etc/profile.d/autojump.bash must be sourced in order to start using the application.
Prevent overwrite of files
For the current session, to disallow existing regular files to be overwritten by redirection of shell output:
$ set -o noclobber
This is identical to
To make the changes persistent for your user:
... set -o noclobber
To manually overwrite a file while
noclobber is set:
$ echo "output" >| file.txt
Line wrap on window resize
When resizing a terminal emulator, Bash may not receive the resize signal. This will cause typed text to not wrap correctly and overlap the prompt. The
checkwinsize shell option checks the window size after each command and, if necessary, updates the values of
shopt -s checkwinsize
Shell exits even if ignoreeof set
If you have set the
ignoreeof option and you find that repeatedly hitting
ctrl-d causes the shell to exit, it is because this option only allows 10 consecutive invocations of this keybinding (or 10 consecutive EOF characters, to be precise), before exiting the shell.
To allow higher values, you have to use the IGNOREEOF variable.
- Wikipedia:Bash (Unix shell)
- Bash Reference Manual, or
- Readline Init File Syntax
- The Bourne-Again Shell - The third chapter of The Architecture of Open Source Applications
- Shellcheck - Check bash scripts for common errors (based on shellcheck)
- PS1 generator - generate your .bashrc/PS1 bash prompt with a drag and drop interface
- Even more useful .bashrc commands
- Greg's Wiki
- Bash Hackers Wiki
- Bash Hackers Wiki: List of Bash online tutorials
- Quote Tutorial