Bash 스크립트를 stderr로 리디렉션해도 여전히 stdout으로 출력되는 이유는 무엇입니까?

Bash 스크립트를 stderr로 리디렉션해도 여전히 stdout으로 출력되는 이유는 무엇입니까?

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

관련 정보