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

또한 이 스크립트를 실행하는 사용자 정의 애플리케이션이 있습니다. 애플리케이션은 표준 출력과 표준 오류를 캡처합니다. 표준 출력은 비어 있고 표준 오류에는 제공된 텍스트가 포함되어 있습니다. 여태까지는 그런대로 잘됐다. 하지만 콘솔(물리적 터미널)에서 스크립트를 실행하면 다음과 같습니다.

./my_script.sh

디스플레이에 아무것도 인쇄되지 않을 것으로 예상했지만 인쇄되었습니다. , >&2등 다양한 리디렉션 조합을 시도했지만 >/dev/stderr결과는 동일합니다. 또한 stdout을 null로 리디렉션하려고 시도했지만 1>&2 >/dev/null분명히 내 텍스트도 null로 보냅니다.

이것은 어디에 구성되어 있나요? 터미널에 stderr 표시를 중지하려면 어떻게 해야 합니까?

답변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

관련 정보