这不起作用:
$ 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
。)
进一步阅读: