POSIX 쉘 스크립트 함수에서는 exec 1>&2를 사용하십시오. 다른 io 리디렉션을 방해합니까?

POSIX 쉘 스크립트 함수에서는 exec 1>&2를 사용하십시오. 다른 io 리디렉션을 방해합니까?

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/filestderr도 실행됩니다 /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/nullstderr도 리디렉션됩니다. 그래서저것특정 exec줄은 이러한 명령에 영향을 주지 않습니다.

관련 정보