Перенаправление ввода и вывода

В интерфейсе командной строки есть очень полезная возможность перенаправления (переадресации) ввода и вывода (англ. термин I/O Redirection). Как мы уже заметили, многие программы выводят данные на экран. А ввод данных в терминале осуществляется с клавиатуры. С помощью специальных обозначений можно перенаправить вывод многих команд в файлы или иные устройства вывода (например, распечатать на принтере). Тоже самое и со вводом информации, вместо ввода данных с клавиатуры, для многих программ можно задать считывание символов их файла. Кроме того, можно даже вывод одной программы передать на ввод другой программе 😉

Разморозим нашу виртуальную машину и посмотрим как все это работает. В домашней директории создадим директорию test и перейдем в нее. Это позволит нам после завершения наших проб удалить весь мусор, стерев всю директорию test, как мы это сделали в позапрошлый раз.

Создание директории test и переход в нее

Стандартный вывод

Большинство программ, работающих в интерфейсе командной строки, отображают результаты, направляя их на специальное приспособление, называемое стандартным выводом. Все, что отправляется в стандартный вывод, обычно отображается на экране. Но вывод можно перенаправить. Для его перенаправления в определенный файл, существует специальное обозначение «>» (знак больше), после которого указывается имя файла. В таком случае вывод результатов работы команды записывается в файл и на экран не выводится. Если файла с указанным именем не существует, то он будет создан. В противном случае, старое содержание файла будет стерто. Для записи в конец существующего файла вместо «>» следует использовать «>>» (два знака больше). Если файл отсутствует, то он будет создан, в противном случае вывод будет дописан в конец существующего файла.

Посмотрим как это работает. Для этого перенаправим вывод команды ls в файлы. А после посмотрим их содержание с помощью программы для чтения текстовых файлов less.

Перенаправление вывода всегда указывается после всех параметров и аргументов программы (в конце команды).

Помимо текстовой информации, в стандартный вывод могут быть выведены двоичные (не читаемые человеком данные). В таком случае, при обычном вызове программы, которая выдает подобный результат, они появятся на экране, что не имеет смысла, так как прочитать (понять) результат работы программы мы не сможем 🙁 Предполагается, что подобный вывод будет перенаправлен для записи в файл или на ввод другой программе.  Это очень удобно, ведь программа лишь обрабатывает данные, а после мы сами указываем, куда отправить (или записать) результат, без необходимости предварительной записи его во временные файлы. С конкретными примерами подобного использования мы познакомимся после того, как разберемся с перенаправлением ввода.

Стандартный ввод

Большинство программ, работающих в интерфейсе командной строки, ожидают ввод данных от пользователя с так называемого приспособления стандартный ввод.  Обычно, все, что набирается на клавиатуре, доступно для считывания программе из стандартного ввода. Но его можно перенаправить.  Чтобы перенаправить ввод из файла, существует специальное обозначение «<» (знак меньше) после которого следует указать имя файла. При перенаправлении ввода, вместо того, чтобы считывать символы с клавиатуры (стандартного устройства ввода), программа считывает их их указанного источника (файла).

Чтобы понять, удобство переадресации ввода, вначале познакомимся с программой sort, которая считывает строки и выводит их, отсортировав по алфавиту. Если быть совсем честным, то программа sort умеет считывать данные из файла, если указать его имя, но мы не будем в данном случае этим пользоваться. Ведь нас интересует разобраться как работает перенаправление ввода.

Вначале запустим программу sort и введем несколько строк. После завершения ввода воспользуемся комбинацией Ctrl+D, которая вставляет так называемый символ (указатель) конца данных (файла).

Как видим, программа отсортировала строки в алфавитном порядке (вначале следуют цифры). Если присмотреться, то не очень понятно, где начинается вывод результата, так как сразу после того, как мы закончили вводить данные, программа вывела результат.

Программа sort

Если бы мы направили вывод данных в файл, то разобраться бы было проще, так как на экране мы бы видели лишь только то, что ввели с клавиатуры, а результат был бы сохранен в файл.

Аналогично было бы, если бы мы сортировали строки из файла. На экране был бы отображен лишь результат сортировки. Попробуем отсортировать строки в файле usr.txt, в который мы сохранили вывод результата программы ls после двух запусков. Как мы заметили, программа ls выводит результат в отсортированном виде, но мы запускали ее дважды и получили два отсортированных списка в файле usr.txt. Сейчас нам нужно отсортировать все строки файла usr.txt между собой.

Перенаправление ввода всегда указывается после всех параметров и аргументов программы (в конце команды).

Можно сразу перенаправить и ввод, и вывод. Сохраним отсортированный выше список в файле usr-sorted.txt и посмотрим результат через less.

При одновременном указании переадресации ввода и вывода, порядок в котором они указываются не имеет значения. Можно вначале указать либо перенаправление ввода, а затем вывода, либо наоборот 🙂

Перевод вывода на ввод

Перенаправлять стандартные ввод и вывод в файлы мы уже умеем. Но еще можно вывод одной команды подать на ввод другой. Это наиболее полезный и удобный функционал переадресации ввода вывода. Таким образом можно объединить в цепочку несколько команд, последовательно создавая канал между выводом одной команды и вводом следующей. Такая переадресация ввода вывода одной команды в другую называется каналом (англ. pipeline или pipe). Для присоединение ввода команды к выводу другой команды, используется обозначение «|» (вертикальная черта, «труба» (англ. pipe)). После полного описания команды, вывод которой следует перенаправить на ввод другой команде, ставится символ «|» (вертикальная черта) и следует описание второй команды. Цепочка может содержать сразу несколько команд.

Посмотрим как это работает. Если мы помним, в директории /usr/bin слишком много файлов. Мы хотим посмотреть детальную информацию по каждому, но список не помещается на экране. Для решения подобной задачи мы перенаправляли вывод команды ls в файл, а затем открывали его через удобную программу для просмотра текстовых файлов less. А ведь можно сразу без сохранения результата в файл открыть его через less. Сделаем это.

Перенаправление вывода команды ls в программу less

Теперь мы можем видеть весь результат и перемещаться по нему при помощи прокрутки в less и даже выполнять поиск текста. Для выхода из less нажмем клавишу «q». Я надеюсь, к текущему моменту мы запомнили нужные нам команды управления, особенно выход из less, поэтому далее про «q» упоминаний не будет.

Не забудем удалить созданную директорию test. Все помнят как это сделать? Если возникают сложности, советую вновь ознакомиться и понять основные методы воздействия на файлы и директории в Linux.

Более подробно о применении цепочек из команд будет рассказано в следующих материалах. А пока вновь заморозим виртуальную машину. О заморозке и разморозке в будущем я тоже упоминать не буду, как и о многом очевидном. И не бойтесь отклоняться от инструкций в материалах и ставить опыты с командной строкой — это только пойдет на пользу 🙂

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *