2016-05-16 7 views
0
someCommand 2>&1 | grep pattern & 

終了ステータスを取得するにはどうすればいいですか?someCommandパイプバックされたバックグラウンドプロセスの終了コードを取得する

PIPESTATUSバックグラウンドプロセスであるため、動作しません(または使用方法がわかりません)。

私はこれを見つけましたlinkと私はそれを正確にそのように使用する場合にのみ動作するようです。シンプルechoが画面に表示されない場合があります。一時ファイルを作成せずに終了コードを取得することが可能かどうか疑問に思っていました。あなたができるbashで

+0

表示しています '待機しても動作しません。 –

答えて

4

echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}" 

例:

を:スクリプトの場合は

$ ls -l | grep somefile 
-rw-rw-r-- 1 me me  32 May 4 15:47 somefile 
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}" 
0 0 

$ ls -l 1>/dev/null | grep while 
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}" 
0 1 

パイプで連結されたフォアグラウンド・プロセスのために

が含まれているtestscript.sh言います

#!/bin/bash 
echo "Some Stuff" 
exit 29 # Some random exit code for testing 

方法1

を処理パイプで連結された背景については

$./testscript.sh | grep somestuff 
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}" 
29 1 

を行います含まれtestscript.shについてpipefail

を使用する:

#!/bin/bash 
set -eo pipefail 
#set -o pipefail causes a pipeline to produce a failure return code 
#If a command fails, set -e will make the whole script exit, 
cat nonexistingfile # this command fails 
echo "Some Stuff" 
exit 29 

を実行します。
$ ./testscript.sh 2>/dev/null | grep Some & 
[2] 7684 
$ fg 2 
bash: fg: job has terminated 
[2]- Exit 1   ./testscript.sh 2> /dev/null | grep --color=auto Some 

スクリプトが失敗したと判断した終了ステータス1が表示されます。

cat nonexistingfileは、あなたが持っているでしょう削除されていた:

[2]- Done     ./37257668.sh 2> /dev/null | grep --color=auto Some 

Disdvantage:pipefailは

方法を失敗したコマンドに固有ではないすべての終了コードのための1つを返します。 2:ソースシェルスクリプト

$ . ./testscript.sh 2>/dev/null | grep Some & #mind the dot in the beginning 
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}" 
29 0 

最後の仕上げ

シェルスクリプトで失敗する単一のコマンドが疑われる場合は、テストスクリプトは、あなたは以下を行うことができます:

#no shebang 
echo "Some Stuff" 
ls non_existent 2>/dev/null || ls__return_value=50 

はどのような方法で

$. ./testscript | grep "Some" 

$if [ $ls__return_value -eq 50 ]; then echo "Error in ls"; fi 
+0

私の質問をお読みですか?私はバックグラウンドプロセスのあるケースについて質問しており、その場合は 'PIPESTATUS'は動作しないと書いています。 – NPS

+0

@NPS:更新されました。 – sjsam

+0

ここで終了コードを取得するにはどうすればよいですか?スクリプトが '29'を返す場合、それは' Exit 29'の代わりに 'Done'を表示します。 – NPS

関連する問題