work in progress…
Nearly everything in Bash grammar can be broken down to a "simple command". The only thing Bash has to expand, evaluate and execute is the simple command.
This step happens after the initial command line splitting.
The expansion of a simple command is done in four steps (interpreting the simple command from left to right):
WORD=WORD
=
in each variable assignment undergoes tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal before being assigned to the variable.If no command name results after expansion:
> FILE
without any command will be performed: the FILE
will be created!Otherwise, if a command name results:
The behavior regarding the variable assignment errors can be tested:
This one exits the script completely
#!/bin/sh # This shell runs in POSIX mode! echo PRE # The following is an assignment error, since there is no digit '9' # for a base eight number! foo=$((8#9)) echo POST
This one terminates only the enclosing compound command (the { …; }
):
#!/bin/bash # This shell runs in native Bash-mode! echo PRE # The following is an assignment error! # The "echo TEST" won't be executed, since the { ...; } is terminated { foo=$((8#9)); echo TEST; } echo POST
If a parsed simple command contains no slashes, the shell attempts to locate and execute it:
PATH
As of Bash Version 4, when a command search fails, the shell executes a shell function named command_not_found_handle()
using the failed command as arguments. This can be used to provide user friendly messages or install software packages etc. Since this function runs in a separate execution environment, you can't really influence the main shell with it (changing directory, setting variables).
to be continued