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'”的输入时,会出现错误。
在 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'”的输入时,会出现错误。