[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
backquote peculiarities (was: Re: Combination of "eval set -- ..." and $
From: |
astian |
Subject: |
backquote peculiarities (was: Re: Combination of "eval set -- ..." and $() command substitution is slow) |
Date: |
Mon, 15 Jul 2019 22:19:00 +0000 |
Robert Elz:
> Date: Wed, 10 Jul 2019 17:21:00 +0000
> From: astian <astian@e-nautia.com>
> Message-ID: <bcd08f6c-1c13-0eb4-92b2-4e904b19a0ce@e-nautia.com>
>
> I doubt it makes any difference to the timing, which I think
> Chet has already answered, but it is worth pointing out that these
> two commands ...
>
> printf '%s\n' "`printf %s "$i"`"
> printf '%s\n' "$(printf %s "$i")"
>
> which (I believe)) are supposed to be the same thing, using the
> different (ancient, and modern) forms of command substitution aren't
> actually the same. In the first $i is unquoted, in the second it is
> quoted. Here, since its value is just a number and IFS isn't being
> fiddled, there is not likely to be any effect, but if you really
> want to make those two the same, the first needs to be written as
>
> printf '%s\n' "`printf %s \"$i\"`"
>
> Such are the joys of `` command substitutions (just avoid them).
>
> kre
Dear Robert Elz, I'm aware of several of its peculiarities and I typically do
avoid them. However, is it true that $i is unquoted in the first case?
Consider:
i='foo bar'
set -x
printf '%s\n' "`printf '<%s>' "$i"`"
printf '%s\n' "`printf '<%s>' \"$i\"`"
printf '%s\n' "`printf '<%s>' $i`"
Which outputs:
++ printf '<%s>' 'foo bar'
+ printf '%s\n' '<foo bar>'
<foo bar>
++ printf '<%s>' 'foo bar'
+ printf '%s\n' '<foo bar>'
<foo bar>
++ printf '<%s>' foo bar
+ printf '%s\n' '<foo><bar>'
<foo><bar>
Cheers.