Понимание каналов и перенаправления в командной строке Linux
Две мощные функции командной строки Linux - это перенаправление и каналы, которые позволяют вывод (или даже ввод) программы отправлять в файл или другую программу. Возможно, вы уже использовали эти функции, не осознавая этого. Каждый раз, когда вы использовали знак “ > ” в команде или “ | ”, вы использовали перенаправление или канал соответственно.
Во всех UNIX-подобных операционных системах, таких как Linux и FreeBSD, вывод из программы командной строки автоматически отправляется в место, известное как стандартный вывод (stdout). По умолчанию стандартный вывод - это экран (консоль), но это можно изменить с помощью каналов и перенаправления. Аналогично, клавиатура считается стандартным вводом (stdin), и, как и стандартный вывод, ее можно изменить.
Каналы
Каналы позволяют направлять вывод из одной команды в другую, где он будет использоваться как ввод. Другими словами, стандартный вывод из одной программы становится стандартным вводом для другой.
Команда “ more ” принимает стандартный ввод и разбивает его на страницы на стандартном выводе (экран). Это означает, что если команда отображает больше информации, чем можно показать на одном экране, программа “ more ” приостановится после первого полного экрана (страницы) и будет ждать, пока пользователь нажмет SPACE, чтобы увидеть следующую страницу, или RETURN, чтобы увидеть следующую строку.
Вот пример, который перечисляет все файлы с деталями ( -la) в каталоге /dev и передает вывод в more. В каталоге /dev должно быть десятки файлов, и, следовательно, убедитесь, что more нужно будет разбить на страницы.
ls -la /dev | more
Обратите внимание на подсказку --More-- внизу экрана. Нажмите SPACE, чтобы увидеть следующую страницу, и продолжайте нажимать SPACE, пока вывод не закончится.
Вот еще один пример канала, на этот раз с использованием инструмента “ wc ” (счетчик слов).
ls -1 /dev | wcwc считает количество строк, слов и символов в стандартном вводе. Если вы используете параметр -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.