busybox/shell/ash_test/ash-misc
Denys Vlasenko 9abf53beb4 ash: eval: Variable assignments on functions are no longer persistent
Upstream commit:

    Date: Wed, 4 Apr 2018 17:54:01 +0800
    eval: Variable assignments on functions are no longer persistent

    Dirk Fieldhouse <fieldhouse@gmx.net> wrote:
    > In POSIX.1-2017 ("simultaneously IEEE Std 1003.1™-2017 and The Open
    > Group Technical Standard Base Specifications, Issue 7")
    > <http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09>,
    > we read under '2.9.1 Simple Commands'
    >
    > "Variable assignments shall be performed as follows:
    > ...
    > -    If the command name is a standard utility implemented as a function
    > (see XBD Utility), the effect of variable assignments shall be as if the
    > utility was not implemented as a function.
    > ...
    > -    If the command name is a function that is not a standard utility
    > implemented as a function, variable assignments shall affect the current
    > execution environment during the execution of the function. It is
    > unspecified:
    >
    >     *   Whether or not the variable assignments persist after the
    > completion of the function
    >
    >     *   Whether or not the variables gain the export attribute during
    > the execution of the function
    >
    >     *   Whether or not export attributes gained as a result of the
    > variable assignments persist after the completion of the function (if
    > variable assignments persist after the completion of the function)"

    POSIX used to require the current dash behaviour.  However, you're
    right that this is no longer the case.

    This patch will remove the persistence of the variable assignment.

    I have considered the exporting the variables during the function
    execution but have decided against it because:

    1) It makes the code bigger.
    2) dash has never done this in the past.
    3) You cannot use this portably anyway.

    Reported-by: Dirk Fieldhouse <fieldhouse@gmx.net>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

