根据这个答案和我自己的理解,波浪号扩展到主目录:
$ echo ~
/home/braiam
Run Code Online (Sandbox Code Playgroud)
现在,每当我希望 shell 扩展工作时,即使用诸如 的变量名$FOO
,并且不要因为意外的字符、诸如空格等而中断。应该使用双引号"
:
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
Run Code Online (Sandbox Code Playgroud)
为什么这种扩展不适用于波浪号?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
Run Code Online (Sandbox Code Playgroud) 我知道以前可能有人问过这个问题,但我在 Google 上找不到。
给定的
会~ == $HOME
是真的吗?
这只是一个词汇问题,但它一直在我的脑海中盘旋。
它来自LPIC准备书中的练习考试。根据这本书的正确答案是这~/Documents
是一个相对目录,因为它是相对于主目录的。
然而,这本书包含的错别字和错误比例很高,所以我不能认为那里写的所有东西都是理所当然的。在这里我不同意,因为对我来说,~
它充当了由 shell 扩展为变量内容$HOME
或当前用户主目录路径(参见man bash
)的变量,因此实际路径/home/myuser/Documents
确实是绝对目录。
甚至Wikipedia一次,在这个话题上对我来说似乎也没有帮助(即使它似乎证实这本书在这个问题上是错误的):
无论当前工作目录如何,绝对路径或完整路径都指向文件系统中的相同位置。为此,它必须包含根目录。
相比之下,相对路径从某个给定的工作目录开始,无需提供完整的绝对路径。
在这里,我再次不同意:根据这个定义,/opt/kde3/bin/../lib
不依赖于当前工作目录的路径应该是绝对路径,但是我目前对此的理解与本书作者将这条路径设为相对路径相符。
根据韦伯斯特词典,快速的网络搜索只会增加我的挫败感:
绝对路径- 相对于根目录的路径。它的第一个字符必须是路径名分隔符。
那么$HOME/Documents
,甚至$HOME
不会被视为绝对目录?或者这个定义是否意味着变量扩展?贝壳的~
性格呢?我可以在某处找到相对目录与绝对目录的任何可靠定义,并且我一直都错了吗?
我正在编写一个用于操作 Unix 路径字符串的库。既然如此,我需要了解大多数人不会担心的语法的一些晦涩的角落。
例如,作为最好的,我可以告诉大家,似乎foo/bar
并foo//bar
都指向同一个地方。
此外,~
通常代表用户的主目录,但如果它出现在路径中间呢?那会发生什么?
如果我要编写正确处理每种可能情况的代码,这些以及其他几十个晦涩的问题需要回答。有人知道解释这些东西的确切语法规则的权威参考吗?
(不幸的是,搜索诸如“Unix 路径语法”之类的术语只会出现一百万页讨论$PATH
变量……哎呀,我什至在努力为这个问题找到合适的标签!)