Неправильное поведение разбивки на страницы irssi в tmux

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

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

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

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

$ cat file1

то же самое, что

$ file1

, то же самое, что

$ file1 cat

и т. Д.

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

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

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

¹ Порядок перенаправления по-прежнему важен при некоторых обстоятельствах; С cat file1 , например, 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]

1
05.09.2016, 11:22
0 ответов

Теги

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