“<& 3”및“done <file11 3 <file22”의 의미는 무엇입니까


16

다음 스크립트가 있습니다.

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

이 코드는 잘 작동합니다. 그러나 나는 이것을 이해하지 못한다 :

  • <&3
  • done < file11 3< file22

1
스크립트가 무엇인지 설명해 주시겠습니까? (당신은 잘 작동한다고 말합니다)
Mathieu

답변:


22

이 스크립트는 두 파일에서 문자열 쌍을 읽습니다. 각 반복에서, 그것은에서 문자열 읽기 file11lineA하고,에서 file22로를 lineB. 파일이 끝날 때까지이 작업을 수행합니다. 루프의 본문은 두 개의 문자열과 빈 줄을 출력합니다.

<file11수단은 "연결 /로부터 표준 입력 리디렉션 file11"명령 "이되면이 명령으로" while루프. 이것도 쓸 수있었습니다 0<file11.

표준 입력은 파일 디스크립터 번호 0입니다. 파일 디스크립터 1 및 2는 표준 출력 및 표준 오류 스트림 용으로 예약되어 있습니다.

3<file22수단 "에 연결 파일 기술자 3 file22이 명령에 대한". 숫자 3은 다음 "무료"파일 디스크립터 번호이지만 코드는 4 또는 5 또는 0, 1 및 2 이외의 작은 정수를 대신 사용할 수 있습니다 (사용 가능한 파일 디스크립터 수의 한계는 쉘이 무엇인지에 따라 다릅니다) 사용되지만 최대 9 개까지 작동합니다.

루프에서 read lineA기본적으로 표준 입력, 즉 파일에서 문자열을 읽습니다 file11(표준 입력은 루프에서 상 속됨). 이것도 쓸 수있었습니다 read lineA <&0.

으로 read lineB <&3read명령은 파일 기술자 3, 즉에서 읽 file22(표준 입력이처럼 3 루프에서 사용할 파일 기술자)가 아닌 표준 입력.

즉, 표준 입력 스트림과 "추가"파일 설명자 (번호 3)를 사용하여 두 파일을 "동시"(각 파일에서 차례로 한 번에 한 문자열 씩) 읽습니다. 일반적으로 하나의 입력 스트림 에만 액세스 할 수 있지만 이는 명시 적으로 두 번째 입력 스트림을 작성하여 file22파일에 연결하여 이러한 제한을 무시 합니다.

관련 :


"line"대신 "string"이라는 단어를 사용합니다. 두 파일에서 읽은 내용은 측면 공백이 제거되고 특정 이스케이프 시퀀스는 특별히 해석됩니다.

읽기하려면 선을 사용하여 read, 사용을

IFS= read -r varname

관련 :


좋은 대답입니다! 내가 이해하지 못하는 것은 파일 설명자 3을 사용하는 방법입니다. 이것이 반환되지 않지만 미리 지정된 곳 3<file22과 같은 것 입니까? fopenFID
A. Donda

2
@ A.Donda 설명하고 fdopen()있습니다. 예.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.