Ubuntu 中“!”符号的含义是什么?

Ubuntu 中“!”符号的含义是什么?

我已经到处找过了,但我找不到!Ubuntu 中的意思,我到处都看到它。例如:

find -f -d !(.txt)

答案1

从:https://unix.stackexchange.com/a/3748

!是最初出现在 C shell 中的一项功能,那时您还无法依靠终端使用箭头键。如果您将当前命令编号添加到提示符 ( PS1="\!$ "),那么此功能特别有用,这样您就可以快速查看屏幕以获取过去命令的编号。

现在您可以使用箭头键和诸如Ctrl-R搜索命令历史记录之类的功能,但我认为该功能没什么用处。

您可能仍然会发现它的一种有用的变体是!!,它会重新执行上一个命令。就其本身而言,我发现没有 !!Enter比 更快的了 Enter,但当将其组合成一个更大的命令时,它会很有用。

例子:普通的飞行员失误sudo基于系统的缺点是忘记sudo 需要额外权限的命令的前缀。新手会重新输入整个命令。勤奋的学生会从 shell 的命令历史记录中编辑命令。开明的人会输入sudo !!

Bash 允许你使用或禁用!shell 中的处理。你可以在 Zsh 中使用 禁用它。set +o histexpandset +Hset -K

答案2

除了在 shell 历史扩展中的使用之外,还涵盖Android Dev 的回答,最常见的用途是表达否定或集合补集。例如,在简单的 shell 通配符中

ls [!a-c]*

列出文件除了那些从范围内的字符开始a-c。您还可能会看到用插入符号代替感叹号[^a-c](借用自正则表达式语法)写成的格式,尽管后一种格式不符合 POSIX 标准。

Bash 将补集的概念扩展到整个模式,扩展的 shell 全局变量例如

ls !(*.txt)

将列出除以扩展名结尾的文件之外的所有文件.txt

一些单独的命令也可以独立地用作!否定或逻辑补充 - 例如

find ! -name '*.txt'

尽管 GNUfind至少-not在这种情况下也支持更长的形式(尽管这不符合 POSIX 标准)。

您的例子似乎混淆了最后两种用法 - 它看起来像一个扩展的 shell glob,但是作为find命令的一部分出现,而这样的 shell 扩展是无效的1


1但是,可以使用扩展的 shell glob 来构造目录搜索find-find !(foo*)/ -name '*.bar'例如

相关内容