POSIX:2001 states that "Variable assignments specified with special built-in utilities remain in effect after the built-in completes".
Not only this is tricky because it depends on whether a utility is a special built-in or not, but the bash interpreter does not respect that behaviour of the POSIX standard. That is, special built-ins are not so "special" to the bash interpreter.
This leaves two things to take into account when assigning to a variable when executing a command: whether the command is a special built-in, and whether bash is interpreting the script.
Now, the list of special built-ins is rather short and it would be a bit unusual to perform variable assignments when calling them, except for some cases: "exec", "eval", "." (dot), and ":" (colon).
It is important to note that ":" and "true" differ in this regard; the former is a special built-in, the latter is just a utility. Watch out for this kind of differences when using ":" or "true" to nullify a command. E.g.
Compare
$ dash -c ' method=sed # some condition or user setting ends up making: method=true # later: foo=bar $method echo foo: $foo' foo:To (redacted for brevity):
$ dash -c ' method=: foo=bar $method echo foo: $foo' foo: bar
No comments:
Post a Comment