23

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

我想要一个变量

a="~/Foo"然后做

cd $a

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

但是,如果我这样做cd ~/Foo,效果很好。关于如何让它工作的任何线索?

4

5 回答 5

29

您可以这样做(在变量赋值期间不带引号):

a=~/Foo
cd "$a"

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

a="~/Foo"
eval cd "$a"
于 2011-04-21T18:34:58.687 回答
16

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

dir="$HOME/Foo";
cd "$dir";
于 2011-04-21T18:34:57.833 回答
1

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

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

或者如果你必须使用 sed,

cd $(echo "$somedir" | sed "s#^~#$HOME#")
于 2012-05-07T21:09:32.190 回答
1

虽然这个问题只是要求一种解决方法,但这被列为许多询问为什么会发生这种情况的问题的重复,所以我认为值得给出解释。根据https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06

扩词顺序如下:

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

When the shell evaluates the string cd $a, it first performs tilde expansion (which is a no-op, since $a does not contain a tilde), then it expands $a to the string ~/Foo, which is the string that is finally passed as the argument to cd.

于 2021-02-28T17:13:45.240 回答
-1

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

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

解决方案是:

评估“cd $a”

于 2011-04-21T19:17:20.873 回答