为什么我不能cd到引用的代字号(’〜’)?

写我的第一个脚本所以我确定这是一个基本问题,但有人可以向我解释为什么我可以:

cd ~ cd bin cd ~/bin cd 'bin' 

但不是

 cd '~' cd '~/bin' 

我需要cd到一个目录路径,其中一个目录名称中有一个空格,所以我需要引号(它是葡萄酒下的Windows Program Files )。 我可以用两个cd命令解决它,但为什么我不能把~引用?

如果我输入cd '~' (或cd "~" ),我得到:

 bash: cd: ~: No such file or directory 

正如@karel在他的回答中所指出的那样, ~是一个特殊字符,并由Bash扩展到当前用户的主目录中。 请参阅Bash的“Tilde Expansion”手册 ,或在手册页( man bash )中搜索标题“Tilde Expansion”。

~周围的任何报价都会阻止这种波浪扩展。


要回答有关如何使用它来进入名称中包含空格的目录的问题,可以使用以下几种方法:

  • 省略引号并使用反斜杠转义空格:

     cd ~/foo/spaces\ are\ cool/bar 
  • 引用路径的其余部分,但在代字号和第一个斜杠周围省略它们:

     cd ~/"foo/spaces are cool/bar" 

    如你所见,你可以在Bash中连接引用和不引用的字符串,只需将它们彼此相邻写入,两者之间没有任何空格。

  • 使用环境变量$HOME而不是波浪号,它仍在“双引号”(但不是“单引号”)内扩展:

     cd "$HOME/foo/spaces are cool/bar" 

〜是一个特殊字符,由shell解释为登录用户的主目录。 shell将’〜’解释为文字〜字符,而不是登录用户的主目录,因为在两个单引号字符中包含一个字符串会导致该字符串被解释为文字文本字符串。

这是一个名为Tilde Expansionbashfunction。 引用man bash

如果一个单词以不带引号的波浪号 (`〜’)开头,则第一个不带引号的斜杠之前的所有字符(或所有字符,如果没有未加引号的斜杠)都被认为是波浪号前缀。 如果没有引用tilde-prefix中的任何字符,则代字号后面的波浪号前缀中的字符将被视为可能的登录名。 如果此登录名是空字符串,则将波形符替换为shell参数HOME的值。 如果未设置HOME,则替换执行shell的用户的主目录。

为了使扩展工作,波形符~需要不加引号,否则如果当前目录中没有名为~目录,那么字符就是字面意思并且cd失败。 有关bash中引用的解释,请参阅此广泛的答案 。 如果您需要引用部分路径,则可以:

  1. 至少引用需要引用单引号的字符,例如

     ~/dir' 'with' 'spaces/ 

    要么

     ~/'dir with spaces/' 
  2. 至少引用需要引用双引号的字符,例如

     ~/dir" "with" "spaces/ 

    要么

     ~/"dir with spaces/" 
  3. 仅引用需要使用反斜杠引用的字符,例如

     ~/dir\ with\ spaces/ 

Tilde Expansion有一些更有趣的function,例如:

  • ~+扩展为PWD的值,即当前工作目录
  • ~-扩展为OLDPWD的值,即前一个工作目录
  • ~john扩展到与登录名“john”相关联的主目录

探索使用echo命令

探索bash中的工作原理的最简单方法是使用echo命令。 在~的情况下使用这个:

 $ echo ~ /home/rick $ echo '~' ~ $ echo "~" ~ $ echo `~` bash: /home/rick: Is a directory 

正如你所看到的,当你单引号或使用双引号时,它被解释为字符串而不是作为变量扩展。 当您使用反引号(`)时,它将作为命令执行并生成错误消息。