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
}

이는 이 답변의 첫 번째 코드와 동일하지만 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 $?

관련 정보