Библиотека сайта rus-linux.net
8.3. Перенаправление ввода и вывода
В системе UNIX некоторые команды ожидают ввод только с клавиатуры (стандартный ввод) и большинство команд отображают свой вывод на экране терминала (стандартный вывод). Однако система UNIX позволяет вам перенаправлять ввод и вывод в файлы и программы, т.е. вы можете сказать shell:
- взять ввод из файла, а не с клавиатуры;
- послать вывод в файл, а не на терминал;
- использовать программу как исходные данные для другой программы.
8.3.1. Перенаправить ввод: знак <
Чтобы перенаправить ввод, укажите в командной строке после знака "меньше чем" (<) имя файла:
command < имя_файла<CR>
8.3.2. Перенаправить вывод: знак >
Чтобы перенаправить вывод, укажите в командной строке после знака "больше чем" (>) имя файла:
command > имя_файла<CR>
Примечание. Если вы перенаправите вывод в уже существующий файл, то вывод вашей команды заменит содержимое существующего файла.
Перед тем, как перенаправить вывод команды в конкретный файл убедитесь, что этот файл не существует. shell не предупреждает, что выполняет перезапись существующего файла.
Чтобы убедиться, что файл с запланированным именем не существует, воспользуйтесь командой ls с аргументом "имя_файла". Если этот файл не существует, то ls выдаст сообщение, что файл не найден в текущем справочнике. Например, проверка существования файлов temp и junk даст следующий результат:
$ ls temp<CR> temp $ ls junk<CR> junk: no such file or directiry $
Это означает, что вы можете назвать свой файл junk, но не можете использовать в качестве имени temp, если не хотите потерять содержимое существующего файла.
8.3.3. Добавить вывод в существующий файл
Чтобы добавить вывод в существующий файл и не разрушить его, вы можете воспользоваться символом >>:
command >> имя_файла<CR>
В результате выполнения команды вывод будет добавлен в конец существующего файла. Если файл не существует, то он будет создан. Например, рассмотрим как добавить вывод с помощью команды cat. Команда cat печатает содержимое файлов, имена которых являются ее аргументами, в стандартный вывод. Если нет аргументов, то она печатает стандартный ввод в стандартный вывод. Сначала выполните команду cat без перенаправления вывода. Затем содержимое файла trial2 добавляем после последней строки в файл trial1 при выполнении команды cat над файлом rtial2, перенаправив вывод в файл trial1:
$ cat trial1<CR> This is the first line of trial1. Hello. This is the last line of trial1. $ $ cat trial2<CR> This is the beginning of trial2. Hello. This is the end of trial2. $ cat trial2 >> trial1<CR> $ cat trial1<CR> This is the first line of trial1. Hello. This is the last line of trial1. This is the beginning of trial2. Hello. This is the end of trial2. $
8.3.3.1. Некоторые применения перенаправления вывода
Перенаправление вывода очень удобно в том случае, если вы не хотите, чтобы вывод появлялся на экране немедленно, или хотите сохранить его. Рассмотрим две команды: spell и sort.
Команда spell
Команда spell сравнивает каждое слово в файле со своим словарем и печатает список всех потенциальных орфографических ошибок на экране. Если в словаре spell нет какого-либо слова (например, персональное имя), то она также выдает его как орфографическую ошибку. Если вы подадите на ввод spell большой файл, то его обработка займет много времени и список ошибок может быть очень большим. Команда spell распечатывает весь список ошибок сразу. Поэтому лучше всего перенаправить вывод spell в файл. Например, spell осуществляет поиск файла memo и помещает список орфографических ошибок в файл misspell:
$ spell memo > misspell<CR>
Команда sort
Команда sort размещает строки указанного файла в алфавитном или цифровом порядке. Прежде чем перенаправить вывод команды в файл убедитесь, что имя этого файла не существует. Команда sort сначала очищает файл, который будет содержать вывод, затем выполняет сортировку и помещает вывод в пустой файл.
8.3.3.2. Комбинирование фонового режима и перенаправления вывода
Когда команда запущена в фоновом режиме, то вывод ее печатается на экране терминала. И если вы используете терминал в то же время для выполнения других задач, то вывод фоновой задачи будет прерывать вашу работу. Однако, если перенаправить вывод в файл, то вы сможете спокойно работать.
Предположим, что вы хотите найти все появления слова "test" в файле schedule. Запустите команду grep в фоновом режиме и перенаправьте вывод в файл testfile:
$ grep test schedule > testfile<CR>
Теперь вы можете использовать терминал для других работ и просмотреть файл testfile позднее.
8.3.4. Перенаправление вывода команде
Символ | называется каналом. Канал является мощным средством, которое позволяет вам брать вывод одной команды и использовать его в качестве ввода для другой команды без создания временных файлов. Таким образом построенная последовательность команд называется конвейером. Общий формат конвейера:
command1 | command2 | command3 ... <CR>Вывод command1 используется как ввод для command2. Вывод command2 используется как ввод для command3.
Чтобы понять насколько эффективен конвейер, рассмотрим 2 способа, которые дают одинаковый результат:
- использование метода перенаправления ввода/вывода. Запустим одну команду и перенаправим ее вывод во временный файл. Затем запустим вторую команду, которая берет содержимое временного файла как ввод. И в конце удалим временный файл;
- использование метода конвейера. Например, предположим
вы хотите послать сообщение happy birthday с помощью команды
banner владельцу david. Выполним сначала по первому методу:
- Введите команду banner и перенаправьте ее вывод во
временный файл:
banner happy birhday > message.tmp
- Введите команду mail и в качестве ввода
воспользуйтесь файлом message.tmp:
mail david < message.tmp
- Удалите временный файл:
rm message.tmp
Вторым методом это можно сделать быстрее:banner happy birthday | mail david<CR>
- Введите команду banner и перенаправьте ее вывод во
временный файл:
8.3.5. Подстановка вывода в качестве аргумента
Вывод большинства команд может использоваться как аргумент в командной строке. Для этого команду заключите между знаками "слабое ударение" (`...`) и поместите ее в командной строке в том месте, где вывод будет трактоваться как аргумент.
Например, вы можете подставить вывод конвейера команд date и cut в качестве аргумента в команде banner:
$ banner `date | cut -c12-19`<CR>
Обратите внимание на результат: система печатает banner с текущим временем.