Tilde扩展在Bash中不起作用

问题描述:

假设我有一个名为Foo的文件夹位于/home/user/(我的/home/user也被代表为~)。Tilde扩展在Bash中不起作用

我想有一个变量

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" 
+0

谢谢! eval的cd工作。我的确想保持“〜/ Foo”完好无损,所以这个解决方案很有效。起初,我试图 CD'EVAL $了' 但没有工作。 – Benjamin 2011-04-21 18:38:53

+1

反对使用'eval'的通常警告也应在此处标出。 **不要**对未经过消毒的数据或以安全方式自行构建的数据运行'eval'。 – tripleee 2014-11-19 23:27:05

+0

不幸的是,如果目录名称包含空格,这将不起作用。 'a =“〜/ dir with spaces”; eval cd“$ a”'=>'-bash:cd:/ Users/jack/dir:没有这样的文件或目录':-( – duthen 2017-08-17 12:45:02

您可以使用$HOME代替代字号(代字号由外壳扩展为$HOME的内容)。 例子:

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

如果你的名字不是“John F.”,引用的好处是什么,为什么?分号? – 2011-04-21 18:48:40

+0

谢谢你提到代字号实际上扩展到$ HOME,在我看来,它更可读。 – DusteD 2017-11-29 08:04:20

如果使用双引号〜将保持在$一个该字符。

CD $一个不会扩大,因为〜变量值不被外壳扩展。

解决的办法是:

EVAL “CD美元的”

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

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

或如果你必须使用sed,

cd $(echo $somedir | sed "s#^~#$HOME#") 
+0

不幸的是,如果你试图引用其他人的主目录,这将不起作用。'somedir =“〜jack/TMP”; cd $ {somedir /#\〜/ $ HOME}'=> '-bash:cd:/ Users/jackjack/TMP:没有这样的文件或目录“:-( – duthen 2017-08-17 12:48:47