一行设置环境变量和执行命令,在sh和bash中得到不同的结果

时间:2017-12-20 02:14:11

标签: linux bash shell sh

我想弄明白,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已保存在当前环境中?

免责声明:我知道echoset是shell内置的,因此我们通过var=value command传递的环境变量都被浪费了,但我的问题只是语法问题。我的意思是,他们应该已被浪费,但在sh中,当键入set时,变量以某种方式传递到当前环境中。

1 个答案:

答案 0 :(得分:6)

set是一个“特殊”内置函数,在POSIX规范中定义。

  

如简单命令中所述,在内置完成后,调用特殊内置实用程序之前的变量赋值仍然有效;对于常规内置或其他实用程序,情况不应如此。

所以在这种情况下,bash实际上违反了POSIX规范。但是,在POSIX模式下运行时,它的行为与sh

相同
$ bash --posix
$ var=value set something
$ echo $var
value