jilles 74d9b02bb0 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.
2010-12-28 21:27:08 +00:00
..
2009-10-15 18:17:29 +00:00
2010-06-02 09:34:41 +00:00
2009-01-30 16:23:57 +00:00
2009-06-23 23:30:56 +00:00
2006-12-18 15:45:01 +00:00
2010-03-04 16:08:01 +00:00
2009-06-23 23:30:56 +00:00
2010-12-21 22:47:34 +00:00
2010-07-31 21:09:49 +00:00
2006-12-27 11:28:00 +00:00
2009-09-04 21:49:37 +00:00
2010-07-12 01:58:46 +00:00
2010-10-31 19:16:54 +00:00
2010-02-15 14:07:40 +00:00
2006-12-27 12:14:56 +00:00
2010-07-27 17:33:02 +00:00
2009-10-15 18:17:29 +00:00
2010-09-13 01:29:51 +00:00