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

sem*_*ude 5 linux bash shell sh

我想弄明白,oneliner怎么样

var=value command
Run Code Online (Sandbox Code Playgroud)

实际上是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"
.
Run Code Online (Sandbox Code Playgroud)

目前,它按预期工作.但是当我们去sh并重新输入相同的输入时,它会是这样的:

#sh
$ var=
$ var=value echo something
. something
$ echo "$var"
.

$ var=value set something
$ echo "$var"
. value
Run Code Online (Sandbox Code Playgroud)

最后一个不同.setsh 是命令某种特殊情况吗?为什么变量var已保存在我们当前的环境中?

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

che*_*ner 6

set 是一个"特殊"内置,在POSIX规范中定义.

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

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

$ bash --posix
$ var=value set something
$ echo $var
value
Run Code Online (Sandbox Code Playgroud)