2016-11-18 22 views
0



私はBashを使ってアクションを自動化すると、UNIXコマンドの戻り値を使って次のようなことをテストすることがよくあります:ファイルに文字列がある(grep)か、プロセスが実行中(ps aux + grep) 。

これは例ですが、grepは一致するものがない場合は1を返し、少なくとも1つの結果がある場合は0を返します。bashリターンコードを使用してプログラムするのは良い方法ですか?

$ ps aux | grep process_that_doesntexist | grep -v grep 
$ echo $? 
1 
$ ps aux | grep init | grep -v grep 
root   1 0.0 0.1 135188 6660 ?  Ss 01:43 0:00 
$ echo $? 
0 

プログラミングの方法は悪いですか?このように書かれたbashスクリプトは実稼働サーバー上で実行する必要がありますか?

ありがとうございました。

+1

終了ステータスは、使用する方法とまったく同じです。 – chepner

+0

@chepner、理想的には、 '$? 'を参照するのではなく、条件付きで評価するのが理想的です。 –

+0

ところで、サービスの実行を確実にする責任があるソフトウェアを記述している場合は、[ProcessManagement](http://mywiki.wooledge.org/ProcessManagement)のセクション3.2を参照してください。 - ほぼすべてのオペレーティングシステムに組み込まれた専用のツールが用意されています。 –

答えて

3

psでグレープすることは適切ではありません。ご使用のオペレーティングシステムがそれを提供する場合は、代わりにpgrepを使用してください。

しかし、一般的には、終了ステータスを使用してgrepがコンテンツの照合に成功したかどうかを判断することは完全に適切です。代わりに、代わりにあなたの条件式の中で直接評価し、$?を参照の言ったこと、:

# When possible, do this: 
if grep -q -e value <input; then 
    echo "found value" >&2 
else 
    echo "did not find value" >&2 
fi 

...ではなく:

# ...not this: 
grep -q -e value <input 
if [ "$?" -eq 0 ]; then 
    echo "found value" >&2 
else 
    echo "did not find value" >&2 
fi 

これはまだ同じ効果を持っている - if COMMAND; then ...チェックの終了ステータスをCOMMAND - ただし、間接参照の余分な層はありません。

+0

ありがとう、それは私が期待していた答えのようなものです。 – avenetj

関連する問題