我们假设Mary
是一个目录。以下路径是~/Mary
相对路径吗?
答案1
不,这不是相对的。
这是一个完整路径,带有~
别名。
相对路径描述与当前目录位置相关的路径。但是,~/Mary
无论您当前位于哪个目录,都是完全相同的。
假设您当前登录的身份为鲍勃并且也在目录中/home/Bob
,然后../Mary
将是相对路径的示例/home/Mary
。如果您现在在,/etc/something
那么~/Mary
仍然会是,/home/Bob/Mary
但../Mary
现在会是/etc/Mary
。
请注意,Bash~
以特定方式进行处理,并且它并不总是转换为$HOME
.
如需进一步阅读,请参阅
答案2
如果这~/Mary
是给任何系统调用的路径(例如open()
,stat()
...),那么它是相对路径,它是与当前目录中的目录Mary
相关的条目。~
因此,如果您当前的目录是/tmp
,那么这就是该/tmp/~/Mary
文件。
但是,如果~/Mary
在支持波形符扩展的 shell(或其他工具)中不加引号地使用它,那么它将~
被替换为变量的内容$HOME
(如果已设置),并且$HOME
通常包含像 这样的绝对路径/home/me
,~/Mary
将被扩展为/home/me/Mary
,所以也是绝对路径。
如果您更改$HOME
为相对路径(但您不想这样做),那么~/Mary
shell 将扩展为相对路径:
$ HOME=..; echo ~/Mary
../Mary
如果您将其更改为//foo
(或者如果您的主目录/
曾经是 的常用目录root
),则 的扩展~/Mary
将不再是绝对路径名也不是相对路径名(至少按照 POSIX 定义)。
使用bash
4.0 之前的版本,您甚至可以做一些有趣的事情,例如:
$ HOME='*' bash-3.2.48 -c 'cd /; echo ~/mount'
bin/mount run/mount
(4.0 中已修复)
更多信息:Unix&Linux在
答案3
让我们变得迂腐吧。
正如其他人所说,它是一个别名;因此,严格来说,它既不是绝对路径,也不是相对路径。实际上,它是一个绝对路径,因为它与工作目录无关。
现在了解详细信息。在操作系统级别,不支持别名,因此所有绝对路径以斜杠开头的规则都成立,其他所有内容都是相对路径。然而,应用程序可能不仅仅将名称传递给内核:对:
,的特殊处理~
是-
常见的且依赖于应用程序。-
用于启动选项,以便确保您使用相对路径,您可以在几乎所有情况下预先设置强制相对处理(据我所知,唯一的例外是在or./
的某些实现中包含斜杠的主机名)。识别用于检测某些命令的 url 和远程主机,并且前导在某些情况下也具有特殊含义,但所有这些情况都是应用程序级别问题而不是操作系统级别。rcp
scp
:
//
几乎所有 shell(我知道有一个例外)和许多 Unix 应用程序都支持基本的波形符扩展。最有可能起作用的两个波形符扩展是~/path
(其中前导波形符被变量的内容替换$HOME
)和~name/path
(name
在用户数据库中查找以找到用户name
的主目录)。奇怪的是,如果用户数据库不包含绝对路径(不要这样做)或$HOME
不包含绝对路径(也不要这样做)。还可能存在其他形式的波形符扩展;例如,Bash 扩展~-
到以前的工作目录,同样都是在应用程序级别(并且 shell 是一个应用程序)。
答案4
是的,~/Mary 是相对路径。
这个问题似乎是一个定义问题。我不确定是否存在官方系统范围的定义绝对路径和相对路径
“路径”有两种类型:相对的和绝对。绝对路径始终指向相同的资源。相对路径指向相对于其他资源的资源。
当使用~时,通常用于扩展到当前用户主目录。主目录取决于当前用户,所以 ~/Mary 是相对的到当前用户主目录。
例如,~/Mary
可以扩展到/home/bob/Mary
用户 bob,并且可以扩展到/home/alice/Mary
用户 alice。
更多示例
./Mary 相对于当前目录
../Mary 相对于父目录
~/Mary 相对于当前用户主目录
Mary 相对于当前目录
/Mary 相对于根目录。根目录是固定的,所以这是一个绝对路径
然而,人们可能会声称即使是根目录也是相对于当前主机的。如果将主机添加到路径中,它将变为主机名:/Mary。但这仍然不是真正的绝对路径,因为“主机名”是相对于定义主机名的系统而言的。