Shell

為什麼方括號會阻止外殼擴展?

  • October 19, 2015

‘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

最後:

  1. 該命令md5sum 4800[48]3343/* 將返回錯誤“沒有這樣的文件或目錄”,因為不存在與 glob 匹配的目錄4800[48]3343
  2. 該命令md5sum '4800[48]3343'/*將正確找到文件,因為引號會阻止 glob 的擴展。

球體的例子

讓我們創建兩個文件:

$ touch a1b a2b

現在,觀察這些球體:

$ echo a[123]b
a1b a2b
$ echo a?b
a1b a2b
$ echo *b
a1b a2b

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