我想弄明白,oneliner如何
var=value command
实际上是sh。我希望变量var
能够传递到command
的环境,但在当前环境中不应该存在(请不要在最后省略免责声明!)
首先,让我们在bash中尝试它
#bash
$ var= #just to be sure it's empty
$ var=value echo something
. something
$ echo "$var"
.
$ var=value set something
$ echo "$var"
.
目前,它按预期工作。但是,当我们去sh并重新输入相同的输入时,它就像那样:
#sh
$ var=
$ var=value echo something
. something
$ echo "$var"
.
$ var=value set something
$ echo "$var"
. value
最后一个不同。 set
是否为sh指定了某种特殊情况?为什么变量var
已保存在当前环境中?
免责声明:我知道echo
和set
是shell内置的,因此我们通过var=value command
传递的环境变量都被浪费了,但我的问题只是语法问题。我的意思是,他们应该已被浪费,但在sh中,当键入set
时,变量以某种方式传递到当前环境中。
答案 0 :(得分:6)
set
是一个“特殊”内置函数,在POSIX规范中定义。
如简单命令中所述,在内置完成后,调用特殊内置实用程序之前的变量赋值仍然有效;对于常规内置或其他实用程序,情况不应如此。
所以在这种情况下,bash
实际上违反了POSIX规范。但是,在POSIX模式下运行时,它的行为与sh
:
$ bash --posix
$ var=value set something
$ echo $var
value