Как эта команда легальна? "> File1 <file2 cat"

Предполагая, что file2 уже существует, команда

 > file1 < file2 cat 

похоже, копирует содержимое file2 в file1 .

Но я не могу понять эту структуру.

Я понимаю, что «Nothing» направляется в file1 (создание или удаление его содержимого). Затем содержимое file2 направляется в file1 .

Почему cat после file2 ? как он знает cat file2 если операнды не в правильном порядке?

  • Пожалуйста, помогите объяснить это перенаправление вывода bash
  • Как реализовать отложенное stdout в дочернем процессе без использования временных файлов?
  • выход хвостовой программы в файл в Linux
  • Как управлять mysql с помощью zpty?
  • Как отправить stdout на несколько команд?
  • Опорожнение файла без нарушения записи на него
  • Как создать цикл перенаправления
  • перенаправление входного выхода в bash
  • One Solution collect form web for “Как эта команда легальна? "> File1 <file2 cat"”

    Прежде чем оболочка выполнит команду cat в командной строке, она ищет перенаправления.

    Существует два перенаправления:

    1. >file1 Это приведет к тому, что стандартный вывод команды перейдет в file1 .
    2. <file2 Это сделает стандартный ввод команды из file2 .

    Тот факт, что эти переадресации размещены в выигрышном месте в командной строке, не имеет значения.

     $ cat <file2 >file1 

    такой же как

     $ <file2 cat >file1 

    который является таким же, как

     $ <file2 >file1 cat 

    etc.¹

    Обратите внимание, что утилита cat во всех этих экземплярах выполняется без каких-либо операндов . Переадресации не являются операндами команды cat , они являются инструкциями для оболочки для настройки перенаправления в команду и из нее (подключение ее стандартного ввода и вывода в файлы).

    Разница между cat file и cat <file (или, если хотите, <file cat ) заключается в том, что в первом случае сама утилита cat открывает файл, который указан как операнд в командной строке, для чтения, в то время как во втором случае оболочка откроет файл и подключит входной поток cat к нему². Во втором случае cat заметит, что ему не был задан файловый операнд и он автоматически переключится на чтение со своего стандартного ввода (это особенность cat , а не то, что делают все утилиты).

    ¹ Порядок перенаправления по-прежнему важен при некоторых обстоятельствах; Например, при cat <file2 >file1 file1 не будет усечен, если file2 недоступен (перераспределение анализируется слева направо). Однако размещение слова cat все равно произвольно и не будет влиять на это.

    ² См. Также вопрос « Кошка дает разные ошибки при открытии несуществующего файла ».


    Тот факт, что оболочка устанавливает перенаправления перед выполнением команды в командной строке, – это то, что такие вещи не работают, и вы получаете пустой выходной файл:

     $ sort file >file 

    Здесь оболочка будет обрезать (пустой) файл file перед выполнением sort file и подключить стандартный sort file sort к файлу. Утилита sort затем откроет file и отсортирует его содержимое (что ничего не значит). Результат (ничего) передается через стандартный выходной поток в file .

    Средство защиты в данном конкретном случае (для сортировки файла «на месте»)

     $ sort -o file file 

    или

     $ sort file >file.sorted && mv file.sorted file 

    который в большей или меньшей степени используется при использовании файла -o для указания имени выходного файла.


    Просто для подтверждения утверждения о том, что перенаправление может предшествовать фактическому имени утилиты в командной строке:

    «Простая команда» представляет собой последовательность необязательных назначений переменных и перенаправления в любой последовательности, необязательно сопровождаемых словами и перенаправлениями, которые завершаются оператором управления. [ref: командный язык командной оболочки POSIX 2.9.1 Простые команды]

    А также о перенаправлении, не являющемся частью операндов утилиты:

    Необязательный номер, оператор перенаправления и слово не должны появляться в аргументах, предоставляемых команде, которая должна быть выполнена (если таковая имеется). [ref: командный язык командной оболочки POSIX 2.7 Перенаправление]

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.