У меня есть следующий скрипт:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Этот код работает нормально. Но я не понимаю этого:
<&3
done < file11 3< file22
shell
io-redirection
read
Gaurav
источник
источник
Ответы:
Скрипт читает пары строк из двух файлов. На каждой итерации он читает строку из
file11
вlineA
и из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) для чтения из двух файлов «одновременно» (по очереди по очереди из каждого файла по очереди). Обычно один имеет доступ только к одному входному потоку, но это обходит это ограничение, явно создав второй входной поток и подключив его к
file22
файлу.Связанный:
Я использую слово «строка» выше, а не «строка». Вещи, прочитанные из этих двух файлов, будут удалены по бокам, а некоторые escape-последовательности будут интерпретироваться специально.
Чтобы прочитать строку с помощью
read
, используйтеСвязанный:
источник
3<file22
то,fopen
гдеFID
не возвращается, но предварительно указано?fdopen()
. Да.