Bash Command Line Expansion

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

External

Internal

Overview

Process

Each line read by bash from command line is interpreted as a pipeline: a sequence of commands separated by the pipe character (|).

Command processing starts by checking the first word of the command against an alias list, and if a match is found, the alias is replaced.

Then the result is parsed into tokens by using metacharacters as separators.

Command Line Expansion

The token are scanned to perform command line expansion, which are the following operations, performed in order:

Brace Expansion

Brace expansion is the process of expanding a set of comma-separated strings specified inside the braces into a space-separated list of strings. Each string from the list is prepended with a preamble, and appended with the postscript. Both the preamble and the postscript are optional. The left-to-right order of the strings within the braces is preserved in the expansion. Brace expansion occurs only if at least one comma exists inside the braces. Brace expansions can be nested.

echo KA{BO,DO}OM
KABOOM KADOOM

"KA" is the preamble and "OM" is the postscript.

Brace expansion is turned on in interactive and noninteractive shells by default. It can be turned off with:

set +o braceexpand

Tilde Expansion

Parameter and Variable Expansion

Arithmetic Expansion

Command Substitution

Word Splitting

Pathname Expansion

Pathname expansion is also called filename generation or globbing, and it is the process of interpreting ambiguous file references and substituting the appropriate list of filenames.

If the pathname expansion is unsuccessful - does not produce any hit - the original expression, including the special pathname expansion characters, are passed to the command.

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.

Process Substitution

Quote Removal

After all command line expansion specified above are performed, bash proceeds with quote removal: it removes from the command line single quotation marks, double quotation marks and backslashes that are not a result of an expansion.