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