假设我有一个名为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
代替波浪(波浪被shell扩展为$HOME
的内容)。例子:
dir="$HOME/Foo";
cd "$dir";
虽然这个问题只是要求一个解决方案,但它被列为许多问题的重复,这些问题都在问为什么会发生这种情况,所以我认为值得给出一个解释。根据https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06:
展开词的顺序如下:
依次执行波浪展开、参数展开、命令替换和算术展开。
当shell计算字符串cd $a
时,它首先执行波浪展开(这是一个无操作,因为$a
不包含波浪),然后将$a
展开为字符串~/Foo
,这是最后作为参数传递给cd
的字符串。
一个更健壮的解决方案是使用类似sed或更好的bash参数扩展:
somedir="~/Foo/test~/ing";
cd "${somedir/#~/$HOME}"
或者如果必须使用sed,
cd $(echo "$somedir" | sed "s#^~#$HOME#")
如果使用双引号,~将作为$a中的字符保留。
cd $a将不会展开~,因为shell不会展开变量值。
解决方案是:
eval