Thank you for explaining this fine point.
I have found a way to use double expansion, and of course this is not safe
in all contexts:
from=1;to=3;eval echo {$from..$to}
Regards,
Will
William Entriken
+1 267-738-4201
On Wed, Feb 28, 2018 at 10:03 AM, Chet Ramey wrote:
> On 2/28/18 3:25 AM, William Entriken wrote:
> > This behavior is different in zsh and bash, and maybe bash behavior is a
> > bug.
> >
> > # Test case
> >
> > touch 1 2 3
> > cat > script.sh < > from=1
> > to=3
> > ls {$from..$to}
> > EOL
> > chmod a+x script.sh
> >
> > bash ./script.sh
> >
> > zsh ./script.sh
> >
> > # Expected
> >
> > Both list files 1, 2, 3
> >
> > # Actual
> >
> > zsh passes.
> >
> > Bash fails the chained substitution with:
> >
> > ls: {1..3}: No such file or directory
>
> This is how bash works, how it's always worked, and how it's documented to
> work:
>
> "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."
>
> So you have {$from..$to}, which is not a valid sequence expression because
> $from and $to are not integers. Invalid brace expansions are left
> unchanged. When the word undergoes parameter expansion, you get {1..3}.
>
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
> ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/
>