路径中的波浪号不会扩展到主目录



假设我有一个名为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

相关内容

  • 没有找到相关文章

最新更新