为什么这个命令不起作用: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
在 运行 之前编辑命令。 bash
将 cd ~
替换为 cd $HOME
,然后扩展 $HOME
得到 cd /home/YourUsername
.
因此,
cd `echo -n "~"`
变成
cd "~"
运行命令
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
在 运行 之前编辑命令。 bash
将 cd ~
替换为 cd $HOME
,然后扩展 $HOME
得到 cd /home/YourUsername
.
因此,
cd `echo -n "~"`
变成
cd "~"