Что значит "<&3" и "сделано < file11 3< file22"

  1. Не помещайте команды в квадратные скобки. Чтобы выполнить цикл, пока grep завершился успешно (т. Е. Пока он не завершился), просто выполните

    , пока grep ... 
    do 
     ︙ {{1} } done 
     
  2. Чтобы выполнить цикл, пока grep не работает (т. е. до тех пор, пока он не завершится успешно), выполните

     while! grep ... 
    do 
     ︙ 
    done 
     

    с пробелами (т. е. одним или несколькими пробелами и / или табуляцией) между ! и команда.

  3. Вы всегда должны цитировать ссылки на переменные оболочки (например, "$ path" ) , если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете. В отличие от фигурных скобок, они не так важны, как кавычки , поэтому "$ text" и "$ path" достаточно хороши (вам не нужно использовать "$ {text}" и "$ {path}" , в этом контексте).

    … если путь не может быть установлен в список имен файлов, в этом случае см. Последствия для безопасности, если вы забыли указать переменную в кавычках в bash / POSIX shells - Но что, если…?

  4. Вам не нужна точка с запятой (; ) в конце строки , а {{1} } (если вы не поставите после него do ). Другими словами, строка , а и do должны быть разделены точкой с запятой и / или одним или несколькими новые строки.

16
22.05.2019, 09:48
1 ответ

Сценарий считывает пары строк из двух файлов. На каждой итерации он считывает строку из 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

Связанные:

22
27.01.2020, 19:48

Теги

Похожие вопросы