为什么 echo !() 打印当前目录的内容?

为什么 echo !() 打印当前目录的内容?

我一直在自学各种 bash“保留字”的含义。

在执行此操作时,我无意中输入了命令

echo !()

令我惊讶的是,该命令执行并产生与该命令相同的输出

echo *

换句话说,输出是当前目录内容的列表

file1 file2 directory1 directory2

为什么 bash 本质上扩展!()*

我无法确定 的含义(),因为它在其他上下文中似乎是无效的表达式。

答案1

这是 bash 的extglob 模式匹配它从 Korn shell(其子集)复制的语法。!(pattern),当以extglob某种方式启用(例如通过bash_completion交互式 shell 中的附加组件)时,将扩展为当前工作目录中不匹配的(默认情况下非隐藏)文件的名称pattern

如果使用空模式,则表示当前目录中名称为的所有文件不是空字符串,但文件名无论如何都不能为空,因此这就是所有(默认情况下非隐藏)文件。

当启用它的选项时,您将得到相同的结果,zsh其中相当于 ksh 的。echo ^extendedglob^pattern!(pattern)

相关内容