Две мощные функции оболочки командной строки Linux — это перенаправление и каналы, которые позволяют отправлять выходные данные (или даже входные данные) программы в файл или другую программу. Возможно, вы уже использовали эти функции, даже не подозревая об этом. Всякий раз, когда вы использовали знак «>
» в команде или «|
», вы использовали перенаправление или канал соответственно.
Во всех Unix-подобных операционных системах, таких как Linux и FreeBSD, выходные данные программы командной строки автоматически передаются в место, известное как стандартный вывод (stdout). По умолчанию стандартным выходом является экран (консоль), но его можно изменить с помощью каналов и перенаправления. Аналогично, клавиатура считается стандартным вводом (stdin) и, как и стандартный вывод, ее можно изменить.
Трубы
Конвейеры позволяют направлять выходные данные одной команды в другую, где они будут использоваться в качестве входных данных. Другими словами, стандартный вывод одной программы становится стандартным вводом для другой.
Команда «more
» принимает стандартный ввод и разбивает его на страницы на стандартном выводе (на экране). Это означает, что если команда отображает больше информации, чем можно отобразить на одном экране, программа «more
» приостановится после заполнения первого экрана (страницы) и будет ждать, пока пользователь нажмет ПРОБЕЛ, чтобы увидеть следующую страницу или RETURN, чтобы увидеть следующую строку.
Вот пример, в котором будут перечислены все файлы с подробностями (-la
) в каталоге /dev
и передан вывод в more
.. В каталоге /dev
должно быть множество файлов, поэтому more
необходимо разбивать на страницы.
ls -la /dev | more
Обратите внимание на подсказку --More--
внизу экрана. Нажмите ПРОБЕЛ, чтобы просмотреть следующую страницу, и продолжайте нажимать ПРОБЕЛ, пока вывод не завершится.
Вот еще один пример канала, на этот раз с использованием инструмента «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 command
. отдельно:
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.