Assignment of variables with space after the (=) sign?
在Bash中,使用T=content为变量赋值,在等号之前或之后没有空格。
尽管我在shell脚本PWD= /bin/pwd中看到了以下内容,其中包含等号右侧的空格。
它有什么用途?
-
你运行脚本,看看PWD持有什么? 它将为空,您将在运行脚本时看到打印的当前工作目录?
-
是的,PWD变空了
在示例PWD= /bin/pwd中,在执行命令/bin/pwd之前将变量PWD设置为空字符串。更改仅对该行生效。
这对于在运行命令时临时更改变量非常有用,而不会影响原始值。另一个例子是当使用read时,设置不同的IFS:
1
| IFS=, read a b c <<<"comma,separated,list" |
这会将字段分隔符设置为逗号,以便正确读取a,b和c。在此行之后,IFS将返回默认值,因此脚本的其余部分不会受到影响。
也许在某些系统上,命令PWD的输出受变量PWD的值的影响,因此这样做可以防止由于PWD被其他地方覆盖而导致的问题。
-
也许这是针对除了bash兼容性之外的不同shell?这是作者的解释:# The following circumlocution (repeated below as well) ensures that we record the true directory name and not one that is faked up with symlink names.
-
是的,根据该评论,听起来有可能在某些情况下$PWD被赋予了不正确的值,并且如果设置了pwd将读取该值,而不是在其他一些shell上找出实际路径。
-
现在很清楚了,谢谢
-
PWD没有未设置。它显式设置为空字符串。它们是有区别的。例如,考虑${FOO-bar}和${FOO:-bar}之间的差异。
我们这里不是在谈论两件不同的事情。
如果我们有
我们将/bin/pwd分配给PWD。
但
意味着我们调用/bin/pwd并将PWD设置为空字符串。此分配仅影响子流程,而不影响当前流程。
此语法在PWD命令的持续时间内将空值分配给变量PWD。
这为脚本的其余部分指定了PWD。
这仅在PWD命令的持续时间内分配PWD; echo将回显PWD调用之前和之后生效的值。
这只是将空值赋给PWD。
病理上,
尝试使用参数=和ick运行命令PWD
-
对于它的价值,Bash的pwd命令报告当前目录,而不管pwd的值。
-
谢谢(你的)信息
-
顺便说一句,硬编码/bin/pwd通常不是必需的,并且可能是个坏主意。脚本应该信任用户拥有理智的PATH,并允许它们在某些情况下覆盖系统命令(测试脚本中的模拟命令会立即浮现在脑海中作为一种常见场景)。当然,在这里,您可能希望确保绕过任何shell内置命令pwd以支持外部二进制文件?但在一般情况下,我会劝阻这样做。