В этой главе подробно описываются мощные механизмы UNIX, связанные с перенаправлением ввода, вывода и ошибок. Темы включают:
Что такое стандартный ввод и стандартный вывод?Большинство команд Linux считывают с ввода, которым может быть файл или другой атрибут команды, и записывают в вывод. По умолчанию ввод принимается с клавиатуры, а вывод отображается на экране. Клавиатура является вашим стандартным устройством ввода (stdin), а экран или конкретное окно терминала — стандартным устройством вывода (stdout).Однако, поскольку Linux - гибкая система, эти настройки по умолчанию не обязательны к применению. Стандартный вывод, например, на сильно загруженном сервере может быть направлен на принтер. Операторы перенаправленияПеренаправление вывода с > и |Когда-нибудь вам захочется отправить вывод команды в файл, или вам может потребоваться применить другую команду к выводу первой. Это явление известно как перенаправление вывода. Перенаправление производится с использованием либо ">" (символ "больше чем"), либо с помощью оператора "|" (канал), который направляет стандартный вывод одной команды к другой команде в качестве стандартного ввода.Как мы видели раньше, команда cat объединяет файлы и отправляет их все вместе на стандартный вывод. При перенаправлении этого вывода в файл он будет создан или перезаписан, если он уже существует, так что будьте аккуратнее. nancy:~> cat test1 some words nancy:~> cat test2 some other words nancy:~> cat test1 test2 > test3 nancy:~> cat test3 some words some other words
Не перезаписывайте!
Если перенаправить в файл «ничего», то он станет пустым:Будьте осторожны, чтобы не перезаписать существующие (важные) файлы при перенаправлении вывода. Многие оболочки, в том числе и Bash, имеют встроенную функцию для защиты вас от этого риска: noclobber. См. info-страницы для получения дополнительной информации. В Bash возможно вам захочется добавить команду set -o noclobber в ваш файл конфигурации .bashrc в целях предотвращения случайной перезаписи файлов. nancy:~> ls -l list -rw-rw-r-- 1 nancy nancy 117 Apr 2 18:09 list nancy:~> > list nancy:~> ls -l list -rw-rw-r-- 1 nancy nancy 0 Apr 4 12:01 listЭтот процесс называется усечением. Такое же перенаправление на несуществующий файл создаст новый пустой файл с заданным именем: nancy:~> ls -l newlist ls: newlist: No such file or directory nancy:~> > newlist nancy:~> ls -l newlist -rw-rw-r-- 1 nancy nancy 0 Apr 4 12:05 newlistВ Главе 7, Дом, сладкий /home дается еще несколько примеров использования подобного способа переадресации. Далее идут некоторые примеры использования конвейера команд. Чтобы найти слово в каком-то тексте, отображаются все строки, соответствующие "pattern1", а также исключаются строки, соответствующие "pattern2": grep pattern1 file | grep -v pattern2 Отображение вывода каталога с перелистыванием одной страницы за раз: ls -la | less Нахождение файла в каталоге: ls -l | grep part_of_file_name Перенаправление вводаВ другом случае вам может понадобиться файл, который послужит вводом для команды, которая обычно не принимает файл в качестве параметра. Такое перенаправление ввода осуществляется с помощью оператора "<" (символ "меньше, чем").Ниже приведен пример отправки кому-то файла с использованием перенаправления ввода. andy:~> mail mike@somewhere.org < to_doЕсли пользователь mike существует в данной системе, вам не нужно вводить полный адрес. Если вы хотите достать кого-то в Интернете, введите полный адрес в качестве аргумента mail. По началу это читается немного сложнее, чем cat file | mail someone, но это, без сомнения, гораздо более удобный способ использования имеющихся инструментов. Объединение перенаправленийВ следующем примере объединяются входное и выходное перенаправление. Файл text.txt сначала проверяется на наличие орфографических ошибок, а вывод перенаправляется в файл журнала ошибок:spell < text.txt > error.log Следующая команда выводит список всех команд, которые вы можете передать на рассмотрение другому файлу при использовании less: mike:~> less --help | grep -i examine :e [file] Examine a new file. :n * Examine the (N-th) next file from the command line. :p * Examine the (N-th) previous file from the command line. :x * Examine the first (or N-th) file from the command line.Опция -i используется для поиска без учета регистра - вспомните, что системы UNIX очень чувствительны к регистру. Если вы хотите сохранить вывод этой команды на будущее, перенаправьте вывод в файл: mike:~> less --help | grep -i examine > examine-files-in-less mike:~> cat examine-files-in-less :e [file] Examine a new file. :n * Examine the (N-th) next file from the command line. :p * Examine the (N-th) previous file from the command line. :x * Examine the first (or N-th) file from the command line.Вывод одной команды может быть передан другой команде фактически столько раз, сколько вам потребуется, но только до тех пор, пока эти команды читают со стандартного ввода и отправляют результат на стандартный вывод. Иногда этого не происходит, в таком случае могут существовать специальные опции, которые отдают распоряжение таким командам, делая их поведение соответствующим стандартным установкам; так что читайте документацию (man и info-страницы) используемым вами командам, если вам приходится сталкиваться с ошибками. Опять же, убедитесь, что вы не используете имена существующих файлов, которые вам все еще нужны. Перенаправление вывода в существующий файл заменит его содержимое. Оператор >>Вместо перезаписи данных файла, вы можете также добавить текст в существующий файл с помощью двух следующих друг за другом символов "больше, чем".Пример: mike:~> cat wishlist more money less work mike:~> date >> wishlist mike:~> cat wishlist more money less work Thu Feb 28 20:23:07 CET 2002Команда date, как правило, выводит результат на экран, но теперь добавляется к файлу wishlist. |