在这种情况下,为什么波浪号不被识别为主文件夹?

Gig*_*igi 21 command-line bash paths home-directory

这不起作用:

$ ls "~/.wine/drive_c/tools/Family Tree v2.0"
ls: cannot access '~/.wine/drive_c/tools/Family Tree v2.0': No such file or directory
Run Code Online (Sandbox Code Playgroud)

但这确实:

$ ls "/home/daniel/.wine/drive_c/tools/Family Tree v2.0"
Dossiers                           Dossiers_orig   Infos.opt      Racines.exe  'Register OCX.bat'   racines.CNT
Dossiers-2019.11.03-11.46.tar.gz   Html            REGSVR32.exe   Racines.hlp   Uninst.isu          readme.txt
Run Code Online (Sandbox Code Playgroud)

鉴于这~应该与 相同/home/daniel,这里发生了什么?

Eli*_*gan 53

即使使用双引号,引用也会抑制波浪号扩展。

~可以用来作为你的主目录的路径,其中在上下文中波浪线扩展执行。~不喜欢...。您的文件系统中实际上没有任何条目~可用作主目录的备用名称。

~单独出现或作为路径的第一个组成部分出现时,您的 shell 会将其扩展为您的主目录的绝对路径。但是~引用时不会发生这种情况。双引号提供了比单引号更弱的引用形式,这对于某些其他类型的扩展很重要,例如参数扩展(即扩展)。但即使是双引号也会抑制波浪号扩展。$HOME

因此~在这个命令中没有扩展,它被引用:

ls "~/.wine/drive_c/tools/Family Tree v2.0"
Run Code Online (Sandbox Code Playgroud)

幸运的是,允许编写一个参数,其中一些部分被引用,一些部分不被引用。所以你可以把~/引号放在引号之前,仍然引用其余的:

ls ~/".wine/drive_c/tools/Family Tree v2.0"
Run Code Online (Sandbox Code Playgroud)

或者,由于参数扩展甚至在双引号中执行 - 但不是在单引号中 - 您可以使用:

ls "$HOME/.wine/drive_c/tools/Family Tree v2.0"
Run Code Online (Sandbox Code Playgroud)

(从技术上讲,这是不同的,因为即使HOME未设置环境变量,某些 shell 仍会尝试确定您的主目录是什么并将其扩展~到它——并且bash是这样的一个 shell。但HOME取消设置既罕见又不可取。 )


进一步阅读:

  • @rexkogitans:术语:在像 C 这样的语言中,它是“字符串连接”,其中字符串文本 * 必须* 被引用。但这是壳;从形式上讲,这只是引用删除规则的结果。从来没有单独的字符串可以连接。删除成对的 `''` 和 `""` 引号只是在分词和所有 (?) 扩展之后发生,包括波浪号。 (3认同)
  • “幸运的是,允许写一个论点,其中一些部分被引用,一些部分不被引用。” 甚至允许任意混合——这称为*字符串连接*,例如`~/'.wine'"/driv"'e_c/'tools'Family Tree v2.0'`。只是 `~/` 需要不加引号。 (2认同)