busybox/shell
Denys Vlasenko 4ace385809 ash: expand: Fix skipping of command substitution when trimming in evalvar
Upstream commit:

    Date: Mon, 28 May 2018 17:09:48 +0800
    expand: Fix skipping of command substitution when trimming in evalvar

    When we are trimming an unset variable in evalvar, any embedded
    command substitution that should have been skipped are not.  This
    can cause them to be evaluated later should there be other command
    substitutions in the same input word.

    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2020-02-16 19:22:32 +01:00
..
ash_test ash: [BUILTIN] Exit without arguments in a trap should use status outside traps 2020-02-16 19:14:45 +01:00
hush_test hush: restore redirected stdin 2019-11-01 14:16:07 +01:00
ash_doc.txt
ash_ptr_hack.c
ash.c ash: expand: Fix skipping of command substitution when trimming in evalvar 2020-02-16 19:22:32 +01:00
brace.txt
Config.src shell: implement optional "BASE#nnnn" numeric literals 2019-05-19 17:23:31 +02:00
cttyhack.c config: update size information 2018-12-28 03:20:17 +01:00
hush_doc.txt
hush_leaktool.sh
hush.c ash,hush: allow builtins to be tab-completed, closes 7532 2020-01-29 15:23:17 +01:00
Kbuild.src
match.c
match.h
math.c shell: better comments in BASE#nn code 2019-10-22 14:25:43 +02:00
math.h shell: move all definitions of strto_arith_t() together 2019-05-26 14:02:10 +02:00
random.c
random.h
README
README.job
shell_common.c shell/ulimit: code shrink 2019-10-21 16:47:09 +02:00
shell_common.h hush: fix "export PS1=xyz" and "local PS1=xyz" messing up prompt 2019-05-14 18:56:04 +02:00

http://www.opengroup.org/onlinepubs/9699919799/
Open Group Base Specifications Issue 7


http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html
Shell & Utilities

It says that any of the standard utilities may be implemented
as a regular shell built-in. It gives a list of utilities which
are usually implemented that way (and some of them can only
be implemented as built-ins, like "alias"):

alias
bg
cd
command
false
fc
fg
getopts
jobs
kill
newgrp
pwd
read
true
umask
unalias
wait


http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
Shell Command Language

It says that shell must implement special built-ins. Special built-ins
differ from regular ones by the fact that variable assignments
done on special builtin are *PRESERVED*. That is,

VAR=VAL special_builtin; echo $VAR

should print VAL.

(Another distinction is that an error in special built-in should
abort the shell, but this is not such a critical difference,
and moreover, at least bash's "set" does not follow this rule,
which is even codified in autoconf configure logic now...)

List of special builtins:

. file
: [argument...]
break [n]
continue [n]
eval [argument...]
exec [command [argument...]]
exit [n]
export name[=word]...
export -p
readonly name[=word]...
readonly -p
return [n]
set [-abCefhmnuvx] [-o option] [argument...]
set [+abCefhmnuvx] [+o option] [argument...]
set -- [argument...]
set -o
set +o
shift [n]
times
trap n [condition...]
trap [action condition...]
unset [-fv] name...

In practice, no one uses this obscure feature - none of these builtins
gives any special reasons to play such dirty tricks.

However. This section also says that *function invocation* should act
similar to special built-in. That is, variable assignments
done on function invocation should be preserved after function invocation.

This is significant: it is not unthinkable to want to run a function
with some variables set to special values. But because of the above,
it does not work: variable will "leak" out of the function.