为什么这个命令不起作用:cd `echo -n "~"`

why this command does not work: cd `echo -n "~"`

运行命令

cd \`echo -n "~"\`

我收到以下错误:

bash: cd: ~: No such file or directory

如果 'cd ~' 工作正常,有什么问题?

如果您执行 cd ~,shell 会在执行命令之前将 ~ 扩展到您的主目录。但是,如果您使用双引号 ("~"),那么这将被视为文字字符串而不展开。

你可以看出区别:

$ echo ~
/home/username
$ echo "~"
~

为了让 ~ 被 shell 扩展,您需要删除双引号。

双引号的转义行为在Bash手册中有描述:http://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html

问题是 bash 在命令替换后没有进行额外的扩展。因此,虽然 cd ~ 以您想要的方式展开,但 cd $(echo '~') 却没有。

有一个名为 eval 的关键字是为这种情况创建的——它强制再次扩展命令行 (evaluated)。如果您在该行使用 eval,它会强制将 ~ 扩展到用户目录,即使正常的扩展时间已经过去。 (因为 ~ 直到 echo 命令 运行 才存在,到那个时候,再展开就来不及了。)

eval cd `echo -n "~"`

如果你只是做 cd "~":

,你也会遇到同样的问题
$ cd "~"
bash: cd: ~: No such file or directory

cd不明白~是特殊的。它试图找到一个名为 ~.

的目录,但失败了。

cd ~ 起作用的原因是 bash 在 运行 之前编辑命令。 bashcd ~ 替换为 cd $HOME,然后扩展 $HOME 得到 cd /home/YourUsername.

因此,

cd `echo -n "~"`

变成

cd "~"