Cygwin Bash中的命令行变量赋值不起作用?

时间:2010-09-27 14:25:37

标签: bash cygwin

根据Bash手册的3.7.1节,命令行开头的变量赋值对被调用程序应该是可见的。

e.g。

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”),但保留在命令后定义的变量。

为什么这不按预期工作?

1 个答案:

答案 0 :(得分:3)

它确实有效 - 但不是在你试图让它发挥作用的环境中。

DIR=/tmp ls $DIR

环境变量DIR设置为ls - 但是当shell扩展命令的$ DIR时不设置。这是Bourne shell的表现方式;它是其后继者如Korn shell和Bash表现的方式。

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

在这个例子中,请考虑一下:你输入的内容是9个额外的字符,而不是:

ls /tmp

如果你必须设置和删除它,那么这就可以了:

(DIR=/tmp; ls $DIR)

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