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