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



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"波浪号扩展"提供扩展,如果

  • 如果单词以不带引号的波浪号字符开头(~);或
  • 检查变量赋值是否有紧跟在:或第一个=后面的不带引号的波浪号前缀。

您的情况也不符合条件。

相关内容

  • 没有找到相关文章

最新更新