-bash:!:未找到事件

-bash:!:未找到事件

我想删除除名为 docs 的文件夹之外的所有文件夹和文件。

echo !(docs)

但我得到了-bash: !: event not found

我正在使用 Mac 默认终端。

答案1

您有两个问题:

  1. !(doc)是一个扩展的 glob并且extglob已关闭。如果您的 bash 支持extglob,您可以使用以下命令将其打开:

    shopt -s extglob
    
  2. 历史扩展已打开。要关闭它,请运行

    set -H
    

    使用历史扩展时,可能会发生意外情况!。如果您不使用历史扩展,可以将其关闭,以避免意外情况。

例子

让我们考虑包含这些文件的目录:

$ ls
docs  file1  file2

现在让我们打开 extglob离开和历史并运行命令:

$ shopt -u extglob; set -H
$ echo !(docs)
bash: !: event not found

这正是您报告的错误消息。因此,这似乎是您的情况。

现在,让我们保留 extglob离开并转向历史扩展离开

$ shopt -u extglob; set +H
$ echo !(docs)
bash: syntax error near unexpected token `('

此错误与您报告的错误不同。这不是您的情况。

最后,让我们用 extglob 运行你的命令为了完整起见,我们将在两种设置中尝试历史扩展:

$ shopt -s extglob; set +H
$ echo !(docs)
file1 file2
$ shopt -s extglob; set -H
$ echo !(docs)
file1 file2

这两种方法都可以。因此,只要您的 shell 支持 extglob 并且已将其打开,您的命令就应该可以工作。

相关内容