Bash不会扩展参数--home_dir=~
中的〜字符。例如:
$ echo --home_dir=~
--home_dir=~
当我省略连字符时,重击确实会展开:
$ echo home_dir=~
home_dir=/home/reedwm
为什么Bash有这种行为?这很烦人,因为当我将该路径指定为命令的参数时,带有〜的路径不会扩展。
答案 0 :(得分:3)
bash
在某种程度上错误地将home_dir=~
视为分配。因此,~
有资格进行扩展:
检查每个变量赋值是否紧跟在:或第一个=之后的无引号的波浪号前缀。在这些情况下,代字号扩展为 也执行了。
由于--home_dir
不是有效的标识符,因此该字符串不是被误认为是赋值。
可以说,您发现了bash
中的错误。 (我可以说是因为如果您使用set -k
,那么home_dir=~
是的赋值,即使它是在命令名之后而不是之前)。
但是,如果有疑问,请引用一个字符串,该字符串应按字面意义进行处理,无论其是否经过任何类型的Shell处理。
echo '--home_dir=~'
更新:据维护者说,这是有意为make
之类的命令允许类似赋值的参数来利用波浪号扩展的优点。 (还有export
之类的命令,由于某种原因,我之所以特别,因为它们是内置命令,但必须在必须知道实际命令之前进行波浪号扩展。)
答案 1 :(得分:2)
好吧,这是因为在echo --home_dir=~
中,'~'
不是开头,并且echo
的输出不被视为变量赋值。具体来说, man bash “波浪扩展”在以下情况下提供扩展
~
)开头;或:
或第一个=
之后立即检查变量赋值以查找未加引号的波浪号前缀。您的情况也没有资格。
答案 2 :(得分:2)
像chepner所说,根据文档,即使在echo home_dir=~
中也不应扩展它。但是由于某种原因,它的确可以将它扩展为任何看起来像是赋值的单词,并且至少可以追溯到3.2版。
大多数情况下,除了在波浪号的开头确实没有扩展波浪号以外,其他的外壳程序也不会扩展波浪号,因此,取决于波浪号可能不是一个好主意。
如果要扩展"$HOME"
,请使用"~"
;如果要扩展原义的波浪号,请使用$ echo "~" --foo="$HOME"
~ --foo=/home/itvirta
。例如
{{1}}
(更复杂的情况很难手动完成,但大多数情况下,这是运行用户自己想要的主目录。)