〜/ Documents是相对路径还是绝对路径?


37

这只是一个词汇问题,但一直在我脑海中回荡。

它来自LPIC准备书中的实践考试。根据这本书的正确答案~/Documents是相对目录,因为它是相对于主目录的。

但是,这本书包含错别字和错误的比率很高,所以我不能认为那里写的一切都是理所当然的。在这里我并不同意,因为对我而言,它~充当由Shell扩展为变量内容$HOME或当前用户主目录路径(参见参考资料man bash)的变量,因此实际路径/home/myuser/Documents确实是绝对目录。

即使是Wikipedia,这一次对我似乎也无济于事(即使似乎确认这本书在这方面是错误的):

无论当前工作目录如何,绝对路径或完整路径都指向文件系统中的同一位置。为此,它必须包含根目录。

相反,相对路径从某些给定的工作目录开始,从而避免了提供完整的绝对路径。

再次重申,我不同意:根据此定义,/opt/kde3/bin/../lib不依赖于当前工作目录的路径应该是绝对路径,但是我目前对此的理解与本书的作者相匹配,因此该路径是相对路径。

快速的Web搜索只是增加了我的无奈,根据韦氏词典

绝对路径 -相对于根目录的路径。它的第一个字符必须是路径名分隔符。

那么$HOME/Documents,甚至$HOME不被认为是绝对目录?还是这个定义意味着变量扩展?外壳的~特征如何?我在某处可以找到相对目录和绝对目录的可靠定义,而且我一路走错了吗?


7
所有路径都是相对的,其中一些仅相对于根目录/,而我们称之为绝对路径。因此,什么开始从一切/我会叫绝对的(即使这是/usr/../etc)和其他一切我会打电话的相对(~/DocDoc../john/Doc$HOME/...,...)。关键是绝对值应该起作用,而不管当前的工作目录或当前用户如何。相对只能在某些特定的狭窄情况下起作用。
jimmij 2015年

6
该路径可能会扩展到其他位置,具体取决于用户是谁。话虽如此,我认为这仍然是一条绝对的道路,而不是相对的道路。尽管我不认为绝对路径和相对路径的定义如此精确。这不是数学。这个问题并不能真正测试理解能力,imo,毫无意义。
Faheem Mitha 2015年

1
@FaheemMitha:LPIC是发行中立的Linux认证。证书本身看起来还不错,但是要出售(至少一些)书籍作为自学考试的准备,这
远非如此

2
@jimmij:“相对”在路径的上下文中具有特定的技术含义,并且使用不同的英语单词含义是不好的做法。我完全不同意调用~/foo相对路径。您得到的是硬编码和参数化之间的区别。请参阅我的答案以获取更多详细信息。
彼得·科德斯

1
韦伯斯特词典的定义是正确的,但非常令人困惑。但是,它暗示诸如~/Documents和的字符串$HOME/Documents不是路径。它们确实在扩展后标识(绝对)路径,但它们本身不是路径。我认为这与有多少Unix / Linux用户使用该术语是一致的,但毫无疑问,这些字符串本身也称为路径。
reinierpost

Answers:


41

如果作者试图通过谈论该文字字符串(不带外壳扩展名)作为路径来吸引您,那么它就是相对路径(mkdir -p './~/Documents')。除此以外:


这是绝对路径,因为解析它不依赖于进程的当前工作目录。 相对路径始终表示相对于流程的工作目录。或在符号链接目标的情况下,相对于符号链接的位置。(gcc -> gcc-5.2gcc -> /usr/bin/gcc-5.2)。这对于NFS挂载以及其他可以通过不同的绝对路径到达同一符号链接的情况很重要。例如

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian有时会将符号链接安装到../../doc/whatever/whatever,而不是绝对符号链接目标,因此,当NFS挂载在其他位置或查看chroot而不涉及它时,它会起作用chroot(8)

每个Unix进程都有自己的cwd。该pwd命令仅用于打印。

请参阅:http : //pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html, 以获取有关使用POSIX系统调用更改目录的更多信息。


就像其他人都说过的那样,~在路径用于任何事物之前,它会被外壳扩展。使用~/bin/myprog在shell脚本将使得针对不同用户的工作方式不同。~/bin/foo和之间的区别在于/home/peter/bin/foo,其中一个已对位置进行了硬编码,而另一个已对其进行了参数化。将~版本称为相对路径是错误的(IMO)。

谈论事物“相对于环境变量”只是令人困惑。在您使用的上下文中使用具有特定技术含义的术语的不同英语含义是不好的做法。

在损坏的系统上,使用HOME=a/relative/path~/foo将扩展为相对路径。这根本不是一个可用的设置。


3
谢谢您的回答,这对我来说似乎是最全面的回答。我还有一种印象,就是作者错误地将规范路径的概念混入了其中(作者在任何地方都没有提到)。/opt/kde3/bin/../lib例如,错误地将其归类为相对路径:这绝对路径,但不是规范路径。如您所说,这只会使所有事情变得混乱,因此感谢您的澄清和有关NFS的信息:)!
WhiteWinterWolf,2015年

