다음과 같은 (약간 어리석은) 스크립트 이름 ‘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은 메시지를 생성하지 않고 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을 변경합니다.