Предполагая, что file2
уже существует, команда
> file1 < file2 cat
похоже копирует содержимое file2
в file1
.
Но я не могу понять эту структуру.
Я понимаю, что «Ничто» направлено на file1
(создание или удаление его содержания). Тогда содержание file2
направляется на file1
.
Почему cat
после file2
? как узнать, cat file2
что операнды не в правильном порядке?
shell
io-redirection
shaqed
источник
источник
Ответы:
Прежде чем оболочка выполнит
cat
команду в командной строке, она ищет перенаправления.Есть два перенаправления:
>file1
Это заставит стандартный вывод команды перейти наfile1
.<file2
Это сделает стандартный ввод команды изfile2
.Тот факт, что эти перенаправления размещаются в неудобном месте в командной строке, не имеет значения.
такой же как
который так же, как
etc.¹
Обратите внимание, что
cat
утилита во всех этих случаях выполняется без аргументов командной строки . Перенаправления не являются операндамиcat
команды, они представляют собой инструкции для оболочки по настройке перенаправлений в команду и из нее (соединяя ее стандартный ввод и вывод с файлами). Оболочка устанавливает перенаправления перед вызовом команды.Разница между
cat file
иcat <file
(или, если хотите,<file cat
) заключается в том, что в первом случаеcat
утилита сама открывает файл, который задается как операнд в командной строке, для чтения, а во втором случае оболочка будет откройте файл и подключитеcat
к нему поток ввода². Во втором случаеcat
заметит, что ему не был предоставлен файловый операнд, и автоматически переключится на чтение со своего стандартного ввода. Это особенностьcat
некоторых других утилит, а не то, что делают все утилиты.cat
также будет читать со своего стандартного ввода, если ему дан операнд-
. Опять же, это особенное только дляcat
некоторых других утилит (то есть ничего, что делает оболочка ). Для использованияcat
на файл в текущем каталоге, имя которого является-
, добавить путь к имени файла, например./-
.Order Порядок перенаправлений по-прежнему важен при некоторых обстоятельствах; С
cat <file2 >file1
, например,file1
не будет усечено, еслиfile2
недоступно (перенаправления анализируются слева направо). Относительное размещение словаcat
все же произвольно и не повлияет на это.² См. Также вопрос « cat выдает другую ошибку при открытии несуществующего файла ».
Тот факт, что оболочка устанавливает перенаправления еще до того, как выполнить команду в командной строке, объясняет, почему подобные вещи терпят неудачу, и в результате получается пустой выходной файл:
Здесь оболочка усекает (очищает) файл
file
перед выполнениемsort file
и подключениемsort
стандартного вывода к файлу. Затемsort
утилита откроетfile
и отсортирует его содержимое (что является ничем). Результат (ничего) передается через стандартный поток вывода вfile
.Средство защиты в данном конкретном случае (для сортировки файла "на месте")
или же
это более или менее то, что
sort
делает при использовании-o
файла для указания имени выходного файла.Просто для резервного копирования утверждения о том, что перенаправления могут предшествовать фактическому имени утилиты в командной строке:
А также о том, что перенаправление не является частью операндов утилиты:
источник
<in foo | bar >out
упорядочивает все в логическом порядке. Мне также нравится, еслиecho >&2 Something bad happened
для вывода ошибок из сценариев оболочки. Но>out <in cat
это просто запутанностьsort file >file
быть правильно выполнено?sort -o file file
.< file1 > file2 cat
было бы лучше, чем> file2 < file1 cat
, если бы его нельзя было обрезать , чтобы избежатьfile2
его усеченияfile1
.