假设我有一个名为的文件夹Foo
(/home/user/
我/home/user
也由 表示~
)。
我想要一个变量
a="~/Foo"
然后做
cd $a
我明白了
-bash: cd: ~/Foo: No such file or directory
但是,如果我这样做cd ~/Foo
,效果很好。关于如何让它工作的任何线索?
假设我有一个名为的文件夹Foo
(/home/user/
我/home/user
也由 表示~
)。
我想要一个变量
a="~/Foo"
然后做
cd $a
我明白了
-bash: cd: ~/Foo: No such file or directory
但是,如果我这样做cd ~/Foo
,效果很好。关于如何让它工作的任何线索?
您可以这样做(在变量赋值期间不带引号):
a=~/Foo
cd "$a"
但在这种情况下,变量$a
不会存储~/Foo
,而是扩展形式/home/user/Foo
。或者你可以使用eval
:
a="~/Foo"
eval cd "$a"
您可以使用$HOME
代替波浪号(波浪号由外壳扩展为 的内容$HOME
)。例子:
dir="$HOME/Foo";
cd "$dir";
一个更强大的解决方案是使用 sed 甚至更好的 bash 参数扩展:
somedir="~/Foo/test~/ing";
cd "${somedir/#\~/$HOME}"
或者如果你必须使用 sed,
cd $(echo "$somedir" | sed "s#^~#$HOME#")
虽然这个问题只是要求一种解决方法,但这被列为许多询问为什么会发生这种情况的问题的重复,所以我认为值得给出解释。根据https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06:
扩词顺序如下:
应从头到尾执行波浪号扩展、参数扩展、命令替换和算术扩展。
When the shell evaluates the string cd $a
, it first performs tilde expansion (which is a no-op, since $a
does not contain a tilde), then it expands $a
to the string ~/Foo
, which is the string that is finally passed as the argument to cd
.
如果使用双引号, ~ 将作为 $a 中的字符保留。
cd $a 不会扩展 ~ 因为 shell 不会扩展变量值。
解决方案是:
评估“cd $a”