1
我必须得出的结论是,编写考试准备书并不有趣,而且仅使用Unix或GNU / Linux进行日常计算的人并不是编写这些书的人。对我来说,调用非规范路径亲属的示例似乎真的很糟糕,也很明显。 man7.org/linux/man-pages/man3/realpath.3.html(和realpath(1))同时做两件事:规范化并使其绝对化(以及遵循符号链接),因此可能有些混乱在其中蔓延
彼得·科德斯

2
不过,对于我来说,这些只是日常的日常概念。我认为有一张纸说我知道他们会很奇怪。但是,祝您好运,让@WhiteWinterWolf纸给所有喜欢看纸的人看。:)
彼得·科德斯

48

这本质上是关于术语定义的问题。因此,出于您的目的,答案是LPIC想要的。但是我们可以基于技术事实得出一些结论:

如果传递'~/Documents'系统调用,它将~在当前目录中查找一个确切命名的目录(并且可能会失败)。因此,根据内核使用的路径名的概念,这是相对路径-但这不是我们的意思。

~是由Shell(以及为方便起见而模仿它的其他程序)实现的语法,语法扩展为真实的路径名。为了说明~/Documents这一点,它与$HOME/Documents(再次是shell语法)大致相同。由于$HOME应该是绝对路径,因此的值 $HOME/Documents也是绝对路径。但是文本$HOME/Documents~/Documents必须通过外壳扩展才能成为我们所指的路径。

因此,如果我想保持精确和一致,我会说这~/Documentsshell脚本的一部分,可以扩展到绝对路径。


当然,内核不知道含义$HOME是什么,就像它不知道含义~是什么一样。但是,我确实发现,壳完成扩展的说法是可疑的。大多数应用程序都支持此功能,它指向C库而不是Shell。但是,环境变量扩展 Shell的功能。您可以~/somefile.odt在LibreOffice 中打开,但不能打开$HOME/somefile.odt,即使LibreOffice是从已在其中正确设置$ HOME的外壳启动的。
2015年

5
你可以找到你想要的所有可疑,但它的记载,应该很容易在C.证实或否定
无用

6
其他程序~模仿外壳程序实现语法,因为它是一个有用的快捷方式。我实际上不知道是否有一个库函数来进行扩展,但这绝对是与实际使用路径名分开完成的事情。
凯文·里德

2
globwordexp进行波浪扩展。
o11c 2015年

2
@MichaelKjörling:一些程序实现了~扩展;大多数没有。例如,如果键入ls -l ~ls程序将永远看不到~字符;它在ls调用之前由外壳程序扩展。如果您确实将传递~ls,则不会对其进行特殊处理;试试ls -l '~'`(它将尝试列出一个字面意义上的文件~)。
基思·汤普森

16

如果your $HOME/home/white/~/Documents(与相同$HOME/Documents)将被shell扩展(请参阅此处以获取解释)到/home/white/Documents,这是绝对路径。

相对路径是不以/(shell扩展后)开头的路径,例如../Documentsfoo/bar

一些旧的炮弹不扩大~(的方式bashtcshzsh等...做); 他们会认为~/Documents是从...开始的相对路径~; 但您通常没有这样的目录名~(但是您可以使用创建目录名mkdir '~',但我不建议这样做)。


您应该提及哪些弹壳不会膨胀~
爱德华·托瓦尔兹

3

一个绝对路径的开始/(它指的是固定的),一个相对路径开始在当前目录(所以它指的是改变当前目录的变化)。大多数外壳程序~在开始时都将其用作当前用户主目录绝对路径的缩写,即,~/Documents是当前用户主目录中的目录Documents,而不管当前目录是什么。因此,这是一条绝对的道路。


1

该路径可能会扩展到其他位置,具体取决于用户是谁。话虽如此,我认为这仍然是一条绝对的道路,而不是相对的道路。但是,我不认为绝对路径和相对路径的定义如此精确。这不是数学。在我看来,这个问题并不能真正地测试理解能力,而且毫无意义。


定义远不止是意见。维基百科需要刺伤它一般情况下,不只是Unix的:en.wikipedia.org/wiki/...
彼得·科德斯

1

在开始处使用〜/可以使该路径成为绝对路径,因为(根据任何定义)能够找到文档并不取决于您当前所在的位置。但是,扩展是由外壳而不是内核完成的,因此,如果您使用的外壳无法识别此语法(例如/ bin / sh,原始的Bourne shell,而不是bash别名),您将无法使用运气。

有趣的是,如果使用〜root /而不是〜/,则通常不应用读取$ HOME的优化,并且如果/ etc / passwd是正确的,它将始终解析为绝对值。


-1

该书似乎认为绝对路径是任何以开头的路径/,而相对路径则是其他任何路径。

您可能会看到..$HOME类似的令牌类型。在路径解析为绝对路径之前,都需要用这两个路径元素代替。


3
怎么..$HOME..可以在直接传递给系统调用的路径的开头,无需扩展外壳。这样的路径不是绝对路径。它仍然相对于进程cwd或符号链接位置。除非作者试图通过将文字字符串(不带外壳扩展名)作为路径来吸引您。我认为您正在尝试为这本书找借口,但我更倾向于只说这是错误的,不要让事情变得混乱。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.