POSIX 쉘 스크립트를 작성 중입니다.
다음과 같이 (거의) 모든 출력을 표준 오류 스트림으로 리디렉션하는 기능이 있습니다.
# print something to stderr
printf "..." $var 1>&2
누군가 다음을 사용하여 모든 함수의 출력을 리디렉션하는 방법이 있다고 나에게 지적했습니다.
# redirect all output to standard error stream
exec 1>&2
이 줄을 함수 시작 부분에 유지하세요.
다른 리디렉션이 없다면 아마도 동의하겠지만 색상 지원 테스트가 있습니다.
# check if we have color support
if command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1
기본적으로 어떻게 작동하는지 모르겠고 exec
, 지금 당장은 너무 많은 세부 사항을 알 필요도 없고, exec
이 선이 위의 색상 지원 테스트를 방해하는지만 알면 됩니다.
답변1
exec <redirection>
현재 셸(또는 하위 셸)의 I/O 스트림을 리디렉션합니다. 쉘 시작 명령은 쉘의 I/O 스트림을 상속하므로 이러한 리디렉션은 맨 위에 적용된 명령별 리디렉션으로 명령에 영향을 미칩니다.
따라서 다음과 같습니다.
exec >/some/file 2>&1
foo >/another/file
- 그 후에
exec
는 쉘의 stdout이 실행되고/some/file
stderr도 실행됩니다/some/file
. - foo가 시작되면 쉘은 foo의 stdout을 로 리디렉션
/another/file
하지만 stderr은 변경되지 않은 채 상속되어 로 리디렉션됩니다/some/file
.
다음 명령 중:
command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1
상속된 stdout/stderr 스트림을 전혀 사용하지 않습니다. 먼저 stdout이 로 리디렉션되고 /dev/null
stderr도 리디렉션됩니다. 그래서저것특정 exec
줄은 이러한 명령에 영향을 주지 않습니다.