在目录路径末尾包含 / 和省略它之间的区别

在目录路径末尾包含 / 和省略它之间的区别

我只是想知道当我将 / 留在文件路径末尾时会发生什么情况,例如:

root /var/www/website.com/

并省略它,例如:

root /var/www/website.com

这是如何处理的或者有什么区别?

答案1

目录名后面的斜杠在某些程序中很重要,而在其他程序中则不然。例如:

  • 在 git 中,/文件名后面仅表示目录而不是单个文件(来自man 5 gitignore):

    如果模式以斜杠结尾,则出于以下描述的目的,它将被删除,但它只会找到与目录的匹配项。换句话说, foo/ 将匹配目录 foo 及其下面的路径,但不会匹配常规文件或符号链接 foo (这与 git 中 pathspec 通常的工作方式一致)。

  • ls(来自维基百科):

    当请求指向目录的符号链接的目录列表时
    ,只会显示链接本身。为了
    获取链接目录的列表,路径必须
    包含尾随目录分隔符(“/”、斜杠)。

  • 然而,我现在不记得的其他一些程序(主要是我看到的 Emacs 宏)只需要一个目录而不是常规文件,它们会接受两者dirdir/并且会在需要时添加/,例如引用dir.

我不知道 nginx 是如何工作的,但看看穆鲁的回答

答案2

一般来说,没有尾部斜杠的路径是不明确的:它可以是文件或目录。带有斜杠的路径只能是目录。大多数 shell 在使用制表符补全时会自动为您提供尾部斜杠。

这并不意味着您应该始终使用尾部斜杠;事实上,有些程序不允许使用它。正如其他人所说,这取决于上下文。每个程序对此都有不同的解释。

尾部斜杠产生巨大差异的一个例子是rsync.

给定目录sourcetarget,该命令rsync -a source target会将所有内容复制到target/source。但使用尾部斜杠,直接rsync -a source/ target将内容复制sourcetarget,而不创建target/source子目录。

我经常对这种行为感到困惑,因此我更喜欢将其写出来,而不是依赖隐式子目录创建。有时我什至使用尾随/.来确保不会创建不需要的子目录,因为子目录.已经存在。

答案3

背景确实很重要。对于nginx,在指定root位置时,它没有任何区别,因为nginx知道它是一个目录。然而,它可能会在其他地方产生影响,因为双斜杠可能会导致 URL 出现问题(也就是说,如果您blah/$request_uri在重写或代理时执行类似操作)。

一般来说,对于 *nix 平台来说,这没有什么区别。有一些例外:

  • rsync根据源目录路径是否有尾部斜杠,行为会有所不同。rsync 如何处理尾部斜杠的一个很好的例子
  • 添加尾部斜杠可以使应用程序知道它正在查找目录,而不是意外创建文件:

    cp blah non-existent-directory
    cp blah non-existent-directory2/
    
  • 与上面类似,在通配中,它可用于仅强制扩展到目录:

    $ printf "%s\n" * | wc -l
    26
    $ printf "%s\n" */ | wc -l
    20
    

    请原谅这个例子。它是在相当标准的 Ubuntu 安装的根目录上完成的,因此在执行此示例期间不会损害任何奇怪的名称。

答案4

如果您在 shell 中输入:

    cd 路径/somedir

它将您当前的目录移动到路径/某个目录
但如果你输入:

    cd 路径/somedir/

它打印:

    bash: cd: path/somedir/: 没有这样的文件或目录

也许因为该/字符意味着路径不完整,但仍在继续,因此如果在其后面不放置任何内容,则与引用不存在的文件相同。

相关内容