18

コマンドの出力とエラーを bash スクリプトで取得し、コマンドが成功したかどうかを知る必要があります。

現時点では、次のように両方をキャプチャしています。

output=$(mycommand 2>&1)

次に、mycommand の終了値を確認する必要があります。失敗した場合は、出力に対して何かを行う必要があります。コマンドが成功した場合は、出力に手を加える必要はありません。

出力をキャプチャしているので、$? をチェックします。bash が変数への出力のキャプチャに成功したため、常に 0 です。

これは非常に時間に敏感なスクリプトであるため、ファイルへの出力と再読み込みなどの遅い解決策を回避しようとしています。

stdout をある変数にキャプチャし、stderr を別の変数にキャプチャできれば、エラー変数が空かどうかを確認するだけで問題が解決します。

ありがとう。

4

2 に答える 2

11

のどのバージョンbashを使用していますか? 私のバージョンでは、出力のキャプチャはリターン コードにまったく4.1.5影響しません。

pax> false; echo $?
1
pax> echo $?
0
pax> x=$(false 2>&1) ; echo $?
1

エラーを検出するために標準エラーが空でないことに依存することは、常に良い考えではありません。多くのプログラムはエラーを出力せず、リターン コードのみに依存しています。

于 2010-09-03T02:19:24.440 に答える
10

この問題は、出力が関数内のローカル変数にキャプチャされた場合にのみ発生するようです。

$ echo $BASH_VERSION
3.2.48(1)-release
$ false; echo $?
1
$ echo $?
0
$ x=$(false 2>&1) ; echo $?
1
$ function f {
> local x=$(false 2>&1) ; echo $?
> }
$ f
0
$ function g {
> x=$(false 2>&1) ; echo $?
> }
$ g
1

xをローカルにキャプチャする関数fのみが動作を表現できることに注意してください。特に、同じことを行うが「local」キーワードがない関数gは機能します。

したがって、ローカル変数を使用することはできず、使用後に「設定解除」する可能性があります。

EDIT NVRAMは、問題を回避するためにローカル宣言を事前に行うことができると指摘しています。

$ function h {
>   local x
>   x=$(false 2>&1) ; echo $?
> }
$ h
1
于 2011-01-21T23:21:42.640 に答える