bash 스크립트에서 stderr 메시지 억제


48

다음과 같은 (약간 어리석은) 스크립트 이름 'test1.sh'를 고려하십시오.

#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep

내가 그것을 실행할 때, 나는 메아리의 출력뿐만 아니라 stderr에서 수면의 죽음에 대한 bash의보고를 얻습니다.

$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5:  3551 Terminated              sleep 10

이 경우 stderr에 대한 출력을 억제하고 싶습니다. 명령 줄에서 다음과 같이 할 수 있다는 것을 알고 있습니다.

$ ./test1.sh 2> /dev/null

...하지만 스크립트 에서 그것을 억제하는 방법이 있습니까? (나는 그것을 두 번째 스크립트로 싸서 래퍼로 리디렉션 할 수 있다는 것을 알고 있지만 더 쉬운 것이 있어야합니다 ...)


pkill 수면 후 리디렉션 2> / dev / null을 추가하려고 했습니까?
rahul

@rahul : 그렇습니다. pkill이 메시지를 생성하지 않습니다, bash는.
fearless_fool

나는 pkill 대신 kill을 사용했고 stderr을 얻지 못했습니다.
rahul

@rahul : 내장 된 것이 아닌 내장 된 것일 수 있습니까? pkill도 사용해 보셨습니까?
fearless_fool

네, 믿습니다. pkill과 동일한 오류가 발생하지만 kill과는 다릅니다. kill을 사용하는 동안 proc 이름 대신 pid를 사용했습니다.
rahul

답변:


72

네가 옳아; pkill은 메시지를 생성하지 않고 bash는 생성합니다. 당신은 제안

$ ./test1.sh 2> /dev/null

가능한 해결책입니다. UVV가 지적했듯이 스크립트 내에서 동등한 작업은

exec 2> /dev/null

스크립트 /dev/null 가 다시 변경 될 때까지이 명령문에서 스크립트의 stderr를 경로 재 지정합니다 . 다시 바꾸는 서투른 방법은 다음과 같습니다.

exec 2> /dev/tty

stderr을 터미널로 리디렉션합니다. 이것은 아마도 원래 위치 일 것입니다.

또는

exec 2>&1

stderr을 stdout과 동일하게 설정하고 잘못되었을 수 있습니다.

보다 안정적인 방법은

exec 3> & 2
exec 2> / dev / null
(stderr를보고 싶지 않은 곳에하라.) 
exec 2> & 3

원래 stderr을 파일 설명자 3에 저장하고 나중에 복원합니다.

프로세스 사망 발표 만 억제하는 다른 방법은 다음과 같습니다.

(sleep 10 & pkill sleep) 2> /dev/null

{ sleep 10 & pkill sleep;} 2> /dev/null

그룹화 된 명령에 대해서만 stderr을 변경합니다.


이것은 매우 훌륭하고 자세한 답변입니다. 감사합니다!
Keenan Lawrence

새 파일 디스크립터 저장 stdinstderr새 파일 디스크립터 저장 및 /dev/null복원 과 관련하여 위험이 있습니까?
Alexej Magura

글쎄, 당신이 (당신에게 알려지지 않은) 파일 디스크립터 3 (또는 4)에 쓴 프로그램을 실행하면 정상적인 상황에서 그 작업이 실패 할 것이라고 생각합니다. 그러나 실패를 무시하고보고하지 않고 계속 진행하도록 프로그램을 작성할 수 있습니다. 그때 당신은 알지 못할 것입니다. 그러나 파일 설명자 1 (또는 2)이 파일 설명자 3 (또는 4)에 "주차"된 경우 해당 프로그램이 갑자기 스크립트의 stdout 또는 stderr에 기록됩니다. 그러나 이것은 매우 고안된 예이며 여전히 최소한의 위험입니다. 마음에 뭔가 있나요?
Scott

1
FWIW, 내가 즉 스콧의 그룹화 명령 방식을 선호{ sleep 10 & pkill sleep;} 2> /dev/null
fearless_fool

9

에 따르면 당신은 다음과 같은 일을 할 수 있습니다 :

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