假设我有一个名为Foo
的文件夹位于/home/user/
(我的/home/user
也由~
代表)。
我想要一个变量
a="~/Foo"
然后再做
cd $a
我明白了
-bash: cd: ~/Foo: No such file or directory
但是如果我只是做cd ~/Foo
它就可以了。关于如何使其发挥作用的任何线索?
答案 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#")