`env foo = bar echo $ foo`不输出任何内容


8

我想我脑袋大了。我希望

env foo=bar echo $foo

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

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

foo=bar echo $foo

Answers:


8

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

在评论提示下,您可以执行以下操作:

foo=bar bash -c 'echo $foo'

它首先为环境分配一个值,foo然后将其作为环境变量传递到新进程中,以便在该进程中进行打印。

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

从随访@mikeserv评论:

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

    如果是交互式shell,则外壳程序应从文件,从终端读取行,而如果是sh -c或system(),则外壳程序应从字符串读取行输入。

  • 最后,它说

    分隔标记后,将根据Shell语法中的语法对其进行分类。

  • 但是POSIX并未明确指出在进行语法处理之前将整行标记化。
  • 在那种情况下,我们依靠现有的实践-外壳符合要求,因为没有任何东西与书面标准相抵触,但是该标准不能在所有情况下都可以用来预测行为。
  • 相同的注释当然适用于别名的行为(这就是为什么我将其称为类似的问题)。

或者,如果您env foo=bar bash -c 'echo $foo'
可以引用

实际上,别名问题取决于令牌识别部分的含义,即在继续语法之前,已针对给定的行计算了令牌。但是对于这两种情况,标准都不是明确的,因此您需要依靠现有的实践。
Thomas Dickey

@thomasdickey-是的,那也是我的要点。您知道,当您写评论时,如果您@username...comment指定用户,则会收到一则小消息,让他们知道您正在与他们交谈。好吧,如果线程相关,他们会的。
mikeserv

@mikeserv(像这样)。嗯-我会牢记这一点(尽管它与嵌入式毛坯的工作方式尚不明确)。
Thomas Dickey

像那样。切线,我看了一下luit.c,我觉得我可以只改变setup_io(){ ... ;fnctl(0, [GS]ETFL, 0);...}2的第一个参数。好吧,我想copyTermios()and setRawTermios()函数可能还需要进行一些修改,但是我认为它应该很简单。在rc = (return)每一个行似乎很奇怪-但我没有C程序员无论是。是你的东西还是那是继承的?如果您的空白评论是指"${set_null_var:=new val and $(echo other stuff)}"您几乎没有任何安全问题。有些炮弹会用奇怪的东西}
mikeserv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.