Bash에서 파일 복사/닫기 설명자의 화살표 기호 의미

Bash에서 파일 복사/닫기 설명자의 화살표 기호 의미

Linux 명령줄에 관한 책을 읽고 있는데 저자가 리디렉션 작업에 사용되는 화살표 기호에 관한 bash 매뉴얼의 규칙을 따르지 않는 것 같습니다. 즉, <설명자가 입력 설명자인지 출력 설명자인지에 관계없이 항상 왼쪽 화살표를 사용하여 파일 설명자를 복사하고 닫습니다.

예는 다음과 같습니다.

exec 3<&0 4<&1 #shouldn't be 4>&1 ?
#...
exec 3<&- 4<&- #shouldn't be 4>&- ?

Bash 매뉴얼 페이지는 이 점에 대해 모호합니다. 파일 설명자를 복사/닫고 이동하는 구문은 다음과 같습니다.

#Duplicating and closing (in case word expands to -):
[n]<&word 
[n]>&word

#Moving:
[n]<&digit-
[n]>&digit-

명시적으로 제공하지 않는 경우에만 n해당 양식을 서로 바꿔서 사용할 수 있다는 뜻인가요?

답변1

둘 다 동일한 작업을 4>&1수행하기 때문에 중요하지 않습니다 . 하나의 fd를 다른 fd로 복사하는 시스템 호출입니다. 복사된 fd는 원본 fd의 I/O 방향을 자동으로 상속합니다. ( vs 와 동일하며 둘 다 로 해결되고 그 뒤에 가 옵니다 ).4<&1dup2(1, 4)4>&-4<&-close(4)4>&1-dup2(1, 4)close(1)

그러나 4<&1어떤 이유로든 fd 1이 읽기용으로 명시적으로 열려 있지 않는 한(더 혼란스러울 수 있음) 구문은 혼란스럽습니다. 따라서 제 생각에는 이 구문을 피해야 합니다.

중복된 내용은 fd동일하게 공유됩니다.파일 설명 열기이는 파일에서 동일한 오프셋(해당하는 파일 유형의 경우)과 동일한 연관 플래그(I/O 리디렉션/개방 모드, O_APPEND 등)를 공유한다는 의미입니다.

Linux에는 다른 방법이 있습니다.복사a fd(실제로는 중복이 아님)를 만들고 새 항목을 만듭니다.파일 설명 열기동일한 리소스에 대한 것이지만 플래그가 다를 수도 있습니다.

exec 3> /dev/fd/4

dup2(4, 3)Solaris 및 아마도 대부분의 다른 Unices에서 이는 fd 4가 가리키는 동일한 리소스를 처음부터 여는 Linux 와 거의 동일합니다 .

이는 중요한 차이점입니다. 예를 들어 일반 파일의 경우 fd 3의 오프셋은 0(파일 시작)이고 파일은 잘립니다(이것이 Linux에서는 tee -a /dev/stderrfd 3 대신 작성해야 하는 이유입니다 tee /dev/stderr).

그리고 I/O 모드는 다를 수 있습니다.

흥미롭게도 fd 4가 파이프의 읽기 끝을 가리킨다면 fd 3은 이제 쓰기 끝을 가리킵니다( 다음 /dev/fd/3과 같이 동작합니다) .명명된 파이프):

$ echo a+a | { echo a-a > /dev/fd/0; tr a b; }
b+b
b-b

$ echo a+a | { echo a-a >&0; tr a b; }
bash: echo: write error: Bad file descriptor
b+b

관련 정보