泽什 | `酿造清单| {任何命令}` 引发未捕获的信号 PIPE 错误

ben*_*sop 1 macos homebrew grep zsh

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

brew list | grep -q some-library
Run Code Online (Sandbox Code Playgroud)

引发以下错误:

Error: Failure while executing; `ls /usr/local/Cellar` was terminated by uncaught signal PIPE.
Run Code Online (Sandbox Code Playgroud)

在 Mojave MacBook 上运行相同的命令不会产生错误。任何冲泡列表似乎都会发生这种情况 | {command} 如下也会引发错误:

brew list | echo 'hi' 
Run Code Online (Sandbox Code Playgroud)

我已经恢复了我的酿造,以防万一有什么东西坏了,但这并没有改变任何东西。关于为什么我会看到此错误有什么想法吗?

更新:这似乎是由于zsh控制台而发生的

Bar*_*mar 5

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

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

在这种情况下,grep -q一旦读取到匹配的行就退出。由于它没有打印任何内容,因此它知道在第一场比赛中它就成功匹配了,并且不需要继续阅读。

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

brew list | { grep -q some-library; cat > /dev/null; }
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,如果您用于grep -q获取其退出状态,则该状态已被 的状态覆盖cat。您可以通过保存来解决此问题$?

brew list | (grep -q somelib; ret=$?; cat >/dev/null; exit $ret)
Run Code Online (Sandbox Code Playgroud)