Ý nghĩa của những gì về <và 3 và được thực hiện <file11 3 <file22


16

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

1
Bạn có thể giải thích cho chúng tôi những gì các kịch bản? (Bạn nói rằng nó hoạt động tốt)
Mathieu

Câu trả lời:


22

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ừ file11vào lineAvà từ file22và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.

<file11nghĩa là "kết nối / chuyển hướng đầu vào tiêu chuẩn từ file11vào lệnh này", trong đó "lệnh này" là whilevò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.

3<file22nghĩa là "kết nối mô tả tập tin 3 với file22lệ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 lineAsẽ đọ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, readlệ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 file22tệ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:


Câu trả lời tốt! Điều tôi không hiểu là làm thế nào mô tả tập tin 3 có thể được sử dụng. Điều này có nghĩa 3<file22là giống như một fopennơi FIDkhông được trả lại nhưng được chỉ định trước?
A. Donda

2
@ A.Donda Bạn đang mô tả fdopen(). Đúng.
Kusalananda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.