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控制台而发生的
当程序在管道的读取端关闭后尝试写入管道时,程序会收到一个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)
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |