Что означает «<& 3» и «сделано <файл11 3 <файл22»

16

У меня есть следующий скрипт:

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

Этот код работает нормально. Но я не понимаю этого:

  • <&3
  • done < file11 3< file22
Gaurav
источник
1
Не могли бы вы объяснить нам, что делает сценарий? (Вы говорите, что работает нормально)
Матье

Ответы:

22

Скрипт читает пары строк из двух файлов. На каждой итерации он читает строку из 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 может быть использован. Означает ли это, чем 3<file22то, fopenгде FIDне возвращается, но предварительно указано?
А. Донда
2
@ A.Donda Вы описываете fdopen(). Да.
Кусалананда