Bash
Related articles
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.
Invocation
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 -l
/--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 /etc/bash.bashrc
and ~/.bashrc
, while interactive login shells also source /etc/profile
and ~/.bash_profile
.
Configuration files
See 6.2 Bash Startup Files and DotFiles for a complete description.
File | Description | Login shells (see note) | Interactive, non-login shells |
---|---|---|---|
/etc/profile
|
Sources application settings in /etc/profile.d/*.sh and /etc/bash.bashrc .
|
Yes | No |
~/.bash_profile
|
Per-user, after /etc/profile . If this file does not exist, ~/.bash_login and ~/.profile are checked in that order. The skeleton file /etc/skel/.bash_profile also sources ~/.bashrc .
|
Yes | No |
~/.bash_logout
|
After exit of a login shell. | Yes | No |
/etc/bash.bashrc
|
Depends on the -DSYS_BASHRC="/etc/bash.bashrc" compilation flag. Sources /usr/share/bash-completion/bash_completion .
|
No | Yes |
~/.bashrc
|
Per-user, after /etc/bash.bashrc .
|
No | Yes |
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[1].
These shell variables in Bash can be exported in order to become environment variables:
VARIABLE=content export VARIABLE
or with a shortcut
export VARIABLE=content
Environment variables are conventionally placed in ~/.profile
or /etc/profile
so that all bourne-compatible shells can use them.
See Environment variables for more general information.
Command line
Bash command line is managed by the separate library called Readline. Readline provides a lot 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
Tab completion is the option to auto-complete partial typed commands by pressing Tab
twice (enabled by default).
Single-tab ability
For single press Tab
results for when a partial or no completion is possible:
~/.inputrc
set show-all-if-ambiguous on
Alternatively, for results when no completion is possible:
~/.inputrc
set show-all-if-unmodified on
Additional programs and options
Bash has native support for tab completion of: commands, filenames, and variables. This functionality can be extended with the package bash-completion; it extends its functionality by adding a subset of tab completions to popular commands and their options. With bash-completion know that normal completions (such as $ ls file.*<tab><tab>
) will behave different; however, they can be re-enabled with $ compopt -o bashdefault <prog>
(see [2] and [3] for more detail). Also for older systems bash-completion may not be resourcefully convenient.
Additional programs and options manually
For basic completion use lines in the form of complete -cf your_command
(these will conflict with the bash-completion settings):
~/.bashrc
complete -cf sudo complete -cf man
History completion
History completion bound to arrow keys (down, up) (see: Readline#History and Readline Init File Syntax):
~/.bashrc
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
or:
~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Fast word movement with Ctrl
Xterm supports moving between words withCtrl+Left
and Ctrl+Right
by default. To achieve this effect with other terminal emulators, find the correct terminal codes, and bind them to backward-word
and forward-word
in ~/.inputrc
. The codes can be made visible by first issuing the cat command.
For example, for urxvt:
~/.inputrc
"\eOd": backward-word "\eOc": forward-word
Mimic Zsh run-help ability
Zsh can invoke the manual for the written command pushing Alt+h
.
A similar behaviour is obtained in Bash by appending this line in your inputrc
file:
/etc/inputrc
"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"
Aliases
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 [4] and Pacman tips#Shortcuts for example aliases.
For functions, see Bash/Functions.
Tips and tricks
Prompt customization
See Bash/Prompt customization.
Command-not-found (AUR)
pkgfile includes a "command not found" hook that will automatically search the official repositories, when entering an unrecognized command. An alternative "command not found" hook is provided by command-not-foundAUR. Usage example:
$ abiword
The command 'abiword' is been 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 ]
To load it automatically:
~/.bashrc or ~/.zshrc
[ -r /etc/profile.d/cnf.sh ] && . /etc/profile.d/cnf.sh
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 adomAUR 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:
~/.bash_logout
clear reset
Auto "cd" when entering just a path
Bash can automatically prepend cd
when entering just a path in the shell. For example:
$ /etc
bash: /etc: Is a directory
But after adding one line into .bashrc
file:
~/.bashrc
... shopt -s autocd ...
You get:
[user@host ~]$ /etc cd /etc [user@host etc]$
Autojump
autojump allows navigating the file system by searching for strings in a database with the user's most-visited paths.
After installation, /etc/profile.d/autojump.bash
must be sourced in order to start using the application.
Troubleshooting
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 LINES
and COLUMNS
.
~/.bashrc
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.
For example:
export IGNOREEOF=100
See also
- Bash Reference
- Bash manual page
- 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
Tutorials
- BashGuide on Greg's Wiki
- BashFAQ on Greg's Wiki
- Bash Hackers Wiki
- Advanced Bash Scripting Guide
- Quote Tutorial