Bash波浪号不会在某些参数中扩展,例如--home_dir =〜

时间:2018-08-06 18:37:38

标签: bash tilde-expansion

Bash不会扩展参数--home_dir=~中的〜字符。例如:

$ echo --home_dir=~
--home_dir=~

当我省略连字符时,重击确实会展开:

$ echo home_dir=~
home_dir=/home/reedwm

为什么Bash有这种行为?这很烦人,因为当我将该路径指定为命令的参数时,带有〜的路径不会扩展。

3 个答案:

答案 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}}

(更复杂的情况很难手动完成,但大多数情况下,这是运行用户自己想要的主目录。)