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