我有一个 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- 这个答案值得所有的赞同!