为什么我不能 cd 到带引号的波浪号 ('~')?

B.T*_*ner 36 command-line bash

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

cd ~
cd bin
cd ~/bin
cd 'bin'
Run Code Online (Sandbox Code Playgroud)

但不是

cd '~'
cd '~/bin'
Run Code Online (Sandbox Code Playgroud)

我需要cd在目录名称之一中使用空格的目录路径,所以我需要引号(它是Program Fileswine下的Windows )。我可以用两个cd命令来解决它,但为什么不能~用引号引起来呢?

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

bash: cd: ~: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Byt*_*der 81

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

周围的任何类型的引用都~可以防止这种波浪号扩展。


要回答关于如何仍然可以将它用于cd名称中带有空格的目录的问题,有一些替代方法:

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

    cd ~/foo/spaces\ are\ cool/bar
    
    Run Code Online (Sandbox Code Playgroud)
  • 引用路径的其余部分,但在波浪号和第一个斜杠周围省略它们:

    cd ~/"foo/spaces are cool/bar"
    
    Run Code Online (Sandbox Code Playgroud)

    如您所见,您可以在 Bash 中连接带引号和不带引号的字符串,只需将它们彼此相邻书写,中间没有任何空格。

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

    cd "$HOME/foo/spaces are cool/bar"
    
    Run Code Online (Sandbox Code Playgroud)

  • @KodosJohnson 查看 Bash 联机帮助页中关于“波浪号扩展”的部分。下面的甜点回答中也引用了相关段落。TL;DR:如果单词中的第一个字符是未加引号的波浪号,则会发生波浪号扩展,那么该波浪号和下一个未加引号的斜杠之间的所有内容都被视为“波浪号前缀”。如果此前缀不是有效的东西,例如 +、-、数字或用户名(其中也不允许使用引号),则扩展失败并且您会得到一个字面量 ~ 字符。 (7认同)
  • @rexkogitans `~'/...'` 不起作用,也不是这个答案。`~/'...'` 或 `~/"..."` 将起作用。 (4认同)
  • @hvd 只是有点好奇,为什么`~'/...'` 不起作用?斜杠不是特殊字符,因此它似乎应该在引号内或引号外工作。 (2认同)

kar*_*rel 17

~ 是一个特殊字符,shell 将其解释为登录用户的主目录。'~' 被 shell 解释为文字 ~ 字符,而不是登录用户的主目录,因为将字符串括在两个单引号字符内会导致该字符串被解释为文字文本字符串。


des*_*ert 16

这是一项bash称为波浪号扩展的功能。引用man bash

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

为了使扩展工作,波浪号字符~需要不加引号,否则cd如果~当前目录中不存在命名的目录,则字符会按字面意思使用并且失败。见这entensive答案中引用的解释bash。如果您需要引用部分路径,则可以:

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

    ~/dir' 'with' 'spaces/
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    ~/'dir with spaces/'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 至少引用需要用双引号引用的字符,例如

    ~/dir" "with" "spaces/
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    ~/"dir with spaces/"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 只引用需要用反斜杠引用的字符,例如

    ~/dir\ with\ spaces/
    
    Run Code Online (Sandbox Code Playgroud)

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

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