【问题标题】:One line setting environment variable and execute command, got different results in sh and bash一行设置环境变量并执行命令,在 sh 和 bash 中得到不同的结果
【发布时间】:2017-12-20 02:14:11
【问题描述】:

我想弄清楚,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 时,变量以某种方式传递到当前环境中。

【问题讨论】:

    标签: linux bash shell sh


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 优秀的答案。只是好奇:你能想到为什么这种特殊情况的行为是个好主意吗?通过var=value; set something 可以在没有特殊情况的情况下实现相同的结果。
    • 我不太确定为什么它们必须影响外壳。我只想指出,归类为特殊内置命令的命令必须是内置的,因为它们是影响 shell 的命令,而不仅仅是为了提高效率而可选地内置。因此,临时分配是没有意义的,因为永远不会运行单独的命令。
    猜你喜欢
    • 2018-06-18
    • 2019-01-08
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多