私は次のような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は、最初のstdinを取得するとすぐに終了するプログラムです。
はい、grep -vz
を使用して実行できます。これにより、grep
に、指定したパターンに一致しない行を検索し(-v
)、イオンプット全体を一度に読み取ることができます(z
)、つまり1つの一致は、すべてが失敗することを意味します。
$ 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/'
echo 'if stdout/stderr matches this' |
awk '$0 ~ "if stdout/stderr matches this" { exit 1; }' ; echo $?
@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"