Zsh | `酿造清单| {any command}` 引发未捕获的信号 PIPE 错误

Zsh | `brew list | {any command}` raises uncaught signal PIPE error

在 MacOS Big Sur 机器上,运行 zsh 控制台 运行 以下命令:

brew list | grep -q some-library

引发以下错误:

Error: Failure while executing; `ls /usr/local/Cellar` was terminated by uncaught signal PIPE.

运行 Mojave macbook 上的相同命令不会产生错误。这似乎发生在任何 brew list | {command} 如下也会引发错误:

brew list | echo 'hi' 

我已经恢复了我的 brew,以防出现问题,但这并没有改变任何东西。关于我为什么会看到此错误的任何想法?

更新:这似乎会在 zsh 游戏机

中发生

当程序试图在管道的读取端关闭后写入管道时,程序会收到一个 SIGPIPE 信号,该信号会终止程序,除非它捕获到该信号(很少有人会这样做) .

在这种情况下,执行命令的 Shell 和其他应用程序通常会抑制终止消息,因为管道读取器在消耗完所有标准输入之前退出是很常见的。但显然 Big Sur 中 brew 的版本报告了此终止状态。

在这种情况下,grep -q 在读取匹配行后立即退出。因为它没有打印任何东西,所以它在第一次匹配时就知道它匹配成功,不需要继续读取。

您可以通过添加另一个命令来抑制它来消耗管道中的任何剩余数据。

brew list | { grep -q some-library; cat > /dev/null; }

唯一的问题是,如果您使用 grep -q 获取它的退出状态,它已被 cat 的状态覆盖。您可以通过保存 $?:

来解决此问题
brew list | (grep -q somelib; ret=$?; cat >/dev/null; exit $ret)

"|"基于管道,所以当“brew list”的输出不能作为“echo 'hi'”的输入时,会出现错误。