Bash 스크립팅 프로젝트의 경우 사람이 읽을 수 있는 로그 메시지를 stdout/stderr에 작성합니다. 또한 기본적으로 삭제되지만 파이프라인 처리를 위해 리디렉션될 수 있는 세 번째 스트림에 형식이 지정된 지표를 쓰고 싶습니다. 이를 위해 추가 파일 설명자를 사용하는 것이 권장됩니까?
exec 3> /dev/null
echo "This is stdout"
echo "This is stderr" >&2
echo "This is fd3" >&3
정상적인 상황에서는 세 번째 행이 표시되지 않는다는 점에 동의합니다. 그러나 특정 툴체인 내에서 사용될 때 이러한 메시지를 파이프하고 싶습니다. 간단한 예:
$ bash example.sh 3>&1
This is stdout
This is stderr
세 번째 줄은 콘솔 출력으로 표시되지 않습니다.
내가 뭘 잘못했나요? 이에 대한 해결 방법이 있나요? 권장되는 다른 접근 방식이 있나요?
답변1
Fd 3은 /dev/null
첫 번째 줄에 바인딩되어 있으므로 세 번째 Echo는 필연적으로 표준 출력을 /dev/null
.
대신 Fd3이 있는지 확인하여 Fd3이 할당되었는지 확인하세요 /proc/self/fd/3
. 그렇지 않은 경우 에 바인딩하십시오 /dev/null
. 그렇다면 그대로 두십시오.
[ -e /proc/self/fd/3 ] || exec 3> /dev/null
echo "This is stdout"
echo "This is stderr" >&2
echo "This is fd3" >&3
$ ./example.sh 3>&1
This is stdout
This is stderr
This is fd3
$ ./example.sh
This is stdout
This is stderr
세 번째 Echo가 실제로 많은 출력을 작성하는 명령인 경우 Fd 3이 켜져 있을 때만 명령을 트리거하는 것이 더 효율적인 대안이 될 것입니다.
echo "This is stdout"
echo "This is stderr" >&2
[ -e /proc/self/fd/3 ] && echo "This is fd3" >&3
또 다른 가능성은 항상 Fd 3을 통해 파일이나 FIFO로 리디렉션하고 호출 중에 필요할 때만 읽는 것입니다. 그러나 이는 해당 출력이 사용되지 않으면 불필요한 시간 손실을 의미합니다.