2012-03-08 58 views
3

私は出力を返すプログラムを呼び出すbashスクリプトを作成しています(リターンコードを返します)。私は、プログラムの戻りコードと出力の数(出力自体ではない)の両方を気にしています。このプログラムではインターネット経由でデータを取得する必要があるため、2回呼び出す必要はありません(特に、一時的なネットワークの問題などで2つの呼び出しのうち1つだけが失敗すると問題が発生する可能性があります)。出力行の数とリターンコードの両方をキャプチャするための最善のスクリプトは次のとおりです。よりエレガントなものがありますか?出力とリターンコードの行数を同時に取得する

#!/bin/bash 
line=$(foo | wc -l; echo ${PIPESTATUS[0]}) 
line=$(echo line | tr '\n' ' ') 
lineCount=$(echo line | awk '{ print $1}') 
returnCode=$(echo line | awk '{ print $2}') 

答えて

4

例:

set -o pipefail 
lineCount=$(foo | wc -l) 
returnCode=$? 

この例では、wcは決して失敗しません。さもなければ、wcの終了ステータスが得られます。

この仮定に依存しない別の方法:

set +o pipefail 
lineCount=$(foo | wc -l ; exit "${PIPESTATUS[0]}") 
returnCode=$? 
+0

+1とても素敵な答え。 –

+0

私はその2番目の方法がとても好きです。パイプ波がスクリプトの初期に設定されていないと仮定すると、set + o pipefailは省略できます。 – orangejulius

+0

@ spectre256:はい、「pipefail」は必須ではないということを強調するために追加しました。 – Philipp

1

Eleganter、まだぎこちない:

{ read lineCount; read returnCode; } < <(foo | wc -l; echo ${PIPESTATUS[0]}) 

あなたは出力が巨大であることを期待していない場合、私はちょうどそれをキャプチャし、それで作業したい:

output=$(foo) 
returnCode=$? 
lineCount=$(wc -l <<< "$output") 
関連する問題