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

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

我觉得我脑子很乱。我希望

env foo=bar echo $foo

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

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

foo=bar echo $foo

答案1

类似问题已回答最近:在该行中定义符号之前,先在该行中评估符号,因此有必要将符号的定义和使用分开以分隔行。

在评论的提示下,您可以这样做:

foo=bar bash -c 'echo $foo'

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

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

跟进自@mikeserv评论:

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

    shell 应以行的形式从文件中读取输入,在交互式 shell 中从终端读取输入,在 sh -c 或 system() 中从字符串中读取输入。

  • 最后,它说

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

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

相关内容