Bash 没有扩展参数中的 ~ 字符--home_dir=~
。例如:
$ echo --home_dir=~
--home_dir=~
Bash 确实会扩展 ~ 当我省略连字符时:
$ echo home_dir=~
home_dir=/home/reedwm
为什么 Bash 有这种行为?这很烦人,因为当我将该路径指定为命令的参数时,没有扩展带有 ~ 的路径。
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
, thenhome_dir=~
是一个赋值,即使它在命令名之后,而不是之前。)
但是,如果有疑问,请引用一个字面意思的字符串,无论它是否经过任何类型的 shell 处理。
echo '--home_dir=~'
更新:根据维护者的说法,这是有意为命令提供类似赋值的参数,例如make
利用波浪号扩展。(以及类似的命令export
,出于某种原因,我认为它们是特殊的,因为它们是内置的,但是必须先发生波浪号扩展,然后才能知道实际的命令。)
就像 chepner 在他们的回答中所说的那样,根据文档,即使在echo home_dir=~
. 但由于某种原因,它确实将它扩展为任何看起来像赋值的词,并且至少早在 3.2 中就已经这样做了。
大多数其他 shell 也不会扩展波浪号,除非它确实位于单词的开头,因此取决于它的工作可能不是一个好主意。
"$HOME"
如果您希望它扩展,并且"~"
如果您想要一个文字波浪号,请改用。例如
$ echo "~" --foo="$HOME"
~ --foo=/home/itvirta
(更复杂的情况更难手动完成,但大多数时候需要的是运行用户自己的主目录。)
好吧,那是因为 in不以单词开头,echo --home_dir=~
并且输出 of不被视为变量赋值。具体来说,man bash "Tilde Expansion" 提供扩展,如果'~'
echo
~
) 开头;或者:
或第一个=
.你的情况也不符合条件。