[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: strange expansion of <(cat p.main.{optional,extra})

From: Stephane Chazelas
Subject: Re: strange expansion of <(cat p.main.{optional,extra})
Date: Wed, 18 Apr 2007 08:05:34 +0100
User-agent: Mutt/1.5.6i

On Tue, Apr 17, 2007 at 08:16:53PM -0400, Chet Ramey wrote:
> > The expansion of echo <(cat /etc/{passwd,motd}) is rather surprising:
> > $  echo <(cat p.main.{optional,extra})
> > ++ cat p.main.optional
> > cat: p.main.optional: No such file or directory
> > ++ cat p.main.extra
> > cat: p.main.extra: No such file or directory
> > + echo /dev/fd/63 /dev/fd/62
> > /dev/fd/63 /dev/fd/62
> > 
> > I would have expected to be expanded to <(cat /etc/passwd /etc/motd) first.
> That's not how it works.  Brace expansion is the first expansion performed.
> The manual page says:
> "Brace expansion is performed before any other expansions, and any char-
> acters special to other expansions are preserved in the result.  It  is
> strictly  textual.  Bash does not apply any syntactic interpretation to
> the context of the expansion or the text between the braces."

How does it get exanded to

echo <(cat p.main.optional) <(cat p.main,extra)


If it were textual, I would expect:

echo <(cat p.main.optional) p.main,extra)

And what about:

echo $(cat p.main.{optional,extra})

This resolves to

echo $(cat p.main.optional p.main.extra)

I can't see any reason why $(...) and <(...) should be treated

bash-3.1$ echo <(echo {a,b})
++ echo a
++ echo b
+ echo /dev/fd/63 /dev/fd/62
/dev/fd/63 /dev/fd/62
bash-3.1$ echo $(echo {a,b})
++ echo a b
+ echo a b
a b

All the other shells treat them the same in that regards.

Any expansion inside command or process subsitution should
be defered to the subshell I think. 

% echo <(echo {a,b})
+zsh:1> echo a b
+zsh:1> echo /proc/self/fd/11
% echo $(echo {a,b})
+zsh:1> echo a b
+zsh:2> echo a b
a b


reply via email to

[Prev in Thread] Current Thread [Next in Thread]