grep - 終了 1 - 一致する場合

grep - 終了 1 - 一致する場合

以下のbash機能があります。

run_mongo(){
  mongo foo bar baz 2>&1  # send stderr to stdout
}

残念ながら、このmongoコマンドはエラーが発生した場合は1で終了しないため、stdout / stderrで一致させる必要があります。

最初の一致がある場合は、grepを使用してコード> 0で終了する方法はありますか?このような:

run_mongo | grep -e "if stdout/stderr matches this we exit with 1"

私が考える方法は次のとおりです。

run_mongo | grep -e "if stdout/stderr matches" | killer

Killerは、最初の標準入力を受け取るとすぐに終了するプログラムです。

答え1

はい、grep -vzこれを使用して、grep指定されたパターンと一致しない行を見つけて(-v)全体の入力を一度に読み取るように(z)一致すると、すべてが失敗することを意味するように指示できます。

$ printf 'foo\nbar\n' | grep -zqv foo && echo no || echo yes
yes
$ printf 'foo\nbar\n' | grep -zq foo && echo no || echo yes
no

したがって、あなたの場合は次のようになります。

run_mongo(){
  mongo foo bar baz 2>&1 | grep -vzq "whatever means failure" 
}

if run_mongo; then
 echo "Worked!"
else
  echo "Failed!"
fi

出力全体を読み取らない場合は、別のツールを使用してください。 Perlを例に挙げてみましょう。

mongo foo bar baz 2>&1 | perl -ne 'exit 1 if /whatever means failure/' 

答え2

より早く終了する必要がある場合:

run_mongo () {
    ! mongo foo bar baz 2>&1 | grep -q 'bad-pattern'
}

mongoこれはできるだけ早く実行され、出力でパターンが見つかると機能は終了します。bad-patternパターンが一致すると、grepすぐにシャットダウンし、mongoデッドパイプに書き込もうとするとすぐにPIPE信号を受け取ります。

その後、!パイプの終了状態は反転されます。つまり、パターンが見つからない場合は 0 になり、見つかった場合は 0 ではありません。

mongo出力書き込みを完了する必要がある場合:

run_mongo () {
    ! mongo foo bar baz 2>&1 | grep 'bad-pattern' > /dev/null
}

これはこの答えの最初のコードと同じですが、grepmongo

答え3

@terdonの解決策はよさそうです。私はNode.jsのファンなので、次のようなプログラムを書いています。

#!/usr/bin/env node

process.stdin.resume().once('data', function () {
   process.exit(1);
});

それから私のbashスクリプトには次のものがあります。

run_mongo(){
  mongo foo bar baz 2>&1
}

exit_if_match(){
    grep "$1" | "./node_modules/.bin/imminent_suicide"
}

run_mongo "foo" "bar" | exit_if_match "errmsg"

答え4

echo 'if stdout/stderr matches this' |
    awk '$0 ~ "if stdout/stderr matches this" { exit 1; }' ; echo $?

関連情報