On 02/14/2015 12:03 PM, Les Mikesell wrote: > On Sat, Feb 14, 2015 at 11:36 AM, J Martin Rushton > <martinrushton56 at btinternet.com> wrote: >> <snip> >>> To understand it completely you need to know the order of >>> operations as the shell makes multiple passes over the line, >>> parsing, processing metacharacters, and expanding variables. And >>> I don't know where to find a concise description of that any more. >> >> man bash, about 900 lines down under "EXPANSION". > > But it is not 'just' expansions. You need to know the full order of > operations with all the steps - word splitting, quote removal, i/o > redirection, groupings, etc., some of which is repeated over the line > after some of the other steps happen. I think I saw this in an > understandable form for the bourne shell back in the 1980's but can't > remember it well enough to describe and all the bash docs I've seen > are way too convoluted to just see the order of operations as a simple > set of steps - that you need to know before any of the rest will make > sense. It's the 4 paragraphs at the start of the "EXPANSION" section: Expansion is performed on the command line after it has been split into words. There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion. The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion. On systems that can support it, there is an additional expansion avail- able: process substitution. Only brace expansion, word splitting, and pathname expansion can change the number of words of the expansion; other expansions expand a single word to a single word. The only exceptions to this are the expansions of "$@" and "${name[@]}" as explained above (see PARAMETERS). -- Bob Nichols "NOSPAM" is really part of my email address. Do NOT delete it.