Bash Concepts
Internal
Metacharacters
Metacharacters are characters that have a special meaning to bash and are interpreted and possibly modified before the modified strings are sent to the command as arguments. Also see regular expressions metacharacters.
Space
For bash, a space is a metacharacter that separates a command from its arguments, and arguments from each other.
Single Quotes
Enclosing a string in single quotes tells the shell NOT to interpret other shell metacharacters in the text between quotes.
Double Quotes
Difference Between Single Quotes and Double Quotes
Dollar Sign ($)
Exclamation Mark (!)
Globbing
Bash cannot recognize regular expressions but it can do filename expansion. The process is also known as globbing. The process recognizes and expands wild cards. Globbing interprets the following characters (for more details on metacharacters, see Regular Expressions Concepts - Metacharacters:
The Wild Card (*)
The wild card (*) matches every name in a given directory. Strings containing * will not match filenames that start with a dot.
The Question Mark (?)
The question mark (?) serves as a single-character "wild card" for filename expansion.
The Character Class [...]
The character class matches just one of the characters listed among square brackets. One of those characters must exist in the file name, on the specified position, for the name to match.
Negation (^)
^ negates the sense of match for the above.
Login Shell
A login shell is a shell whose first character of its argument zero is a -, or it was started with the --login option.
Interactive Shell
An interactive shell is a shell started:
- without the -c option
- without non-option arguments
- with the -i option
The interactive shell's standard input and error are both connected to terminals.
$- includes i if the shell is interactive, allowing a script or a startup file to test this state.
Non-interactive Shell
A shell started with -c option.
bash Startup Files
When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first executes commands from /etc/profile, if exists.
Them it looks for ~/.bash_profile, ~/.bash_login and ~/.profile in that order. It executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.
When a login shell exits, bash executes commands from ~/.bash_logout, if it exists.
When an interactive shell that is not a login shell is started, bash executes commands from ~/.bashrc, if it exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to execute commands from the specified file instead of ~/.bashrc.
When bash is started in non-interactive mode, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file execute. Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file name.
If any of the files exist but cannot be read, bash reports an error.