路径中的Tilde不会扩展到主目录

时间:2011-04-21 18:25:02

标签: bash syntax tilde-expansion

假设我有一个名为Foo的文件夹位于/home/user/(我的/home/user也由~代表)。

我想要一个变量

a="~/Foo"然后再做

cd $a

我明白了 -bash: cd: ~/Foo: No such file or directory

但是如果我只是做cd ~/Foo它就可以了。关于如何使其发挥作用的任何线索?

5 个答案:

答案 0 :(得分:26)

你可以这样做(在变量赋值期间没有引号):

a=~/Foo
cd "$a"

但在这种情况下,变量$a不会存储~/Foo,而是展开格式/home/user/Foo。或者您可以使用eval

a="~/Foo"
eval cd "$a"

答案 1 :(得分:12)

您可以使用$HOME代替波浪号(波形符号由shell扩展为$HOME的内容)。 例如:

dir="$HOME/Foo";
cd "$dir";

答案 2 :(得分:1)

虽然这个问题只是在寻求解决方法,但这被列为许多询问为什么会发生这种情况的问题的重复,所以我认为值得给出解释。根据{{​​3}}:

<块引用>

单词扩展顺序如下:

应从头到尾执行波浪号扩展、参数扩展、命令替换和算术扩展。

当 shell 评估字符串 cd $a 时,它首先执行波浪号扩展(这是一个无操作,因为 $a 不包含波浪号),然后将 $a 扩展为字符串 ~/Foo,这是最终作为参数传递给 cd 的字符串。

答案 3 :(得分:0)

如果使用双引号,〜将保留为$ a中的该字符。

cd $ a不会扩展〜,因为shell不会扩展变量值。

解决方案是:

eval“cd $ a”

答案 4 :(得分:0)

更强大的解决方案是使用像sed甚至更好的东西,bash参数扩展:

somedir="~/Foo/test~/ing";
cd ${somedir/#\~/$HOME}

或者如果你必须使用sed,

cd $(echo $somedir | sed "s#^~#$HOME#")
相关问题