Bash

堆路徑’/‘和’//‘有什麼區別?

  • October 11, 2021

我在 Ubuntu 中註意到以下命令轉到文件系統中看似不同的位置,但這些位置具有相同的文件:

cd /
cd //

ls-ing 從兩個位置產生相同的結果:

vm@virtual-machine://$ ls
bin    dev   initrd.img      lib64       mnt   root  snap      sys  var
boot   etc   initrd.img.old  lost+found  opt   run   srv       tmp  vmlinuz
cdrom  home  lib             media       proc  sbin  swapfile  usr

這些看似不同但文件路徑相同的行為是否有區別?

注意:“ cd ///”不是有效的文件路徑,但“ //usr/”和“ //bin/”是有效的路徑。

注2:所以執行 cd .. in 在 each 指向自己,所以// -> cd .. -> /// -> cd .. -> /

根據 POSIX 規範,恰好以兩個斜杠開頭的路徑具有實現定義的語義。

路徑中的多個斜線折疊為一個斜線,但路徑的開頭**正好有兩個斜線的情況除外

所以, /foo, ///foo, ////foo, and///////////////////foo保證是相同的路徑,, /foo/bar, /foo//bar,/foo///bar等等保證是相同的路徑,但/fooand//foo保證//foo是相同的路徑, and也不是///foo ——任何實現都可以定義語義如他們所願。他們可以選擇定義為與 and//foo表示相同的含義,但他們不必這樣/foo``///foo

目的是作業系統可以使用以開頭的路徑//來實現不同於 POSIX 文件系統語義的語義。

例如,Windows 和 Unix 的假設混合體可以//用於 Windows 文件系統語義。Cygwin 實際上//用於網路路徑,類似於 Windows 使用\\.

例如,在 Cygwin 中,cd //; ls將列出本地網路上的所有 SMB 文件伺服器,而不是根目錄!

引用自:https://unix.stackexchange.com/questions/672816