Message ID | 20240406000902.3082301-3-gitster@pobox.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | local VAR="VAL" | expand |
On Friday, April 5, 2024 8:09 PM, Junio C Hamano wrote: >Dash bug https://bugs.launchpad.net/ubuntu/+source/dash/+bug/139097 >lets the shell erroneously perform field splitting on the expansion of a command >substitution during declaration of a local or an extern variable. > >The explanation was stolen from ebee5580 (parallel-checkout: avoid dash local bug >in tests, 2021-06-06). > >Signed-off-by: Junio C Hamano <gitster@pobox.com> >--- > Documentation/CodingGuidelines | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > >diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines >index 0a39205c48..1cb77a871b 100644 >--- a/Documentation/CodingGuidelines >+++ b/Documentation/CodingGuidelines >@@ -194,6 +194,20 @@ For shell scripts specifically (not exhaustive): > have changed since then. We'd need to re-evaluate this rule, > together with the rule in t/check-non-portable-shell.pl script. > >+ - Some versions of dash have broken variable assignment when prefixed >+ with "local", "export", and "readonly", in that the value to be >+ assigned goes through field splitting at $IFS unless quoted. >+ >+ DO NOT write: >+ >+ local variable=$value ;# wrong >+ local variable=$(command args) ;# wrong >+ >+ and instead write: >+ >+ local variable="$value" >+ local variable="$(command args)" >+ > - Use octal escape sequences (e.g. "\302\242"), not hexadecimal (e.g. > "\xc2\xa2") in printf format strings, since hexadecimal escape > sequences are not portable. I can confirm, at least for the set of platforms I work on, that printf with hex values is definitely not portable. --Randall
<rsbecker@nexbridge.com> writes: >> - Use octal escape sequences (e.g. "\302\242"), not hexadecimal (e.g. >> "\xc2\xa2") in printf format strings, since hexadecimal escape >> sequences are not portable. > > I can confirm, at least for the set of platforms I work on, that printf with > hex values is definitely not portable. Sure, that is why we have that rule that we see in the context.
On Fri, Apr 5, 2024 at 8:09 PM Junio C Hamano <gitster@pobox.com> wrote: > Dash bug https://bugs.launchpad.net/ubuntu/+source/dash/+bug/139097 > lets the shell erroneously perform field splitting on the expansion > of a command substitution during declaration of a local or an extern > variable. > > The explanation was stolen from ebee5580 (parallel-checkout: avoid > dash local bug in tests, 2021-06-06). > > Signed-off-by: Junio C Hamano <gitster@pobox.com> > --- > diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines > @@ -194,6 +194,20 @@ For shell scripts specifically (not exhaustive): > + - Some versions of dash have broken variable assignment when prefixed > + with "local", "export", and "readonly", in that the value to be > + assigned goes through field splitting at $IFS unless quoted. > + > + DO NOT write: > + > + local variable=$value ;# wrong > + local variable=$(command args) ;# wrong > + > + and instead write: > + > + local variable="$value" > + local variable="$(command args)" > + Every other example in the shell-script section of this document is written like this: (incorrect) local variable=$value local variable=$(command args) (correct) local variable="$value" local variable="$(command args)" Should this patch follow suit for consistency?
Eric Sunshine <sunshine@sunshineco.com> writes: > Every other example in the shell-script section of this document is > written like this: > > (incorrect) > local variable=$value > local variable=$(command args) > > (correct) > local variable="$value" > local variable="$(command args)" > > Should this patch follow suit for consistency? Sure. That sounds like a good idea.
diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines index 0a39205c48..1cb77a871b 100644 --- a/Documentation/CodingGuidelines +++ b/Documentation/CodingGuidelines @@ -194,6 +194,20 @@ For shell scripts specifically (not exhaustive): have changed since then. We'd need to re-evaluate this rule, together with the rule in t/check-non-portable-shell.pl script. + - Some versions of dash have broken variable assignment when prefixed + with "local", "export", and "readonly", in that the value to be + assigned goes through field splitting at $IFS unless quoted. + + DO NOT write: + + local variable=$value ;# wrong + local variable=$(command args) ;# wrong + + and instead write: + + local variable="$value" + local variable="$(command args)" + - Use octal escape sequences (e.g. "\302\242"), not hexadecimal (e.g. "\xc2\xa2") in printf format strings, since hexadecimal escape sequences are not portable.
Dash bug https://bugs.launchpad.net/ubuntu/+source/dash/+bug/139097 lets the shell erroneously perform field splitting on the expansion of a command substitution during declaration of a local or an extern variable. The explanation was stolen from ebee5580 (parallel-checkout: avoid dash local bug in tests, 2021-06-06). Signed-off-by: Junio C Hamano <gitster@pobox.com> --- Documentation/CodingGuidelines | 14 ++++++++++++++ 1 file changed, 14 insertions(+)