Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end Bash (Bourne-again Shell) is a 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. Arch copiously uses Bash throughout its init-scripts.
- 1 Configuration
- 2 Command line
- 3 Aliases
- 4 Functions
- 5 Tips and tricks
- 6 Resources
Configuration file overview
- Template:Filename (Non-standard: only some distros, Arch included)
An overview of the commonly used configuration files:
This file is read and sourced by bash when an interactive login shell is started.
The file Template:Filename is read and sourced by bash when a non-login interactive shell is started, for example, when you open a virtual console from the desktop environment. This file is useful for setting up a user-specific shell environment.
Configuration file sourcing order
These files are sourced by bash in different circumstances.
- if interactive + login shell → Template:Filename then the first readable of Template:Filename, Template:Filename, and Template:Filename
- Bash will source Template:Filename upon exit.
- if interactive + non-login shell → Template:Filename then Template:Filename
- if login shell + legacy mode → Template:Filename then Template:Filename
But, in Arch, by default:
- Template:Filename (indirectly) sources Template:Filename
- Template:Filename which users are encouraged to copy to Template:Filename, sources Template:Filename
Examples of the user dotfiles can be found in Template:Filename.
Shell and environment variables
The behavior of bash and programs run by it can be influenced by a number of environment variable. Environment variables 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
See Environment Variables for more general information.
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.
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.
Another way to do this is to install unp package.
Tips and tricks
#PS1='[\u@\h \W]\$ '
Then add the following line:
PS1='\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\$ \[\e[m\]\[\e[0;32m\] '
It is useful to have the auto-complete feature (pressing Template:Keypress key twice on the keyboard) after you type some command like sudo.
To do this add a line in this format to your Template:Filename file:
complete -cf your_command
For example, to enable auto-complete after sudo and man:
complete -cf sudo complete -cf man
Despite Bash's native support for basic file name, command, and variable auto-completion, there are ways of improving and extending its reach.
The Template:Package Official package extends functionality by adding auto-completion to a wide range of commands and their options. Enabling advanced bash completion is quite simple, just install the following package:
# pacman -S bash-completion
Start a new shell and it will be automatically enabled thanks to Template:Filename.
set show-all-if-ambiguous on
it is no longer necessary to hit Template:Keypress (default binding) twice to produce a list of all possible completions (both when a partial completion is possible and when no completion is possible), as a single key-press will suffice. Alternatively, to produce such a list only when no completion is possible (i.e., not when a partial completion is possible), append the following command in lieu of the previous one:
set show-all-if-unmodified on
Disable Ctrl-Z in terminal
#!/bin/bash trap "" 20 /path_to_your_application/
#!/bin/bash trap "" 20 /usr/bin/adom
With this example script, when you accidentally press Template:Keypress+Template:Keypress instead of Template:Keypress+Template:Keypress or some other key combo while playing Adom(game) your game will not end. Nothing will happen because Template:Keypress+Template:Keypress will be ignored.
Clear the screen after logging out
To clear the screen after logging out on a virtual terminal, append the following lines to Template:Filename:
ASCII art, fortunes and cowsay
Along with a colors, system info and ASCII symbols, Bash can be made to display a piece of ASCII art on login. ASCII images can be found online and pasted into a text file, or generated from scratch. To set the image to display in a terminal on login, place the string
at the top of Template:Filename.
To have a random phrase displayed when logging into a terminal, just set
as the top line in Template:Filename.
command cowsay $(fortune)
command cowthink $(fortune)
The earth is like a tiny grain of sand, only much, much heavier. ----------------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
The ASCII images are generated by Template:Filename text files located in Template:Filename, and all themes can be listed with the command Template:Codeline These files can be edited to the user's liking; custom images can also be created from scratch or found on the net. The easiest way create a custom cow file from an image found online would be to open an existing Template:Filename file in a text editor, copy-and-paste the image from a browser and save the file as a different name. Test the custom file using
# cowsay -f Template:Filename $(fortune)
This can produce some nice eye candy, and the commands used can be more complex. For a specialized example, take a look here.
________________________________________ ( Fry: I must be a robot. Why else would ) ( human women refuse to date me? ) ---------------------------------------- o o o ,'``.._ ,'``. :,--._:)\,:,._,.: :`--,@@@:`...';\ `,'@@@@@@@`---'@@`. /@@@@@@@@@@@@@@@@@: /@@@@@@@@@@@@@@@@@@@\ ,'@@@@@@@@@@@@@@@@@@@@@:\.___,-. `...,---'``````-..._@@@@|:@@@@@@@\ ( )@@@;:@@@@)@@@\ _,-. `. (@@@//@@@@@@@@@@`'@@@@\ : `.//@@)@@@@@@)@@@@@,@; |`. _,'/@@@@@@@)@@@@)@,'@,' :`.`-..____..=:.-':@@@@@.@@@@@_,@@,' ,'\ ``--....-)=' `._,@@\ )@@@'``._ /@_@`. (@) /@@@@@) ; / \ \`-.' (@@@`-:`. `' ___..'@@_,-' |/ `.) `-. `.`.``-----``--,@@.' |/`.\`' ,','); ` (/ (/ (user@host)-(10:10 AM Wed Dec 22)--(~))--->
ASCII Historical Calendar
$ mkdir -p ~/.calendar $ curl -o calendar.rpm http://download.fedora.redhat.com/pub/epel/5/x86_64/calendar-1.25-4.el5.x86_64.rpm $ rpm2cpio calendar.rpm | bsdtar -C ~/.calendar --strip-components=4 -xf - ./usr/share/c*
This will then print out the calendar items
$ sed -n "/$(date +%m\\/%d\\\|%b\*\ %d)/p" $(find ~/.calendar /usr/share/calendar -maxdepth 1 -type f -name 'c*' 2>/dev/null);
- Advanced Bash Scripting Guide - Very good resource regarding shell scripting using bash
- Bash Reference Manual - Official reference (654K)
- Bash Scripting by Example
- Completion Guide
- Greg's Wiki - Highly recommended
- man page
- Quote Tutorial
- irc://irc.freenode.net#bash - Active and friendly Internet Relay Chat channel for Bash.