function                                             old     new   delta
evalcommand                                         1606    1635     +29
evalcase                                             313     317      +4
evalfun                                              280     268     -12
pushlocalvars                                         48       -     -48
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/1 up/down: 33/-60)            Total: -27 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2018-08-05 11:14:11 +02:00
..
and-or.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
and-or.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
assignment1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
assignment1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
assignment2.right shell: some additions to *sh-misc/* tests 2017-07-24 18:51:40 +02:00
assignment2.tests shell: some additions to *sh-misc/* tests 2017-07-24 18:51:40 +02:00
assignment3.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
assignment3.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
assignment4.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
assignment4.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
assignment5.right hush: fix "set -e; false || x=1; echo OK" 2018-04-03 11:21:13 +02:00
assignment5.tests hush: fix "set -e; false || x=1; echo OK" 2018-04-03 11:21:13 +02:00
break1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break2.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break2.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break3.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break3.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break4.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break4.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break5.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
break5.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
builtin1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
builtin1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
case1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
case1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
colon.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
colon.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
command2.right ash: add tests for failures of the exec and command builtins 2015-10-30 22:19:06 +01:00
command2.tests ash: add tests for failures of the exec and command builtins 2015-10-30 22:19:06 +01:00
command.right ash: respect -p flag when command builtin is run with -v/-V 2015-10-29 20:05:32 +01:00
command.tests ash: respect -p flag when command builtin is run with -v/-V 2015-10-29 20:05:32 +01:00
compound.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
compound.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
continue1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
continue1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
continue2.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
continue2.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
continue3.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
continue3.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
control_char1.right hush: fix raw ^C handlisg in single-quoted strings 2018-01-13 19:14:27 +01:00
control_char1.tests hush: fix raw ^C handlisg in single-quoted strings 2018-01-13 19:14:27 +01:00
control_char2.right hush: fix handling of ^C in eval 2018-01-11 13:17:30 +01:00
control_char2.tests hush: fix handling of ^C in eval 2018-01-11 13:17:30 +01:00
echo_write_error.right
echo_write_error.tests
empty_args.right shell: some additions to *sh-misc/* tests 2017-07-24 18:51:40 +02:00
empty_args.tests shell: some additions to *sh-misc/* tests 2017-07-24 18:51:40 +02:00
empty_for1.right hush: fix another case where empty "for" wasn't setting exitcode to 0 2018-07-28 12:42:08 +02:00
empty_for1.tests hush: fix another case where empty "for" wasn't setting exitcode to 0 2018-07-28 12:42:08 +02:00
empty_for2.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
empty_for2.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
empty_for.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
empty_for.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
env_and_func.right ash: eval: Variable assignments on functions are no longer persistent 2018-08-05 11:14:11 +02:00
env_and_func.tests ash: eval: Variable assignments on functions are no longer persistent 2018-08-05 11:14:11 +02:00
errexit1.right ash: exit after subshell error when errexit option is set 2016-09-17 23:28:23 +02:00
errexit1.tests ash: exit after subshell error when errexit option is set 2016-09-17 23:28:23 +02:00
eval1.right ash: [EVAL] Make eval with empty arguments return 0 2016-09-29 00:30:31 +02:00
eval1.tests ash: [EVAL] Make eval with empty arguments return 0 2016-09-29 00:30:31 +02:00
eval2.right hush: fix 'eval ""' handling 2016-09-29 01:44:17 +02:00
eval2.tests hush: fix 'eval ""' handling 2016-09-29 01:44:17 +02:00
exec.right ash: add tests for failures of the exec and command builtins 2015-10-30 22:19:06 +01:00
exec.tests ash: add tests for failures of the exec and command builtins 2015-10-30 22:19:06 +01:00
exit1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
exit1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
exitcode1.right ash: eval: Return status in eval functions 2016-09-28 19:41:57 +02:00
exitcode1.tests ash: eval: Return status in eval functions 2016-09-28 19:41:57 +02:00
exitcode2.right ash: fix error code regression 2017-01-03 11:18:23 +01:00
exitcode2.tests ash: fix error code regression 2017-01-03 11:18:23 +01:00
exitcode_EACCES.right ash testsuite: fix false positives 2016-10-07 04:07:05 +02:00
exitcode_EACCES.tests sh testsuite: add tests for exitcode on failure to exec 2016-10-03 00:55:34 +02:00
exitcode_ENOENT.right ash testsuite: fix false positives 2016-10-07 04:07:05 +02:00
exitcode_ENOENT.tests sh testsuite: add tests for exitcode on failure to exec 2016-10-03 00:55:34 +02:00
for_with_bslashes.right hush: fix raw ^C handlisg in single-quoted strings 2018-01-13 19:14:27 +01:00
for_with_bslashes.tests hush: fix raw ^C handlisg in single-quoted strings 2018-01-13 19:14:27 +01:00
for_with_keywords.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
for_with_keywords.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
for.right ash: allow newline after variable name in for loop 2015-10-29 19:30:55 +01:00
for.tests ash: allow newline after variable name in for loop 2015-10-29 19:30:55 +01:00
func1.right ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func1.tests ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func2.right ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func2.tests ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func3.right ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func3.tests ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func4.right ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func4.tests ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func5.right hush: support "f() (cmd)" functions 2018-04-03 14:56:52 +02:00
func5.tests hush: support "f() (cmd)" functions 2018-04-03 14:56:52 +02:00
func_args1.right ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func_args1.tests hush-misc/func_args1.tests: remove "UNFIXED BUG", it does not fail 2015-11-04 14:50:19 +01:00
func_bash1.right ash: add support for bash 'function' keyword 2015-11-04 19:30:24 +01:00
func_bash1.tests ash: add support for bash 'function' keyword 2015-11-04 19:30:24 +01:00
func_compound1.right hush: support "f() (cmd)" functions 2018-04-03 14:56:52 +02:00
func_compound1.tests hush: support "f() (cmd)" functions 2018-04-03 14:56:52 +02:00
func_local1.right ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func_local1.tests ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func_local2.right ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func_local2.tests ash: copy function tests from hush testsuite 2015-11-04 14:48:16 +01:00
func_prio_over_builtins.right hush: functions have priority over builtins (!) 2017-07-31 05:27:09 +02:00
func_prio_over_builtins.tests hush: functions have priority over builtins (!) 2017-07-31 05:27:09 +02:00
func_return1.right hush: fix "true | func_with_return" not allowing return. 2017-07-31 18:02:28 +02:00
func_return1.tests hush: fix "true | func_with_return" not allowing return. 2017-07-31 18:02:28 +02:00
func_return2.right hush: fix "true | func_with_return" not allowing return. 2017-07-31 18:02:28 +02:00
func_return2.tests hush: fix "true | func_with_return" not allowing return. 2017-07-31 18:02:28 +02:00
group_in_braces.right hush: allow { cmd } to not be terminated by semicolon in some cases 2016-11-04 18:46:14 +01:00
group_in_braces.tests hush: allow { cmd } to not be terminated by semicolon in some cases 2016-11-04 18:46:14 +01:00
if_false_exitcode.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
if_false_exitcode.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
last_amp.right
last_amp.tests
local1.right
local1.tests
local2.right ash: only allow local variables in functions 2015-10-29 20:33:44 +01:00
local2.tests ash: only allow local variables in functions 2015-10-29 20:33:44 +01:00
nommu1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
nommu1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
nommu2.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
nommu2.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
nommu3.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
nommu3.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
nulltick1.right
nulltick1.tests
opts1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
opts1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
pid.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
pid.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
pipefail.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
pipefail.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
read.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
read.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
return1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
return1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
shift1.right
shift1.tests hush: Print error messages on shift -1 2017-07-06 20:12:44 +02:00
shift.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
shift.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
source1.right
source1.tests
source2.right
source2.tests
source3.right hush: fix ". EMPTY_LINE" not setting $? to 0 2016-09-29 01:27:09 +02:00
source3.tests hush: fix ". EMPTY_LINE" not setting $? to 0 2016-09-29 01:27:09 +02:00
source5.right sh testsuite: sync ash-misc/source* and hush-misc/source* 2016-10-02 18:23:14 +02:00
source5.tests sh testsuite: sync ash-misc/source* and hush-misc/source* 2016-10-02 18:23:14 +02:00
source_argv_and_shift.right hush: fix a bug in argv restoration after sourcing a file 2017-01-09 08:13:21 +01:00
source_argv_and_shift.tests hush: fix a bug in argv restoration after sourcing a file 2017-01-09 08:13:21 +01:00
tickquote1.right
tickquote1.tests hush: add tickquote1.tests from ash testsuite 2017-07-06 18:31:47 +02:00
unicode1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
unicode1.tests Spelling fixes in comments, documentation, tests and examples 2017-04-17 16:13:32 +02:00
until1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
until1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
wait4.right hush: rework "wait %jobspec" to work in non-interactive shells too 2016-11-08 00:59:29 +01:00
wait4.tests hush: rework "wait %jobspec" to work in non-interactive shells too 2016-11-08 00:59:29 +01:00
wait5.right hush: rework "wait %jobspec" to work in non-interactive shells too 2016-11-08 00:59:29 +01:00
wait5.tests hush: rework "wait %jobspec" to work in non-interactive shells too 2016-11-08 00:59:29 +01:00
wait6.right hush: fix "(sleep 1; exit 3) & sleep 2; echo $?; wait $!; echo $?" 2017-07-07 22:56:02 +02:00
wait6.tests hush: fix "(sleep 1; exit 3) & sleep 2; echo $?; wait $!; echo $?" 2017-07-07 22:56:02 +02:00
while1.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
while1.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
while2.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
while2.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
while4.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
while4.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
while_in_subshell.right ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00
while_in_subshell.tests ash testsuite: add most of hust tests which pass for ash 2016-10-03 00:06:55 +02:00