在目錄路徑末尾包含 / 和省略它之間的區別

在目錄路徑末尾包含 / 和省略它之間的區別

我只是想知道當我將 / 留在檔案路徑末尾時會發生什麼情況,例如:

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/: 沒有這樣的文件或目錄

可能是因為該/字元意味著路徑不完整,而是繼續,因此如果在其後面不放置任何內容,則與引用不存在的檔案相同。

相關內容