Понимание каналов и перенаправления в командной строке Linux

Две мощные функции командной строки Linux - это перенаправление и каналы, которые позволяют вывод (или даже ввод) программы отправлять в файл или другую программу. Возможно, вы уже использовали эти функции, не осознавая этого. Каждый раз, когда вы использовали знак “ > ” в команде или “ | ”, вы использовали перенаправление или канал соответственно.

Во всех UNIX-подобных операционных системах, таких как Linux и FreeBSD, вывод из программы командной строки автоматически отправляется в место, известное как стандартный вывод (stdout). По умолчанию стандартный вывод - это экран (консоль), но это можно изменить с помощью каналов и перенаправления. Аналогично, клавиатура считается стандартным вводом (stdin), и, как и стандартный вывод, ее можно изменить.

Каналы

Каналы позволяют направлять вывод из одной команды в другую, где он будет использоваться как ввод. Другими словами, стандартный вывод из одной программы становится стандартным вводом для другой.

Команда “ more ” принимает стандартный ввод и разбивает его на страницы на стандартном выводе (экран). Это означает, что если команда отображает больше информации, чем можно показать на одном экране, программа “ more ” приостановится после первого полного экрана (страницы) и будет ждать, пока пользователь нажмет SPACE, чтобы увидеть следующую страницу, или RETURN, чтобы увидеть следующую строку.

Вот пример, который перечисляет все файлы с деталями ( -la) в каталоге /dev и передает вывод в more. В каталоге /dev должно быть десятки файлов, и, следовательно, убедитесь, что more нужно будет разбить на страницы.

ls -la /dev | more

ls pipe more

Обратите внимание на подсказку --More-- внизу экрана. Нажмите SPACE, чтобы увидеть следующую страницу, и продолжайте нажимать SPACE, пока вывод не закончится.

Вот еще один пример канала, на этот раз с использованием инструмента “ wc ” (счетчик слов).

ls -1 /dev | wc

wc считает количество строк, слов и символов в стандартном вводе. Если вы используете параметр -l, он покажет только количество строк, что является хорошим способом увидеть, сколько файлов в каталоге!

В учебнике “Глубокий взгляд на команды архивирования и сжатия Linux” есть пример с использованием tar и 7-Zip вместе:

tar cvf - * | 7zr a -si somefiles.tar.7z

В этом случае дефис после опции f говорит tar, что его вывод должен быть отправлен в стандартный вывод, а не в файл. Вывод от tar будет передан по каналу в 7zr, который ждет ввода из стандартного ввода из-за опции -si.

Перенаправление

Перенаправление похоже на каналы, за исключением того, что используется файл, а не другая программа. Стандартный вывод для программы - это экран. Используя символ > (больше), вывод программы можно отправить в файл. Вот снова список каталога /dev, но на этот раз перенаправленный в файл с именем listing.txt

ls -la > listing.txt

На терминале ничего не будет отображаться, так как все было отправлено в файл. Вы можете просмотреть файл, используя команду cat (которую можно передать в more), или для удобства вы можете просто использовать команду more самостоятельно:

more listing.txt

Если listing.txt уже существует, он будет перезаписан. Но вы можете добавлять к существующему файлу, используя >>, вот так:

ls -la /home > listing.txt  
ls -la /dev >> listing.txt

Первое перенаправление перезапишет файл listing.txt, в то время как второе добавит в него.

Команда cat может использоваться для создания файла с помощью перенаправления, например:

cat > atextfile.txt

Теперь любой текст, который вы вводите, будет отправлен в файл atextfile.txt до тех пор, пока вы не нажмете Control-D, в этот момент файл будет закрыт, и вас вернут к командной строке. Если вы хотите добавить больше текста в файл, используйте ту же команду, но с двумя знаками больше ( >>).

Заключение

Многие программы командной строки Linux разработаны для работы с перенаправлением и каналами, попробуйте поэкспериментировать с ними и посмотрите, как они взаимодействуют. Например, вывод команды ps, которая перечисляет текущие процессы, можно переправить в grep. Попробуйте выяснить, как перечислить процессы, принадлежащие root.