Bash 为什么可以'';rm*(1)*'';删除不包含字符串“的文件”;(1) ";以他们的名义?

Bash 为什么可以'';rm*(1)*'';删除不包含字符串“的文件”;(1) ";以他们的名义?,bash,Bash,我在下载文件夹(linux的windows子系统)中使用了rm命令。虽然我告诉它删除任何包含(1)的内容,但下载文件夹中的所有文件都被删除了。为什么会发生这种情况 rm *(1)* *(…)表示“零个或多个…” 因此,您告诉shell传递rm一个参数列表,该列表包含以零或多个1s开头的所有文件,然后具有以下任何后缀。每个可能的文件名都与此模式匹配,因此结果相当于rm* 如果要确定子字符串是文字而不是作为glob语法处理,请始终引用它: rm -- *'(1)'* …将在所有POSIX超集系

我在下载文件夹(linux的windows子系统)中使用了rm命令。虽然我告诉它删除任何包含(1)的内容,但下载文件夹中的所有文件都被删除了。为什么会发生这种情况

rm *(1)*
*(…)
表示“零个或多个

因此,您告诉shell传递
rm
一个参数列表,该列表包含以零或多个
1
s开头的所有文件,然后具有以下任何后缀。每个可能的文件名都与此模式匹配,因此结果相当于
rm*


如果要确定子字符串是文字而不是作为glob语法处理,请始终引用它:

rm -- *'(1)'*

…将在所有POSIX超集系统上保持一致的行为,包括实现类似于
extglob
的扩展的系统。

让我猜猜,您启用了
extglob
选项了吗?(默认情况下它是关闭的,但发行版默认在其点文件中打开它并非闻所未闻)。请参阅
echo rm*(1)*
@Cyrus,…*咕哝*re:建议
echo
进行调试;或者,
set-x;:马币*(1)*;set+x将更具代表性(使用引号或反斜杠区分语法和文字空白,显示隐藏字符,&c);同样地,
printf“%q”rm*(1)*;echo
在显示真实表示方面做得相当好,即使文件名包含不寻常的字符。@Cyrus,…(如您所知),
echo rm*(1)
没有显示扩展到
rm'Hello World(1)
rm Hello World(1)
之间的区别,但它们是非常不同的东西。请参阅
ksh
手册页中的“文件名生成”,或
bash
手册页“模式匹配”部分下的extglob。