Bash 스크립트가 있습니다.
#!/bin/bash
echo this should be visible only in the stderr output but it is not 1>&2
exit 0
또한 이 스크립트를 시작하는 사용자 정의 앱이 있습니다. 이 앱은 stdout과 stderr을 모두 캡처합니다. stdout은 비어 있고 stderr에는 제공된 텍스트가 포함되어 있습니다. 여태까지는 그런대로 잘됐다. 하지만 콘솔(물리적 터미널)에서 스크립트를 시작하면 다음과 같습니다.
./my_script.sh
디스플레이에 아무 것도 인쇄되지 않을 것으로 예상했는데 인쇄됩니다. >&2
, 등 다양한 리디렉션 조합을 시도했지만 >/dev/stderr
결과는 동일합니다. 또한 stdout을 null로 리디렉션하려고 시도했지만 1>&2 >/dev/null
분명히 내 텍스트도 null로 전송됩니다.
이것은 어디에 구성되어 있나요? 터미널에 표준 오류가 표시되지 않도록 하려면 어떻게 해야 합니까?
답변1
스크립트가 표준 오류 스트림을 터미널로 보내는 것을 중지하려면 해당 스크립트를 /dev/null
파일로 리디렉션해야 합니다.
명령줄에서 리디렉션된 표준 오류 스트림을 사용하여 스크립트를 호출하거나 스크립트 자체가 오류 스트림을 리디렉션하도록 하여 이를 수행합니다.
/dev/null
명령줄에서 오류 스트림을 리디렉션하려면 다음을 사용하여 스크립트를 호출합니다.
./my_script 2>/dev/null
스크립트가 표준 오류 스트림을 자동으로 삭제하도록 하려면 스트림을 /dev/null
스크립트 내로 리디렉션하세요.
#!/bin/bash
# Discard any diagnostic output, errors, and interactive prompts.
exec 2>/dev/null
echo 'This should not be visible.' >&2
echo 'This should be visible.'
/dev/null
대신 진단 출력을 해당 파일에 전달하려면 파일의 경로 이름을 변경하십시오 .
표준 출력 스트림은 표준 오류 스트림을 /dev/null
파일로 리디렉션해도 영향을 받지 않습니다.
스크립트는 일반적으로 에 의해 종료되어서는 안 됩니다 exit 0
.
답변2
이 특정 스크립트가 표준 출력을 삭제하도록 하려면:
주어진 스크립트:
date
date -r /var/empty/foo
편집하여그룹 명령. 이러한 방식으로 명령을 그룹화하면 결합된 명령의 표준 출력 및 표준 오류 스트림이 그룹이 논리적으로 단일 명령인 것처럼 처리(리디렉션, 파이프, 폐기 등)될 수 있습니다.
예를 들어:
{
date
date -r /var/empty/foo
} > /dev/null
표준 출력을 폐기하지만 표준 오류 스트림의 라우팅을 변경하지는 않습니다.
다음 스크립트:
{
date
date -r /var/empty/foo
} > /dev/null 2>&1
표준 출력을 /dev/null로 리디렉션한 다음 표준 오류를 표준 출력으로 리디렉션하여 stderr과 stdout을 모두 삭제합니다. 해당 특정 구문은 다음과 같습니다.
{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null