[Top][All Lists]

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

[bug-diffutils] bug#24116: bug#24116: [platform-testers] new snapshot av

From: Eric Blake
Subject: [bug-diffutils] bug#24116: bug#24116: [platform-testers] new snapshot available: diffutils-3.3.50-0353
Date: Mon, 1 Aug 2016 09:27:58 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0

On 07/31/2016 06:36 PM, Jim Meyering wrote:

> dash's printf builtin handles \e differently -- that's easy to work
> around: use \033, which *is* portable.
> More surprising is that this generates no output:
>   dash -c 'f() { local t=$(printf '\''\t\t'\''); printf "$t"; }; f'

That's because you made the classic mistake of using local AND assigning
to the variable at the same time.

This works:

dash -c 'f() { local t; t=$(...); printf "$t"; }; f'

The difference? There is a notion of an assignment context:

Bash treats 'local' like 'export' in introducing an assignment context
(so "" around local t=$() is optional); but 'local' is not specified by
POSIX, so dash does NOT treat it as an assignment context.  Since local
is a command name, you MUST use "" in all subsequent words, or else
defer the actual assignments to standalone statements, to get assignment

> I.e., piping it into wc -c prints 0.
> With bash, it prints the expected pair of TAB bytes.
> I found that I could work around this nonsensical behavior by hoisting
> the "tab=..." definition up/out of those two functions, or by adding
> standard-says-never-necessary double quotes like this:
>   dash -c 'f() { local t="$(printf '\''\t\t'\'')"; printf "$t"; }; f'

Umm, the standard is silent.  local is not defined by the standard.

> However, I prefer not to work around it here (and in every other test
> script where this comes up), and will insulate all of our test scripts
> by rejecting any shell with that misbehavior, so plan to adjust
> init.sh to select another shell when it finds this flaw.

It's not a flaw in dash, but in your expectations.

Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

reply via email to

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