Bash 没有扩展参数--home_dir=~
中的 ~ 字符。例如:
$ echo --home_dir=~
--home_dir=~
Bash 确实会扩展 ~ 当我省略连字符时:
$ echo home_dir=~
home_dir=/home/reedwm
为什么 Bash 会有这种行为?这很烦人,因为当我将该路径指定为命令的参数时,带有 ~ 的路径不会展开。
bash
有点错误地将home_dir=~
视为作业。因此,~
符合扩展条件:
检查每个变量赋值是否紧跟在 : 或第一个 = 之后的不带引号的波浪号前缀。 在这些情况下,波浪号扩展 还表演了。
由于--home_dir
不是有效的标识符,因此该字符串不会被误认为是赋值。
可以说,您在bash
中发现了一个错误。(我说可以说,因为如果您使用set -k
,那么home_dir=~
是一个赋值,即使它是在命令名称之后而不是之前。
但是,如有疑问,请引用一个字符串,无论它是否经过任何类型的 shell 处理,都应从字面上处理。
echo '--home_dir=~'
更新:根据维护者的说法,这是有意为的,以允许像make
这样的命令进行类似赋值的参数,以利用波浪号扩展。(还有像export
这样的命令,出于某种原因,我认为这是特殊的,因为它们是内置的,但是波浪号扩展必须在实际命令必然知道之前发生。
就像切普纳在他们的回答中所说的那样,根据文档,即使在echo home_dir=~
中也不应该扩展它。但出于某种原因,它确实在任何看起来像赋值的单词中扩展了它,并且至少早在 3.2 中就这样做了。
大多数其他 shell 也不会扩展波浪号,除非它确实位于单词的开头,因此依靠它工作可能不是一个好主意。
如果您希望它扩展,请改用"$HOME"
,如果需要文字波浪号,请使用"~"
。 例如
$ echo "~" --foo="$HOME"
~ --foo=/home/itvirta
(更复杂的情况更难手动完成,但大多数情况下,它是正在运行的用户自己的主目录。
这是因为在echo --home_dir=~
中,'~'
不以单词开头,并且echo
的输出不被视为变量赋值。具体来说,man bash"波浪号扩展"提供扩展,如果
- 如果单词以不带引号的波浪号字符开头(
~
);或 - 检查变量赋值是否有紧跟在
:
或第一个=
后面的不带引号的波浪号前缀。
您的情况也不符合条件。