"<&3"과 "완료 < file11 3< file22"는 무엇을 의미하나요?

"<&3"과 "완료 < file11 3< file22"는 무엇을 의미하나요?

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

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

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

  • <&3
  • done < file11 3< file22

답변1

이 스크립트는 두 파일에서 문자열 쌍을 읽습니다. 각 반복마다 file11into lineA및 into 에서 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 <&3명령 은 표준 입력이 아닌 read파일 설명자 3, 즉 에서 읽습니다 file22(파일 설명자 3은 표준 입력과 마찬가지로 루프에서 사용할 수 있음).

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

관련된:


위에서는 "line" 대신 "string"이라는 단어를 사용했습니다. 두 파일을 모두 읽으면 양쪽에 공백이 제거되고 특정 이스케이프 시퀀스는 특별히 해석됩니다.

읽다철사사용하다 read, 사용하다

IFS= read -r varname

관련된:

관련 정보