Mercurial > gnulib
changeset 18362:9e6dba568988
tests/init.sh: exclude dash with bad "local" semantics
* tests/init.sh (gl_shell_test_script_): Add a function to
eliminate a shell like "dash" (unlike bash, zsh) that has
surprising/risky "local var='...'" semantics. Inspired by
the problem and discussion in https://bugs.gnu.org/24116#11.
author | Jim Meyering <meyering@fb.com> |
---|---|
date | Mon, 01 Aug 2016 09:37:15 -0700 |
parents | 0b22bceeb8c2 |
children | 8114f51ad4eb |
files | ChangeLog tests/init.sh |
diffstat | 2 files changed, 16 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Mon Aug 08 06:52:16 2016 -0700 +++ b/ChangeLog Mon Aug 01 09:37:15 2016 -0700 @@ -1,3 +1,11 @@ +2016-08-06 Jim Meyering <meyering@fb.com> + + tests/init.sh: exclude dash with bad "local" semantics + * tests/init.sh (gl_shell_test_script_): Add a function to + eliminate a shell like "dash" (unlike bash, zsh) that has + surprising/risky "local var='...'" semantics. Inspired by + the problem and discussion in https://bugs.gnu.org/24116#11. + 2016-08-02 Ján Tomko <jtomko@redhat.com> maint.mk: expand the prohibit_doubled_word regex
--- a/tests/init.sh Mon Aug 08 06:52:16 2016 -0700 +++ b/tests/init.sh Mon Aug 01 09:37:15 2016 -0700 @@ -128,6 +128,13 @@ fi # We require $(...) support unconditionally. +# We require non-surprising "local" semantics (this eliminates dash). +# This takes the admittedly draconian step of eliminating dash, because the +# assignment tab=$(printf '\t') works fine, yet preceding it with "local " +# transforms it into an assignment that sets the variable to the empty string. +# That is too counter-intuitive, and can lead to subtle run-time malfunction. +# The example below is less subtle in that with dash, it evokes the run-time +# exception "dash: 1: local: 1: bad variable name". # We require a few additional shell features only when $EXEEXT is nonempty, # in order to support automatic $EXEEXT emulation: # - hyphen-containing alias names @@ -151,6 +158,7 @@ gl_shell_test_script_=' test $(echo y) = y || exit 1 f_local_() { local v=1; }; f_local_ || exit 1 +f_dash_local_fail_() { local t=$(printf " 1"); }; f_dash_local_fail_ score_=10 if test "$VERBOSE" = yes; then test -n "$( (exec 3>&1; set -x; P=1 true 2>&3) 2> /dev/null)" && score_=9