Anatomy of the Command Line


Order matters when the shell executes a command, but isn't strictly left to right. Redirects, functions, sub-shells, {brace,tilde,parameter,variable,arithmetic} expansion, pipes, globbing, regular expressions, command substitution and more.

What order does bash evaluate the different parts of the command line and what effect does that ordering have on the command? Which portions of the command are evaluated by the shell and which aren't?

The presentation will use command line examples to illustrate evaluation order for the various parts of a command.

For example:

grep foo file.txt >file.txt

That command results in file.txt being empty regardless of what the previous contents were ( provided file permissions allow the user to write to file.txt ). The reason is that the shell truncates file.txt before even starting up grep, so grep is actually searching a newly truncated empty file.

echo -n $( echo foo >>file.txt ) >file.txt

Again there is an empty file at the end even though foo is added to the file.txt during the command. In this case, the command subtitution and it's associated output redirection runs and completes before the outer shell and it's redirection. As a result, file.txt gets a line of input, then is truncated.

Room 101
Sunday, January 24, 2016 - 16:30 to 17:30