2017-09-02 3 views
1

別のコマンドの戻り値に基づいて、条件付きでgnuメイクファイルでコマンドを実行したいと思います。シェルパイプラインから真を返す

lsmod | grep -q pfc && sudo rmmod pfc 

lsmodによって出力として、モジュールの現在のリストがpfcが含まれている場合は、それを削除します。

は次のようなもの、具体的には。これは、 grepコマンドが失敗した場合(モジュールが存在しない場合)、パイプライン全体がゼロ以外の値を返し、コマンドが失敗と解釈されるという小さな問題を伴いますが、実際はこれが成功しています。

私は最後に; trueを追加するだけで、常に成功させることができますが、rmmodコマンドの失敗をキャッチしません!

私はshの実装でほとんど移植可能ですが、技術的には私がdashを使用していると思いますので、それはshがUbuntuを指しているからです。

+0

編集:提案された
単純にNOPのは次のようになります。特に 'rmmod'が失敗した場合、falseを返すが、上記はtrueを返す。 – BeeOnRope

+0

これは、 'set -e'を使用している場合にのみ問題になります。これは、ゼロ以外の終了ステータスがエラーを示していると仮定しているため、悪い考えです。 – chepner

+0

@chepner - 私は 'set -e'を使用していませんが、呼び出しアプリケーション(' gmake')はゼロ以外の戻り値をエラーとして扱います。 – BeeOnRope

答えて

4

は、あなただけのecho -nのようにNOPコマンドで終了値を洗浄することにより期待される失敗を扱うことができる:

if lsmod | grep -q pfc; then sudo rmmod pfc; else echo -n; fi 

は、出力はNOPコマンドが実行され、行全体が$?=0で返している行方不明にする必要があります。そのパイプラインがtrueを返す_unconditionally_ので

if lsmod | grep -q pfc; then sudo rmmod pfc; else true; fi 

RESP

if lsmod | grep -q pfc; then sudo rmmod pfc; else :; fi 
+3

'true'や': 'のような簡単なnopがあります。 – nobody

+1

[標準に準拠しているシェルの場合、nopはまったく必要ありません](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_07) –

+0

@ dave_thompson_085 bashは受け入れません空のelseブランチ – yacc

関連する問題