2017-03-23 29 views
0

入力から各行を読みたい。各行はwhileループで正常に読み込まれます。しかし、ループはステータス1で終了します。bash読み取りライン終了1

$ incr=0 
$ while IFS='' read -r line || [[ -n "$line" ]] ; do  
    incr=$((incr+1));  
    echo "$incr: $line"; 
done < <(echo -e "one \ntwo\tthree\nfour") 
1: one 
2: two three 
3: four 

$ echo "status ${PIPESTATUS[@]}" 
status 1 

終了ステータスが0以外の理由は何ですか。

答えて

1

1は、最初にwhileループが終了する原因となったコマンド([[ -n "$line" ]])の終了ステータスのようです。これはbashのバグ、またはコマンドが$?PIPESTATUSの間で設定されている、文書化されていない相違点のバグである可能性があります。

あなたがはるかに簡単なコマンドで同じ違いを観察することができます。

$ while false; do echo foo; done 
$ printf '%s\n' "$?" "${PIPESTATUS[@]}" 
0 
1 
+0

あなたは、whileループは常に0とは異なる状態で終了することを意味するのですか?私はちょうどそれに気づいた。あなたが少なくとも一度それを入力し、休憩で終了しない限り。 – kaligne

+0

manページから: "exit whileとuntilコマンドのステータスは、実行された最後のdo listコマンドの終了ステータスです。実行されなかった場合は、ゼロ が実行されていません。 (ここでは 'list'はループの本体です)。 'PIPESTATUS'は代わりに* condition *の終了ステータスを取得するように見えますが、それがバグか文書化されていない期待であるかどうかはわかりません。 – chepner

関連する問題