Bash
堆路徑’/‘和’//‘有什麼區別?
我在 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
等等保證是相同的路徑,但/foo
and//foo
不保證//foo
是相同的路徑, and也不是///foo
——任何實現都可以定義語義如他們所願。他們可以選擇定義為與 and//foo
表示相同的含義,但他們不必這樣做。/foo``///foo
目的是作業系統可以使用以開頭的路徑
//
來實現不同於 POSIX 文件系統語義的語義。例如,Windows 和 Unix 的假設混合體可以
//
用於 Windows 文件系統語義。Cygwin 實際上//
用於網路路徑,類似於 Windows 使用\\
.例如,在 Cygwin 中,
cd //; ls
將列出本地網路上的所有 SMB 文件伺服器,而不是根目錄!