2

Bash 没有扩展参数中的 ~ 字符--home_dir=~。例如:

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

Bash 确实会扩展 ~ 当我省略连字符时:

$ echo home_dir=~
home_dir=/home/reedwm

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

4

3 回答 3

3

bash有点错误地将home_dir=~其视为作业。因此,~有资格进行扩展:

每个变量赋值都会检查紧跟在 : 或第一个 = 之后的未加引号的波浪号前缀。在这些情况下,也执行波浪号扩展。

由于--home_dir不是有效标识符,因此该字符串不会被误认为是赋值。

可以说,您已经发现了bash. (我可以说,因为如果你使用set -k, thenhome_dir=~ 一个赋值,即使它在命令名之后,而不是之前。)


但是,如果有疑问,请引用一个字面意思的字符串,无论它是否经过任何类型的 shell 处理。

echo '--home_dir=~'

更新:根据维护者的说法,这是有意为命令提供类似赋值的参数,例如make利用波浪号扩展。(以及类似的命令export,出于某种原因,我认为它们是特殊的,因为它们是内置的,但是必须先发生波浪号扩展,然后才能知道实际的命令。)

于 2018-08-06T18:47:55.027 回答
2

就像 chepner 在他们的回答中所说的那样,根据文档,即使在echo home_dir=~. 但由于某种原因,它确实将它扩展为任何看起来像赋值的词,并且至少早在 3.2 中就已经这样做了。

大多数其他 shell 也不会扩展波浪号,除非它确实位于单词的开头,因此取决于它的工作可能不是一个好主意。

"$HOME"如果您希望它扩展,并且"~"如果您想要一个文字波浪号,请改用。例如

$ echo "~" --foo="$HOME"
~ --foo=/home/itvirta

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

于 2018-08-06T19:35:23.723 回答
2

好吧,那是因为 in不以单词开头,echo --home_dir=~并且输出 of不被视为变量赋值。具体来说,man bash "Tilde Expansion" 提供扩展,如果'~'echo

  • 如果单词以不带引号的波浪号字符 ( ~) 开头;或者
  • 变量赋值检查紧跟在 a:或第一个=.

你的情况也不符合条件。

于 2018-08-06T18:47:41.657 回答