获取管道输出集的第一行存在状态 141,该状态使用 set -eo pipelinefail 使 bash 脚本失败

获取管道输出集的第一行存在状态 141,该状态使用 set -eo pipelinefail 使 bash 脚本失败

我有一个 bash 脚本,它运行一个命令,我只想从中获取第一行输出。

显而易见的答案是some_command | head -1,对吧?好吧,这在 99% 的情况下都有效,但是当输出足够大时,它有时会失败,退出代码为 141,因为我set -eo pipefail在顶部。awk '{ print; exit; }'适用于更多情况,但在输出足够大时仍然失败。这个简单的脚本重现了该问题:

#!/bin/bash
set -eo pipefail
seq 1 100000 | awk '{ print; exit; }' | tee
echo "This is not printed"

这会打印“1”,但不会打印“This is not print”。据我了解,awk(或 head)在输入命令(seq此处)之前退出,因此输入命令失败并出现 SIGPIPE (141)。我当然可以通过+e在相关命令之前设置并手动检查退出代码来解决这个问题,但是有更好的方法吗?

我真的不想删除 ,-o pipefail因为如果路径中的任何命令实际上失败,我确实希望脚本失败。

答案1

sed -n 1p作品!

它似乎读取了所有输入,从而避免了 SIGPIPE。即使seq 1 10000000 | sed -n 1p延迟不到两秒,任何实际输入也将远远少于 10M 行。

归功于乔纳森·莱夫勒:https://stackoverflow.com/a/1429628/1536933- 这个答案值得所有的赞同!

相关内容