Tôi có đoạn script sau:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Mã này đang hoạt động tốt. Nhưng tôi không hiểu những điều này:
<&3
done < file11 3< file22
Tôi có đoạn script sau:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Mã này đang hoạt động tốt. Nhưng tôi không hiểu những điều này:
<&3
done < file11 3< file22
Câu trả lời:
Kịch bản đọc các cặp chuỗi từ hai tệp. Trong mỗi lần lặp, nó đọc một chuỗi từ file11
vào lineA
và từ file22
vào lineB
. Nó làm điều này cho đến khi nó gặp phần cuối của một trong hai tập tin. Phần thân của vòng lặp xuất ra hai chuỗi và một dòng trống.
Có <file11
nghĩa là "kết nối / chuyển hướng đầu vào tiêu chuẩn từ file11
vào lệnh này", trong đó "lệnh này" là while
vòng lặp. Điều này cũng có thể đã được viết 0<file11
.
Đầu vào tiêu chuẩn là số mô tả tệp 0. Bộ mô tả tệp 1 và 2 được dành riêng cho đầu ra tiêu chuẩn và luồng lỗi tiêu chuẩn.
Có 3<file22
nghĩa là "kết nối mô tả tập tin 3 với file22
lệnh này". Số 3 tình cờ là số mô tả tệp "miễn phí" tiếp theo, nhưng mã có thể đã sử dụng 4 hoặc 5 hoặc bất kỳ số nguyên nhỏ nào khác 0, 1 và 2 thay vào đó (giới hạn của số mô tả tệp có thể sử dụng tùy thuộc vào vỏ nào đang được sử dụng, nhưng số lượng lên đến 9 được đảm bảo để hoạt động).
Trong vòng lặp, read lineA
sẽ đọc một chuỗi từ đầu vào tiêu chuẩn theo mặc định, tức là từ tệp file11
(đầu vào tiêu chuẩn được kế thừa từ vòng lặp). Điều này cũng có thể đã được viết read lineA <&0
.
Với read lineB <&3
, read
lệnh đọc từ bộ mô tả tệp 3, tức là từ file22
, chứ không phải từ đầu vào tiêu chuẩn (mô tả tệp 3 có sẵn trong vòng lặp, giống như đầu vào tiêu chuẩn).
Nói tóm lại, nó sử dụng luồng đầu vào tiêu chuẩn và bộ mô tả tệp "phụ" (số 3) để đọc từ hai tệp "đồng thời" (một chuỗi lần lượt từ mỗi tệp). Thông thường, người ta chỉ có quyền truy cập vào một luồng đầu vào, nhưng điều này bỏ qua hạn chế đó bằng cách rõ ràng tạo ra luồng đầu vào thứ hai và kết nối nó với file22
tệp.
Liên quan:
Tôi sử dụng từ "chuỗi" ở trên chứ không phải là "dòng". Những thứ được đọc từ hai tập tin sẽ có các khoảng trắng ở sườn bị loại bỏ và các chuỗi thoát nhất định sẽ được diễn giải đặc biệt.
Để đọc một dòng sử dụng read
, sử dụng
IFS= read -r varname
Liên quan:
3<file22
là giống như một fopen
nơi FID
không được trả lại nhưng được chỉ định trước?
fdopen()
. Đúng.