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

jrt*_*jrt 21 bash

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

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

echo !()
Run Code Online (Sandbox Code Playgroud)

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

echo *
Run Code Online (Sandbox Code Playgroud)

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

file1 file2 directory1 directory2
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*awn 33

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

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

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