>&N에서 N이 파일 이름이 아닌 파일 설명자로 처리되는 이유는 무엇입니까(설명서에서 말하는 것처럼)?

>&N에서 N이 파일 이름이 아닌 파일 설명자로 처리되는 이유는 무엇입니까(설명서에서 말하는 것처럼)?

Bash에서 IO 리디렉션을 이해하려고 합니다. 나는 아래와 같은 많은 예를 보았습니다(문자 그대로 허용된 답변에서 가져옴).여기):

exec 3<> /tmp/foo  #open fd 3.
echo "test" >&3
exec 3>&- #close fd 3.

두 번째 줄이 이해가 안 되네요. 정확하게 말하면 그 동작이 bash 매뉴얼을 어떻게 준수하는지 이해가 되지 않습니다.

분명히 두 번째 줄에는 파일 설명자 3으로의 >&3리디렉션이 있어야 합니다 stdout(아마도 stderr모르겠습니다). 다른 모든 것은 의미가 없습니다.

하지만현재 bash 매뉴얼(작성 당시) 섹션 3.6.4(내 형식 지정):

이 구조는 표준 출력(파일 설명자 1)과 표준 오류 출력(파일 설명자 2)을 허용합니다.파일로 리디렉션그의 이름은 단어의 확장입니다. 표준 출력과 표준 오류를 리디렉션하는 데는 두 가지 형식이 있습니다
&>word.>&word

[그런 다음 첫 번째 형식과 두 번째 형식의 미묘한 차이점을 설명하지만 이 질문에서는 중요하지 않으므로 지금은 따로 두겠습니다. ]

내가 이해한 바에 따르면 이는 파일 설명자로 리디렉션하는 것과는 매우 다른 이름의 파일로 >&3리디렉션하는 stderr것을 의미합니다.stdout3stdoutstderr3

누군가 내가 놓친 것을 설명해 줄 수 있습니까?

답변1

사실, 가장 관련성이 높은 부분은 옆으로 치워두는 부분입니다(GNU 배쉬 문서):

3.6.4 표준 출력 및 표준 오류 리디렉션

이 구조를 사용하면 표준 출력(파일 설명자 1)과 표준 오류 출력(파일 설명자 2)을 이름이 단어 확장된 파일로 리디렉션할 수 있습니다.

표준 출력과 표준 오류를 리디렉션하는 데는 두 가지 형식이 있습니다.

&>word 

그리고

>&word 

두 가지 형식 중 첫 번째 형식이 선호됩니다. 이는 의미상 다음과 동일합니다.

>word 2>&1 

두 번째 형식을 사용할 때 단어는 숫자나 "-"로 확장될 수 없습니다. 그렇다면 호환성 이유로 인해 다른 리디렉션 연산자가 적용됩니다(아래 파일 설명자 복사 참조).

이 마지막 요점이 가장 중요하므로 여기서 다시 반복하겠습니다.

두 번째 형식을 사용할 때 단어는 숫자나 "-"로 확장될 수 없습니다. 그렇다면 호환성 이유로 인해 다른 리디렉션 연산자가 적용됩니다(아래 파일 설명자 복사 참조).

따라서 word숫자 또는 로 확장 되면 특수 규칙이 트리거됩니다 -. 문자열은 자체적으로 확장되므로 3"확장"되었다고 합니다. 3이는 문자열이 >&3다음에 설명된 규칙에 따라 처리됨을 의미합니다.파일 설명자 부분 복사:

리디렉션 연산자

[n]<&word 

입력 파일 설명자를 복사하는 데 사용됩니다. 단어가 하나 이상의 숫자로 확장되면 n으로 표시되는 파일 설명자는 해당 파일 설명자의 복사본이 됩니다. 단어의 숫자가 입력을 위해 열린 파일 설명자를 지정하지 않으면 리디렉션 오류가 발생합니다. 단어가 "-"로 평가되면 파일 설명자 n이 닫힙니다. n을 지정하지 않으면 표준 입력(파일 설명자 0)이 사용됩니다.

운영자

[n]>&word 

사용법은 출력 파일 설명자를 복사하는 것과 유사합니다. n을 지정하지 않으면 표준 출력(파일 설명자 1)이 사용됩니다. 단어의 숫자가 출력을 위해 열린 파일 설명자를 지정하지 않으면 리디렉션 오류가 발생합니다. 단어가 "-"로 평가되면 파일 설명자 n이 닫힙니다. 특별한 경우로, n이 생략되고 단어가 하나 이상의 숫자 또는 "-"로 확장되지 않는 경우 표준 출력 및 표준 오류는 이전에 설명한 대로 리디렉션됩니다.

이 모든 것은 다음을 설명하기 위한 것입니다.특정한뒤에 숫자가 오면 >&해당 숫자는 파일 설명자로 간주됩니다. 아마도 이것이 &>word설명서에 유사한 제품보다 우수하다고 명시되어 있는 이유일 것입니다.>&word&>word

관련 정보