`env foo=bar echo $foo` 不打印任何内容

bad*_*adp 8 environment-variables

我想我有一个巨大的脑放屁。我希望

env foo=bar echo $foo
Run Code Online (Sandbox Code Playgroud)

...打印bar,但我得到一个空行。笏。

如果我使用 bash 语法,也会发生同样的情况:

foo=bar echo $foo
Run Code Online (Sandbox Code Playgroud)

Tho*_*key 8

最近回答了一个类似的问题:符号在该行中定义符号之前在行中进行评估,因此有必要将符号的定义和使用拆分为分隔行。

根据评论提示,您可以这样做:

foo=bar bash -c 'echo $foo'
Run Code Online (Sandbox Code Playgroud)

它首先分配一个值foo并将其作为可以打印的环境变量传递给新进程。

您可以在 POSIX Shell 命令语言令牌识别 中阅读有关它的更多信息。

跟进@mikeserv评论:

  • POSIX 不够明确,无法给出完整的答案。
  • 在引用部分的开头,它说

    shell 应该从文件中的行读取它的输入,在交互式 shell 的情况下从终端读取,或者在 sh -c 或 system() 的情况下从字符串读取它的输入。

  • 最后,它说

    一旦标记被定界,它就会根据 Shell Grammar 中的语法要求进行分类。

  • 但 POSIX 没有明确说明在处理语法之前整行都被标记。
  • 在这种情况下,我们依赖于现有的实践——shell 符合标准,因为没有任何内容与书面标准相矛盾,但该标准不能用于预测所有情况下的行为。
  • 当然,同样的评论也适用于别名的行为(这就是我将其称为类似问题的原因)。