Zsh | `酿造清单| {任何命令}`引发未捕获的信号管道错误

问题描述 投票:0回答:2

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

brew list | echo 'hi' 

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

更新:这似乎是在

zsh
控制台

中发生的
macos grep homebrew zsh
2个回答
7
投票

当程序在管道的读取端关闭后尝试写入管道时,程序会收到一个

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)

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.