題 以下Linux命令中/的重要性是什麼


有什麼區別

cd abc/xyz/

cd abc/xyz

什麼是重要的 / 在末尾?哪種使用方式正確?因為兩者似乎都正常工作。


4
2018-01-18 07:23


起源


標題應該有s / Doubt / Question /,或者應該是問題的第一行 - Anonymous


答案:


差異可能很小 cd 你提供的例子,但要小心你 mv 文件。

例如,如果要將多個文件移動到另一個目錄,並鍵入

for i in *.mp3 ; do mv $i dest ;  done

忘記尾隨斜線,然後  移動的文件將覆蓋一個名為的文件 dest (實際上是第一個 創建 一個叫做的文件 dest 如果它還不存在)。結果是除了最後一個文件之外的所有文件都被最後一個文件覆蓋,現在它被調用了 dest

移動 到目錄,你必須指定尾隨/

for i in *.mp3 ; do mv $i dest/ ;  done

斜杠的一個副作用是,如果目錄不存在,您將收到錯誤消息。


9
2018-01-18 07:43



是。這不是路徑名解析的問題,但它是如何在規範中的歧義 mv 在實踐中得到解決。同樣的問題 rsync。 - Charles Stewart
“要移動到目錄,必須指定尾隨/”。不,你沒有。它只是一個安全技巧,以防目錄不存在,這是有效的,因為“dest /”是(正如我在下面的答案中寫的)相當於“dest /。”,如果“dest”是,則這將是一個無效的路徑不是目錄。它不需要削減。 - Teddy


cd abc/xyz/

這是正確的做法。但是,如果你指定

cd abc/xyz

如果cd表明xyz是一個目錄,它假定存在尾隨/


2
2018-01-18 07:25



沒有理由更喜歡一個而不是另一個。 - Charles Stewart


cd abc/xyz

是的,因為“abc / xyz”指的是'“abc”目錄中的“xyz”實體“。當你輸入

cd abc/xyz/

它指的是 '“abc”目錄中“xyz”目錄中的“”實體“。 “”(空字符串)實體自動轉換為“。”,這是“當前”目錄,在本例中是“xyz”目錄。所以這一切都是同樣的事情。

(有些人覺得目錄“必須“附加一個斜線。他們錯了。”


2
2018-01-18 08:51



s / must / should / ... - DevSolar


它們完全相同。該字符串由文件名操作符處理為“路徑”,它是一個抽象,每個路徑與一個基本名稱和另一個路徑(目錄號)相關聯。如果每個路徑都是相同的字符串,則兩條路徑是相同的。對於你的例子:

cas var $ dirname abc / xyz; basename abc / xyz
ABC
XYZ
cas var $ dirname abc / xyz /; basename abc / xyz /
ABC
XYZ

請注意,雖然某些程序對字符串的處理方式相同,包括所有常用的UNIX實用程序,但如果它們是相同的路徑,則還有其他程序會關注尾部斜杠。其中最重要的是 rsync

後記  從POSIX規範, 路徑名解析

必須解析包含至少一個非斜杠字符並以一個或多個尾部斜杠結尾的路徑名,就好像將一個點字符('。')附加到路徑名一樣。


1
2018-01-18 10:19



所以要從你的postscript中插入示例 abc/xyz/ 實際上是解釋(在POSIX下) abc/xyz/.。 (Teddy也在他的回答中說明了這一點,但感謝你提供了一個來源。) - quack quixote