다음과 같은 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 $?