20 окт. 2000 г.

Азы linux (для детей) урок 28


Глава 5. Перенаправление ввода-вывода (I/O)

В этой главе подробно описываются мощные механизмы 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.