다음 (다소 어리석은) 스크립트 이름 "test1.sh"를 고려하십시오.
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
이것을 실행하면 echo 출력을 얻을 뿐만 아니라 stderr에서 bash의 수면 종료에 대한 보고서도 얻습니다.
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
이 경우 stderr에 대한 인쇄 출력을 억제하고 싶습니다. 나는 명령줄에서 다음과 같이 이 작업을 수행할 수 있다는 것을 알고 있습니다.
$ ./test1.sh 2> /dev/null
...하지만 억제할 수 있는 방법이 있나요?이내에스크립트? (두 번째 스크립트로 래핑하고 래퍼가 이를 리디렉션하도록 할 수 있다는 것을 알고 있지만 더 간단한 방법이 있어야 합니다...)
답변1
당신 말이 맞습니다. 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과 동일하게 설정하며, 틀릴 수도 있습니다.
좀 더 확실한 방법은
3>&2를 실행 실행 2> /dev/null (stderr에서 보고 싶지 않은 일을 하십시오.) 2>&3을 실행
파일 설명자 3에 원본 stderr을 저장한 다음 복원합니다.
프로세스 종료 알림을 억제하는 다른 방법은 다음과 같습니다.
(sleep 10 & pkill sleep) 2> /dev/null
그리고
{ sleep 10 & pkill sleep;} 2> /dev/null
그룹화된 명령에 대해서만 stderr을 변경합니다.
답변2
~에 따르면이것다음을 수행할 수 있습니다.
#!/bin/bash
exec 2>/dev/null
ls -al test