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"
您可以使用$HOME
代替代字号(代字号由外壳扩展为$HOME
的内容)。 例子:
dir="$HOME/Foo";
cd "$dir";
如果你的名字不是“John F.”,引用的好处是什么,为什么?分号? – 2011-04-21 18:48:40
谢谢你提到代字号实际上扩展到$ 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#")
不幸的是,如果你试图引用其他人的主目录,这将不起作用。'somedir =“〜jack/TMP”; cd $ {somedir /#\〜/ $ HOME}'=> '-bash:cd:/ Users/jackjack/TMP:没有这样的文件或目录“:-( – duthen 2017-08-17 12:48:47
谢谢! eval的cd工作。我的确想保持“〜/ Foo”完好无损,所以这个解决方案很有效。起初,我试图 CD'EVAL $了' 但没有工作。 – Benjamin 2011-04-21 18:38:53
反对使用'eval'的通常警告也应在此处标出。 **不要**对未经过消毒的数据或以安全方式自行构建的数据运行'eval'。 – tripleee 2014-11-19 23:27:05
不幸的是,如果目录名称包含空格,这将不起作用。 'a =“〜/ dir with spaces”; eval cd“$ a”'=>'-bash:cd:/ Users/jack/dir:没有这样的文件或目录':-( – duthen 2017-08-17 12:45:02