Прежде чем оболочка выполнит команду cat
в командной строке, она ищет перенаправления.
Существует два перенаправления:
> file1
Это приведет к тому, что стандартный вывод команды будет идти в file1
. При этом стандартный ввод команды будет поступать из file2
.
Тот факт, что эти перенаправления размещены в ненадежном месте командной строки, не имеет значения.
$ cat file1
то же самое, что
$ file1
, то же самое, что
$ file1 cat
и т. Д.
Обратите внимание, что утилита cat
во всех этих экземплярах выполняется без каких-либо аргументов командной строки . Перенаправления не являются операндами для команды cat
, они представляют собой инструкции для оболочки по настройке перенаправления в команду и из нее (подключение ее стандартного ввода и вывода к файлам). Оболочка устанавливает перенаправления перед вызовом команды.
Разница между cat file
и cat
Утилита cat
сама открывает файл, указанный в качестве операнда в командной строке, для чтения, тогда как во втором случае оболочка откроет файл и подключится входной поток cat
в it². Во втором случае cat
заметит, что ему не был задан файловый операнд, и автоматически переключится на чтение со стандартного ввода. Это особенность cat
и некоторых других утилит, а не то, что делают все утилиты.
cat
также будет читать со своего стандартного ввода, если ему задан операнд -
. Опять же, это особенное значение только для cat
и некоторых других утилит (то есть ничего, что делает оболочка ). Чтобы использовать cat
в файле в текущем каталоге с именем -
, добавьте путь к имени файла, например ./-
.
¹ Порядок перенаправления по-прежнему важен при некоторых обстоятельствах; С cat
, например, file1
не будет усечен, если file2
недоступен (перенаправления анализируются слева направо). Однако относительное расположение слова cat
по-прежнему произвольно и не влияет на это.
² См. Также вопрос « cat выдает другую ошибку при открытии несуществующего файла ».
Тот факт, что оболочка настраивает перенаправления еще до выполнения команды в командной строке, является причиной того, что такие вещи не работают, и вы получаете пустой выходной файл:
$ sort file >file
Здесь оболочка усекает (очищает) file file
перед выполнением sort file
и подключением стандартного вывода sort
к файлу. Утилита sort
затем откроет файл
и отсортирует его содержимое (которое ничто). Результат (ничего) передается через стандартный выходной поток в файл
.
Средство в данном конкретном случае (для сортировки файла "на месте")равно
$ sort -o file file
или
$ sort file >file.sorted && mv file.sorted file
, что примерно соответствует тому, что делает sort
при использовании файла -o
для указания имени выходного файла.
Просто чтобы подтвердить утверждение о том, что перенаправления могут предшествовать фактическому имени утилиты в командной строке:
«Простая команда» - это последовательность необязательных назначений переменных и перенаправлений в любой последовательности, за которыми необязательно следует слова и перенаправления, завершаемые оператором управления. [ref: POSIX Shell Command Language 2.9.1 Простые команды]
А также о перенаправлении, не являющемся частью операндов утилиты:
Необязательный номер, оператор перенаправления и слово не должны появляться в аргументы, предоставленные команде, которая должна быть выполнена (если есть). [ref: POSIX Shell Command Language 2.7 Redirection]