以下の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
}
これはこの答えの最初のコードと同じですが、grep
今mongo
。
答え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 $?