在将目录路径定义为变量或常量时,它应该以斜杠结尾吗?有什么约定?
pwd
在Unix中,显示的当前目录没有斜杠,而完整的制表符cd /var/www/apps/
包括斜杠,这让我不确定。
Answers:
例如,当我定义用于存储文件的目录时,我不包括斜杠。那是因为我会像
$store_file = "$store_path/$file_id";
在使用应该保存目录路径的变量之前,我将始终添加一个斜杠。我认为总要添加一个总比不知道是否包含尾部的斜线更好。
'///' + $root + '//' + $file + '/'
,这无关紧要。尽管使用斜杠是辨别路径是文件还是目录的好方法,但最好将路径附加到类似之类,'/' + $root
而不是$root + '/'
因为不能肯定要附加的路径是否带有斜杠,但您可以相对放心,在大多数环境中,多个斜杠将被解释为单个斜杠。
/tmp/store_data/
是一个目录,但不清楚在没有斜线的情况下是什么相同的路径/tmp/store_data
rm -rf $foo/$bar
罐可以以rm -rf /
我用斜杠结尾是因为:
“如果以斜杠结尾,则为目录。如果不是,则为文件。” 是一个容易记住的约定。
至少在我通常使用的操作系统上,将斜杠加倍不会造成任何问题,而省略斜杠会造成较大的问题。因此,将斜杠放入变量中并在使用时使用“ $ path / $ file”是最安全的。
A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.
在大多数情况下,通常在公共实现中双斜杠通常被解释为单斜杠。
我知道这已经有10年的历史了,但我想投入我自己的0.02美元。
不,绝对不
我们正在谈论Unix系统。关于目录本身,它是一个节点,就像其他节点一样。当提到的目录,它不应该曾经有在其名称中的转义斜杠(参考:dirname
,pwd
,~
,echo $HOME
,echo $PATH
,从输出ls
等)。
当引用目录的内容时,则需要一个斜杠。也就是说,ls /home/karl/
它比ls /home/karl
(FTR,我几乎总是这样做,因为...好吧,懒惰)更合适。
当使用包含目录的变量来创建文件的完整路径时,您总是希望包含斜杠(即:)cp ${HOME}/test ${OTHER_DIR}/
。
据预计,一个目录不是在一个斜线结束。对目录以斜杠结尾的任何期望都是错误的。因此,在*_DIR
变量值的末尾添加斜杠将破坏预期。
至于制表符补全,这里的期望是您要进入该目录。因此,制表符补全提供的帮助是使您进入该目录,以便您可以基于目录的内容进行下一个选择。
(来自注释的参考:Filepath Misconceptions,来自Wikipedia的Talk:Path_(computing)
页面。谢谢john cj)
值得注意的是,仅仅因为它是错误的,并不意味着工具/软件包/库永远都不会这样做。很少有这样的事情在不存在斜杠的情况下加一个斜杠,这是非常常见的情况。因此,正如Bevan和Paul F都建议的那样,在使用第三方工具时,最好删除目录名称中可能存在的任何斜杠。
Unix索引节点
索引节点(索引节点)是Unix样式的文件系统中的数据结构,用于描述文件系统对象(例如文件或目录)。
- https://en.wikipedia.org/wiki/Inode
文件系统层次结构标准
该对Unix文件系统(文件系统层次标准,AKA FHS)标准清楚地表明,目录不会认为具有尾随斜线,而是目录的内容开始以斜线(唯一的例外是/
,因为我们将不参考通过使用一个空字符串来作为文件系统根目录...并且无论如何都不应在其中创建文件。)
- http://www.pathname.com/fhs/pub/fhs-2.3.html
- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
/
是打破模式的根源。而且,如果您要从此处开始(递归)推理,那么您就可以了解可能是差异化实践的核心的矛盾(如此处答案所证明)。但是,一旦您接受此例外,其他所有内容都将生效。
/.
,这只是一个糟糕的主意;除了注入会导致意外麻烦的异常内容外,它看起来也很愚蠢。
在php中,由于dirname(__ FILE __)函数返回的目录名末尾没有斜杠。我倾向于遵守那个约定。
否则,在目录名的末尾使用斜杠将与dirname(..)的工作方式冲突,然后您将不得不处理这两种情况,因为您不知道目录名是否来自dirname(.. )功能或以斜杠定义的内容。
底线:不要使用斜线,因为dirname(..)不需要。
// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!
对于其他语言,请检查提取路径名的函数,并查看其是否使用斜杠,然后遵循该语言的约定。
我倾向于只添加结尾斜杠,因为我很有可能会使用该目录来添加/检索文件...
在网络引用方面,它实际上可以提高性能,而在末尾加斜杠
我猜这是在少数情况下正确的理论和实践答案都不相同的情况之一。
从理论上来说,@ Karl Wilbur的答案似乎肯定是正确的,因为您应该能够将对目录节点本身的引用与目录的内容区分开。
但是在实践中,我认为正确的答案是相反的:
最重要的原因是可以确定路径/home/FSObjectX/
是文件夹,而路径/home/FSObjectX
是模棱两可的。没有人知道这是否是文件夹文件。
规格应始终是精确且明确的。
在大多数情况下,您将始终引用文件夹的内容,而不是dir节点本身。
在实际情况很少见的情况下,可以通过删除任何可选的结尾dir分隔符在代码中轻松地对其进行处理。
使用双目录分隔符不会有任何危害,尽管可以肯定会丢失。
从理论上讲,这是一个错误的论点,因为您不应该通过“机会”进行编码,但是在实践中,会发生错误,并且也许使用结尾dir-sep可能最终会减少最终用户的运行时错误。
通过阅读这个有趣的线程,我没有发现使用结尾dir-sep的任何缺点,只是从理论上讲这是错误的。还是我错过了什么?