On Tue, 23 Feb 2010, Eric Blake wrote: > According to Allen Halsey on 2/23/2010 3:50 PM: > > Hi, > > > > I'm trying to understand bash's parsing model. > > > > I read in the manual that the shell "breaks the input into words and > > operators, > > obeying the quoting rules described in Quoting. These tokens are separated > > by > > metacharacters." > > Another good reference is POSIX: > http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_03 > > > Taking this simple example: > > > > [...@host ~] $ echo The date is $(date +'%Y-%m-%d') > > 2010-02-23 > > > > Breaking this into words, using the above rule, results in: > > > > ------- ------------- > > echo word > > <space> metacharacter > > The word > > <space> metacharacter > > date word > > <space> metacharacter > > is word > > <space> metacharacter > > So far, so good. But you missed that: > > $(date +'%Y-%m-%d') > > is an entire word (basically, an unquoted $ character consumes until the > end of the shell substitution, command substitution, or arithmetic > substitution, and that entire scan becomes part of the current word being > parsed). > > > This confuses me because, intuitively, I feel that the command substitution, > > $(date +'%Y-%m-%d'), should be treated as a single word. > > Yes, it is a single word.
But it is subject to wordsplitting: $ print "%s\n" $(date +'%Y %m %d') 2010 02 23 -- Chris F.A. Johnson <http://cfajohnson.com> =================================================================== Author: Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress) Pro Bash Programming: Scripting the GNU/Linux Shell (2009, Apress)