오류가 없으면 출력없이 백그라운드에서 명령을 실행하는 방법


14

명령의 출력을 억제하지만 명령 종료가 오류를 코드로 표시하는 방법은 무엇입니까?

답변:


17

불행히도, stderr오류 출력에만 사용되는 가정이 항상 올바른 것은 아닙니다. 오히려, stderr종종 모든 대화식 출력 및 진단, 즉 사용자가 대화식 프롬프트에서 읽도록 의도 된 출력에 사용됩니다 1 . wgetdd사례를 잘 알려져있다.

일부 명령은 오류가 아닌 출력을 억제 하는 플래그 (예 : -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 &하십시오 (후행으로 &인해 백그라운드에서 실행됩니다)

이 원래의 종료 코드를 삼킬 것이며, 모두 덤프합니다 stdoutstderr장애 발생. 필요에 따라 사용자 정의 할 수 있습니다.


1 오류 출력이 나타나지 않는다는 보장조차 없습니다. stdout일부 프로그램은 모든 출력을 덤프합니다!

2 불행히도, 이것은 여전히 ​​그렇습니다. 종료 코드는 프로그램에 의해 완전히 제어되며 일부는 0이 아닌 종료와 함께 일부 성공 조건을 나타냅니다. 다시 매뉴얼을 확인하십시오.


약간의 물고기 조정, ~ / .config / fish / functions /에 기능을 넣을 수있는 특별한 장소가 있습니다.
Xster

12

유닉스 유틸리티는에 일반 메시지를 보내고에 stdout오류 메시지를 보내 stderr므로 오류 메시지 만 보려면 콘솔에 출력 stdout만 표시 되도록 억제 하면 충분합니다 stderr.

(모두에서이 작업을 수행하는 방법 bash과는 fish) 추가하는 >/dev/null명령에. 이 파이프는 stdout을 무관으로 연결하지만 stderr (오류 메시지와 함께)는 여전히 콘솔로 전달됩니다.

예를 들어 :

echo 1 >/dev/null정상 stdout출력이 억제되고 stderr에 아무것도 기록되지 않았 으므로 명령 은 아무것도 인쇄하지 않습니다 .

이 명령 man doesnotexist >/dev/null은 오류 메시지를에 man기록하므로 오류 메시지를 인쇄합니다 stderr.


2

백그라운드에서 명령을 실행하고 정상 출력을 무시하면서 오류를 로그 파일에 기록합니다.

    command > /dev/null 2> /tmp/example_error.log &
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.