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
取消设置既罕见又不可取。 )
进一步阅读: