我一直在自学各种 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)