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

다음과 같은 (약간 어리석은) 스크립트 이름 ‘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을 변경합니다.


답변

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

#!/bin/bash
exec 2>/dev/null
ls -al test


답변