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

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

这不起作用:

$ 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

但这确实:

$ 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

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

答案1

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

~可以使用作为你的主目录的路径在以下情况下波浪号扩展执行。~不像.或者..。您的文件系统中实际上并没有任何条目~可以作为您的主目录的备用名称。

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

因此~在此命令中没有扩展,但引用了以下内容:

ls "~/.wine/drive_c/tools/Family Tree v2.0"

幸运的是,允许写一个论点,其中有些部分被引用,有些部分没有被引用。因此,你可以~/在引号前面加上引号,而仍然引用其余部分:

ls ~/".wine/drive_c/tools/Family Tree v2.0"

或者,由于即使在双引号中也会执行参数扩展(但在单引号中不会执行),因此您可以使用:

ls "$HOME/.wine/drive_c/tools/Family Tree v2.0"

(从技术上讲,这是不同的,即使HOME环境变量未设置,某些 shell 仍会尝试找出你的主目录并扩展~到它 - 并且bash就是这样一个 shell。但取消设置的情况很少见且不可取HOME。)


进一步阅读:

相关内容