`exec {STDIN}>&0`은 무엇을 합니까? [복사]

`exec {STDIN}>&0`은 무엇을 합니까? [복사]

나는 이것을 bash 스크립트에서 보고 이해하려고 노력했습니다.

exec {STDIN}>&0
exec {STDOUT}>&1
exec {STDERR}>&2

Bash 스크립트의 지시문은 다른 "마법 문자열"을 인식합니까 {STDIN}?{STDOUT}exec

&1STDOUT이 이미 (그리고 STDERR은 &2,...) 로 설정되어 있지 않습니까 ?

이 줄은 무엇을 합니까?

답변1

에서 man bash:

리디렉션

셸에서 해석되는 특수 기호를 사용하여 명령을 실행하기 전에 명령의 입력과 출력을 리디렉션할 수 있습니다. [...]

각 리디렉션 앞에는 파일 설명자 번호가 올 수 있지만 다음 형식의 단어가 앞에 올 수도 있습니다.{변수 이름}. 이 경우 >&- 및 <&-를 제외한 각 리디렉션 연산자에 대해 쉘은 10보다 크거나 같은 파일 설명자를 할당하고 이를변수 이름. >&- 또는 <&-가 앞에 오는 경우{변수 이름}, 의 가치 변수 이름닫힐 파일 설명자를 정의합니다.

귀하의 예에서 몇 줄 :

exec {STDIN}>&0
exec {STDOUT}>&1
exec {STDERR}>&2

현재 설명자 0, 1, 2와 중복되는 세 개의 새 파일 설명자를 할당하고 이러한 새 설명자의 값을 각각 쉘 변수 $STDIN, $STDOUT및 에 할당하는 효과가 있습니다 $STDERR. 이 명령을 실행한 후에는 중복된 설명자의 값을 볼 수 있어야 합니다.

$ echo $STDIN $STDOUT $STDERR
10 11 12

이렇게 하는 가장 가능성 있는 이유는 스크립트가 설명자 0, 1, 2를 스크립트의 일부에 필요한 다양한 위치로 자유롭게 리디렉션할 수 있도록 stdin, stdout 및 stderr의 현재 구성을 저장한 다음 복원하는 것입니다. 자신의 위치로. 초기 목표는 다음을 수행하는 것입니다.

exec 0>&$STDIN
exec 1>&$STDOUT
exec 2>&$STDERR

관련 정보