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
것을 의미합니다.stdout
3
stdout
stderr
3
누군가 내가 놓친 것을 설명해 줄 수 있습니까?
답변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