2017-01-07 16 views
-1

文字列にgrepを入力し、一致するものがある場合はフィールドを切り捨てます。問題は、一致するかどうかにかかわらず、コマンド$?の出力は0です。これは奇妙です。あなたが見ることができるように、試合があるパイプラインでコマンドのステータスを確認する

$ R=`grep g09 tor1.sh | cut -d ' ' -f2` 
$ echo $R 
test 
$ R=`grep g09 tor1.sh | cut -d ' ' -f2` 
$ echo $? 
0 

をしかし$? 0は今、この参照されています:以下の出力を参照してください。ここで

$ R=`grep g09 tor.sh | cut -d ' ' -f2` 
$ echo $R 

$ R=`grep g09 tor.sh | cut -d ' ' -f2` 
$ echo $? 
0 

を、G09のための一致はありませんが、$?はまだあります0なぜ?

答えて

5

$?は、終了ステータス全体または最終ステータスです。あなたが見なければならないのは、以下の名前のbash配列です。

これは、個々のパイプコマンドのステータスを提供します。だから場合の

は:

read str < <(grep g09 tor.sh | cut -d ' ' -f2`) 

echo ${PIPESTATUS[0]} 
1 

ここ1は、パイプラインの最初のgrepコマンドの失敗を意味しています。

PS:現在のシェルでPIPESTATUSを正しく設定できるように、コマンド置換の代わりにプロセス置換を使用していることに注意してください。

例:grepは何かを見つけるために失敗したときgrepの実行が成功し、したがって、我々は第二の例では0として${PIPESTATUS[0]}が、1を取得する最初の例では

read str < <(grep 'bar' <<< 'foo bar baz' | cut -d ' ' -f2) 
echo ${PIPESTATUS[0]} 
0 

read str < <(grep 'cat' <<< 'foo bar baz' | cut -d ' ' -f2) 
echo ${PIPESTATUS[0]} 
1 

+1

フォローアップの質問で@bishopが指摘したように、パイプラインがサブシェルで実行されているため、上記の '$ {PIPESTATUS [0]}'は正しい結果を得ません。あなたの例はそこに使用されているサブシェルがないので問題ありません。 – codeforester

+1

非常に良い点@codeforester。 '$ {PIPESTATUS [0]} 'を正しく得るためにプロセス置換を使う答えを修正しました。 – anubhava

関連する問題