web-dev-qa-db-ja.com

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は、最初のstdinを取得するとすぐに終了するプログラムです。

2
Alexander Mills

はい、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/' 
4
terdon
echo 'if stdout/stderr matches this' |
    awk '$0 ~ "if stdout/stderr matches this" { exit 1; }' ; echo $?
1
Hauke Laging

@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"
0
Alexander Mills