종료 코드가 0이 아닌 경우 출력을 억제


19

프로그램이 0이 아닌 코드로 종료되지 않는 한 출력 (stdout 및 stderr)을 억제하는 가장 좋은 방법은 무엇입니까? 나는 생각 중입니다:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}

그리고 실행 quiet_success my_long_noisy_script.sh하지만 더 좋은 방법이 있는지 확실하지 않습니다. 다른 사람들이해야 할 일이라고 생각합니다.

맥락 상, 나는 이것을 cron 스크립트에 추가하여 실패했을 때 모든 것이 이메일로 전송되도록하고 싶습니다.


이것은 대부분의 명령의 기본 동작이어야합니다 (성공시 출력 없음). 그렇지 않은 경우 가장 먼저해야 할 일은 그러한 동작을 가능하게하는 옵션 / 스위치를 찾는 것입니다. 실패하면, 당신의 접근법은 올바른 생각입니다. 참고 사항 : 의사 코드는 실제로 유효한 sh구문 이 아니기 때문에 의사 코드를 게시 한 것으로 가정 하고 리디렉션 순서가 거꾸로되었습니다 ( > "$file" 2>&1더 많은 따옴표를 사용하십시오).
jw013

네, 방금 질문에 입력했습니다. 귀하의 제안을 적용, 나는 명령이 동의 해야 하는 책임이 있지만, 슬프 도다 ...
dimo414

구문 참고 사항 : 명령 주위에 괄호가 필요하지 않습니다.
manatwork

답변:


14

종료 코드가 무엇을해야하는지 알기 위해 기다려야하므로 출력이 무엇이든 상관없이 출력을 버퍼링해야합니다. 이와 같은 것이 아마도 가장 쉬운 것입니다.

$ output=`my_long_noisy_script.sh 2>&1` || echo $output

set -o xtrace쉘 스크립트에서 사용 하면 할당의 세부 정보를 기록하는 과정에서 모든 출력이 다시 나타납니다 output=...:-). 이 경우 아마을 사용하는 것이 좋습니다 chronic.
Jan-Philip Gehrcke

11

moreutils패키지는 프로그램에 포함 chronic이 목적을. 당신은 그냥 이렇게 호출

chronic my_program args ...

크론 작업에 매우 편리합니다.


3
명령이 0이 아닌 코드로 존재하지 않거나 표준 오류 출력을 생성 하지 않는 한 출력을 억제하는 유사한 프로그램 인 나와 같은 실수 chronic를 하지 마십시오 . cronic
Witiko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.