根据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”),但保留在命令后定义的变量。
为什么这不按预期工作?
答案 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没有影响。