为什么方括号会阻止外壳扩展?

Emm*_*maV 3 shell filenames quoting wildcards

'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
Run Code Online (Sandbox Code Playgroud)

还有哪些字符会导致这种情况?

Joh*_*024 5

回答原始问题

为什么方括号会阻止外壳扩展

方括号不能阻止 shell 扩展,但引号可以。

我怀疑你实际运行的命令如下

这对以下文件运行 md5sum dir/

$ md5sum d[i]r/*
02fdd7309cef4d392383569bffabf24c  dir/file1
db69ce7c59b11f752c33d70813ab5df6  dir/file2
Run Code Online (Sandbox Code Playgroud)

这移动dird[i]r防止方括号扩展的引号:

$ mv dir 'd[i]r'
Run Code Online (Sandbox Code Playgroud)

这将查找dir不再存在的目录:

$ md5sum d[i]r/*
d[i]r/*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

由于引号,以下内容在名为 的新目录中查找d[i]r

$ md5sum 'd[i]r'/*
02fdd7309cef4d392383569bffabf24c  d[i]r/file1
db69ce7c59b11f752c33d70813ab5df6  d[i]r/file2
Run Code Online (Sandbox Code Playgroud)

回答修改后的问题

修改后的问题中,目录4800483343存在,运行如下命令:

mv 4800483343 4800[48]3343
Run Code Online (Sandbox Code Playgroud)

运行此命令时会发生什么取决于 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
Run Code Online (Sandbox Code Playgroud)

现在,观察这些球体:

$ echo a[123]b
a1b a2b
$ echo a?b
a1b a2b
$ echo *b
a1b a2b
Run Code Online (Sandbox Code Playgroud)