다음 스크립트가 있습니다.
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
이 코드는 잘 작동합니다. 그러나 나는 이것을 이해하지 못합니다:
<&3
done < file11 3< file22
답변1
이 스크립트는 두 파일에서 문자열 쌍을 읽습니다. 각 반복마다 file11
into 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
관련된: