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