
我只是想知道當我將 / 留在檔案路徑末尾時會發生什麼情況,例如:
root /var/www/website.com/
並省略它,例如:
root /var/www/website.com
這是如何處理的或有什麼區別?
答案1
目錄名後面的斜線在某些程式中很重要,而在其他程式中則不然。例如:
在 git 中,
/
檔案名稱後面僅表示目錄而不是單一檔案(來自man 5 gitignore
):如果模式以斜線結尾,則出於以下描述的目的,它將被刪除,但它只會找到與目錄的匹配項。換句話說, foo/ 將匹配目錄 foo 及其下面的路徑,但不會匹配常規檔案或符號連結 foo (這與 git 中 pathspec 通常的工作方式一致)。
在
ls
(來自維基百科):當請求指向目錄的符號連結的目錄清單時
,只會顯示連結本身。為了
取得連結目錄的列表,路徑必須
包含尾隨目錄分隔符號(“/”、斜線)。然而,我現在不記得的其他一些程式(主要是我看到的 Emacs 巨集)只需要一個目錄而不是常規文件,它們會接受兩者
dir
,dir/
並且會在需要時添加/
,例如引用dir
.
我不知道 nginx 是如何工作的,但看看穆魯的回答。
答案2
一般來說,沒有尾部斜線的路徑是不明確的:它可以是檔案或目錄。有斜線的路徑只能是目錄。大多數 shell 在使用製表符補全時會自動為您提供尾部斜線。
這並不意味著您應該始終使用尾部斜線;事實上,有些程式不允許使用它。正如其他人所說,這取決於上下文。每個程序對此都有不同的解釋。
尾部斜杠產生巨大差異的一個例子是rsync
.
給定目錄source
和target
,該命令rsync -a source target
會將所有內容複製到target/source
。但使用尾部斜杠,直接rsync -a source/ target
將內容複製source
到target
,而不創建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/: 沒有這樣的文件或目錄
可能是因為該/
字元意味著路徑不完整,而是繼續,因此如果在其後面不放置任何內容,則與引用不存在的檔案相同。