Shell
為什麼方括號會阻止外殼擴展?
‘4800483343’ 是一個目錄,‘file1’ & ‘file2’ 是其中的兩個文件。
為什麼會發生以下情況?
$ ls 4800483343 file1 file2 $ md5sum 4800483343/* 36468e77d55ee160477dc9772a99be4b 4800483343/file1 29b098f7d374d080eb006140fb01bbfe 4800483343/file2 $ mv 4800483343 4800[48]3343 $ md5sum 4800[48]3343/* md5sum: 4800[48]3343/*: No such file or directory $ md5sum '4800[48]3343'/* 36468e77d55ee160477dc9772a99be4b 4800[48]3343/file1 29b098f7d374d080eb006140fb01bbfe 4800[48]3343/file2
還有哪些其他角色會導致這種情況?
回答原始問題
為什麼方括號會阻止外殼擴展
方括號不會阻止外殼擴展,但引號可以。
我懷疑您實際執行的命令如下
這將在以下文件上執行 md5sum
dir/
:$ md5sum d[i]r/* 02fdd7309cef4d392383569bffabf24c dir/file1 db69ce7c59b11f752c33d70813ab5df6 dir/file2
這與防止方括號擴展的引號一起
dir
移動:d[i]r
$ mv dir 'd[i]r'
這將查找
dir
不再存在的目錄:$ md5sum d[i]r/* d[i]r/*: No such file or directory
由於引號,以下內容在名為 的新目錄中查找
d[i]r
:$ md5sum 'd[i]r'/* 02fdd7309cef4d392383569bffabf24c d[i]r/file1 db69ce7c59b11f752c33d70813ab5df6 d[i]r/file2
修改問題的答案
在修改後的問題中,目錄 4800483343 存在並執行以下命令:
mv 4800483343 4800[48]3343
執行此命令時會發生什麼取決於 glob 是否
4800[48]3343
與任何現有目錄匹配。如果沒有目錄與之匹配,則4800[48]3343
擴展為自身4800[48]3343
並將目錄4800483343
移動到目錄4800[48]3343
。最後:
- 該命令
md5sum 4800[48]3343/*
將返回錯誤“沒有這樣的文件或目錄”,因為不存在與 glob 匹配的目錄4800[48]3343
。- 該命令
md5sum '4800[48]3343'/*
將正確找到文件,因為引號會阻止 glob 的擴展。球體的例子
讓我們創建兩個文件:
$ touch a1b a2b
現在,觀察這些球體:
$ echo a[123]b a1b a2b $ echo a?b a1b a2b $ echo *b a1b a2b