summaryrefslogtreecommitdiffstats
path: root/sys/modules/sk
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2010-12-28 21:27:08 +0000
committerjilles <jilles@FreeBSD.org>2010-12-28 21:27:08 +0000
commit74d9b02bb00830c58e7572986e81ef97d2948ed6 (patch)
tree938df618f5e6962d48e61103d210b5c6d2101fa1 /sys/modules/sk
parentd20b96d0f2ef605d9476d5c27ffe395c0e237253 (diff)
downloadFreeBSD-src-74d9b02bb00830c58e7572986e81ef97d2948ed6.zip
FreeBSD-src-74d9b02bb00830c58e7572986e81ef97d2948ed6.tar.gz
sh: Don't do optimized command substitution if expansions have side effects.
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.
Diffstat (limited to 'sys/modules/sk')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud