Сценарий считывает пары строк из двух файлов. На каждой итерации он считывает строку из file11
в lineA
и из file22
в lineB
. Он делает это до тех пор, пока не встретит конец любого файла. Тело цикла выводит две строки и пустую строку.
file11
в эту команду», где «эта команда» — это цикл while
. Это также могло быть написано 0
Стандартным вводом является файловый дескриптор номер 0. Файловые дескрипторы 1 и 2 зарезервированы для стандартного вывода и стандартных потоков ошибок.
3
file22
для этой команды». Число 3 является следующим «свободным» номером файлового дескриптора, но в коде вместо этого можно было использовать 4 или 5 или любое небольшое целое число, отличное от 0, 1 и 2 (ограничение количества используемых файловых дескрипторов зависит от того, что используется оболочка, но гарантированно работают числа до 9 ).
В цикле read lineA
будет читать строку из стандартного ввода по умолчанию, т.е. из файлаfile11
(стандартный ввод наследуется от цикла ). Это также могло быть написано read lineA <&0
.
С помощью read lineB <&3
команда read
читает из дескриптора файла 3, т.е.из file22
, а не из стандартного ввода (дескриптор файла 3 доступен в цикле, точно так же, как стандартный ввод ).
Вкратце, он использует стандартный входной поток и «дополнительный» файловый дескриптор (номер 3 )для чтения из двух файлов «одновременно» (строки за раз из каждого файла по очереди ). Обычно у пользователя есть доступ только к одному входному потоку , но это обходит это ограничение, явно создавая второй входной поток и подключая его к файлу file22
.
Связанные:
Я использую слово «строка» выше, а не «строка». В вещах, прочитанных из двух файлов, будут удалены пробелы по бокам, а некоторые escape-последовательности будут интерпретированы особым образом.
Чтобы прочитать строку с помощью read
, используйте
IFS= read -r varname
Связанные: