답변:
불행히도, stderr
오류 출력에만 사용되는 가정이 항상 올바른 것은 아닙니다. 오히려, stderr
종종 모든 대화식 출력 및 진단, 즉 사용자가 대화식 프롬프트에서 읽도록 의도 된 출력에 사용됩니다 1 . wget
및 dd
사례를 잘 알려져있다.
일부 명령은 오류가 아닌 출력을 억제 하는 플래그 (예 : -quiet
또는 -silent
)를 제공 합니다. 해당 매뉴얼 페이지를 읽고 존재하는지 확인하십시오.
더 자주 유지되는 또 다른 규칙은 종료 코드입니다 . 프로그램은 종료시 종료 코드를 반환합니다. 일반적으로 2 의 종료 코드 0
는 성공 을 나타내고 다른 종료 코드는 오류를 나타냅니다.
을 사용 bash
하면 $?
변수 에서 마지막 명령의 종료 코드를 얻을 수 있습니다 . 에서 fish
의 사용 $status
변수를. stderr
임시 파일로 파이프 하고 오류가 발생한 경우에만 인쇄 할 수 있습니다 . 예를 들어 ( fish
) :
command 2>/tmp/outputbuffer
if $status
cat /tmp/outputbuffer
rm /tmp/outputbuffer
명령을 연결하지 않은 경우 바로 가기를 사용할 수도 있습니다.
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
또는:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
stdout
을 사용하여 동일한 버퍼로 파이프 할 수도 있습니다 2>&1 >/tmp/outputbuffer
.
(참고 : 나는 실제로 모른다 fish
. 그래서 나는 문서에서 찾을 수있는 것에 개념을 적용하고있다. 구문은 약간 잘못되었을 수도있다. 또한, 당신은 mktemp
고유 한 임시 파일을 생성하는 데 사용할 수있다 -그것을 실행하고 기록 변수의 파일 이름.)
쉘의 백그라운드에서 전체를 실행해야하며 동시에 대화식으로 사용하는 경우 출력 숨김을 처리하고 표준 기술을 사용 하여 백그라운드에서 해당 스크립트를 실행하는 스크립트를 작성하는 것이 좋습니다 ( fish
). 도대체 다음과 같은 기능을 넣을 수 있습니다 ~/.config/fish/config.fish
.
function run-silent
set temp (mktemp)
if $argv 2>&1 >$temp
cat $temp
rm $temp
end
와 함께 전화 run-silent somecommand &
하십시오 (후행으로 &
인해 백그라운드에서 실행됩니다)
이 원래의 종료 코드를 삼킬 것이며, 모두 덤프합니다 stdout
및 stderr
장애 발생. 필요에 따라 사용자 정의 할 수 있습니다.
1 오류 출력이 나타나지 않는다는 보장조차 없습니다. stdout
일부 프로그램은 모든 출력을 덤프합니다!
2 불행히도, 이것은 여전히 그렇습니다. 종료 코드는 프로그램에 의해 완전히 제어되며 일부는 0이 아닌 종료와 함께 일부 성공 조건을 나타냅니다. 다시 매뉴얼을 확인하십시오.
유닉스 유틸리티는에 일반 메시지를 보내고에 stdout
오류 메시지를 보내 stderr
므로 오류 메시지 만 보려면 콘솔에 출력 stdout
만 표시 되도록 억제 하면 충분합니다 stderr
.
(모두에서이 작업을 수행하는 방법 bash
과는 fish
) 추가하는 >/dev/null
명령에. 이 파이프는 stdout을 무관으로 연결하지만 stderr (오류 메시지와 함께)는 여전히 콘솔로 전달됩니다.
예를 들어 :
echo 1 >/dev/null
정상 stdout
출력이 억제되고 stderr에 아무것도 기록되지 않았 으므로 명령 은 아무것도 인쇄하지 않습니다 .
이 명령 man doesnotexist >/dev/null
은 오류 메시지를에 man
기록하므로 오류 메시지를 인쇄합니다 stderr
.