[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Confused about how bash breaks input into words
From: |
Chris F.A. Johnson |
Subject: |
Re: Confused about how bash breaks input into words |
Date: |
Tue, 23 Feb 2010 19:11:07 -0500 (EST) |
User-agent: |
Alpine 2.00 (LMD 1167 2008-08-23) |
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:
> >
> > [me@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)