2010-09-27 113 views
3

根据Bash手册3.7.1节的规定,命令行开头的变量赋值应该对被调用的程序可见。Cygwin Bash中的命令行变量赋值不工作?

例如

DIR=/tmp ls $DIR 

应该表现得好像我输入了“ls/tmp” - 并且变量DIR在执行命令后不应该保留。 Cygwin Bash(GNU bash,版本3.2.51(24)-release(i686-pc-cygwin))似乎没有这样做 - 上述命令的行为就像没有定义$ DIR一样。这可以通过其他测试例如“DIR =/tmp echo $ DIR”,“DIR =/tmp set”等来确认。

请注意,添加分号工作(“DIR =/tmp; ls $ DIR”),但保留命令后定义的变量。

为什么这不像预期的那样工作?

回答

3

它确实有效 - 但不是在您尝试使其工作的环境中。

DIR=/tmp ls $DIR 

环境变量DIR设置为ls - 但是当外壳扩展命令的$ DIR没有设置。这是Bourne shell的行为方式;它的继任者如Korn shell和Bash的表现就是这样。

您可以看到,DIR是通过将ls $DIR更改为env来设置的;这将显示外部(非内置)命令的环境。

在这个例子中,想了一会儿:你已经输入为9个多余的字符则为:

ls /tmp 

如果你必须有它设置和删除,那么该做的伎俩:

(DIR=/tmp; ls $DIR) 

该变量在shell评估ls $DIR之前设置,但整个命令运行在子shell中,因此它对调用shell没有影响。

+0

啊,这就是为什么在给xargs一个大bash命令时需要分号。 – mkb 2010-09-27 14:39:28

+0

当然,我已经输入了9个额外的字符 - 来创建示例。 – Jeremy 2010-09-27 14:43:20

+0

但是你是正确的 - 变量将在命令行的其余部分被扩展后设置。 – Jeremy 2010-09-27 14:44:48