acd7984f96
Before considering to execute a command substitution in the same process, check if any of the expansions may have a side effect; if so, execute it in a new process just like happens if it is not a single simple command. Although the check happens at run time, it is a static check that does not depend on current state. It is triggered by: - expanding $! (which may cause the job to be remembered) - ${var=value} default value assignment - assignment operators in arithmetic - parameter substitutions in arithmetic except ${#param}, $$, $# and $? - command substitutions in arithmetic This means that $((v+1)) does not prevent optimized command substitution, whereas $(($v+1)) does, because $v might expand to something containing assignment operators. Scripts should not depend on these exact details for correctness. It is also imaginable to have the shell fork if and when a side effect is encountered or to create a new temporary namespace for variables. Due to the $! change, the construct $(jobs $!) no longer works. The value of $! should be stored in a variable outside command substitution first. |
||
---|---|---|
.. | ||
cat | ||
chflags | ||
chio | ||
chmod | ||
cp | ||
csh | ||
date | ||
dd | ||
df | ||
domainname | ||
echo | ||
ed | ||
expr | ||
getfacl | ||
hostname | ||
kenv | ||
kill | ||
ln | ||
ls | ||
mkdir | ||
mv | ||
pax | ||
pkill | ||
ps | ||
pwait | ||
pwd | ||
rcp | ||
realpath | ||
rm | ||
rmail | ||
rmdir | ||
setfacl | ||
sh | ||
sleep | ||
stty | ||
sync | ||
test | ||
uuidgen | ||
Makefile | ||
Makefile.inc |