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)


Reply via email to