状態141に設定されたパイプライン出力の最初の行を取得します。これはset -eo Pipelinefailを使用してbashスクリプトに失敗します。

状態141に設定されたパイプライン出力の最初の行を取得します。これはset -eo Pipelinefailを使用してbashスクリプトに失敗します。

コマンドを実行するbashスクリプトがあり、そのスクリプトから最初の出力行を取得したいと思います。

明らかな答えはですsome_command | head -1。そうですか?まあ、これは99%の場合に動作しますが、出力が十分に大きい場合、私はset -eo pipefail一番上にあるため、終了コード141で失敗することがあります。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遅延が2秒未満であっても、実際の入力は10Mラインよりはるかに少なくなります。

Jonathan Lefflerによる功績:https://stackoverflow.com/a/1429628/1536933- この回答は多くの賛辞を受ける価値があります!

おすすめ記事