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

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

 > file1 < file2 cat 

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

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

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

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

  • не может получить доступ к стандартным выводам из команды
  • Поведение stdin / stdout в сочетании с подоболочками и командой cd
  • команда, как wc, но с тиковым поведением
  • Запрос пароля Silent GnuPG с командами bash
  • Почему вход в канал хорошо подходит для zenity, но <файловые неполадки?
  • Как захватить только stderror в этом сценарии bash?
  • Как работает cat> file << "END"?
  • Как стандартный ввод одной программы может передаваться как аргумент другому?
  • 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

    Невозможно использовать имя_ инвентаря__охотника или ansible_hostname в имени задачи

    множественные разделители awk, когда один из разделителей – 4 символа подчеркивания (не один)

    Ubuntu Linux: копирование прав на файлы / папки с одной машины на другую

    Версия Magic в Linux?

    Сделать подсветку клавиатуры на Samsung

    Как получить флаги компилятора, которые используются для сборки двоичных файлов в пакете (.deb)?

    Удалить последнюю запятую из строки bash для созданной петли строки

    Запускать скрипт при создании файла

    Как игнорировать ссылки grep из файла?

    Как выполнить команду источника из файла sh

    Безопасно ли писать в Linux-раздел из Windows?

    Как запустить команду SSH для установки StrictHostKeyChecking = no?

    Как напечатать произвольные символы Unicode в xterm?

    Попытка добавить корицу в gentoo – дает мне замаскированное предупреждение

    Какие части исполняемого файла ELF загружаются в память и где?

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