Для понимания того, что такое переназначения и каналы, нам нужно пояснить понятие о процессах, которое еще не рассматривалось. Каждый процесс UNIX (что касается и графических приложений) открывает минимум три файловых дескриптора: стандартный ввод, стандартный вывод и стандартный поток ошибок. Их соответствующие номера это 0, 1 и 2. В общем случае, эти три дескриптора ассоциируются с терминалом, из которого процесс был запущен. Задача перенаправлений и каналов - перенаправить эти дескрипторы. Примеры в данном разделе помогут вам лучше понять эту концепцию.
Представьте, например, что вам нужен список файлов с окончаниями в именах на .png [6] в каталоге images. Этот список очень длинный, и поэтому вы можете пожелать сохранить его в файл для того, чтобы потом просмотреть его на досуге. Вы можете выполнить следующую команду:
$ ls images/*.png 1>file_list |
Это значит, что стандартный вывод этой команды (1) перенаправлен (>) в файл с именем file_list. Оператор > является оператором перенаправления вывода. Если файл для перенаправления не существует, он будет создан, а если существует, то его предыдущее содержимое будет перезаписано. Однако, дескриптор по умолчанию перенаправленный этим оператором, сам является стандартным выводом и его не обязательно указывать в командной строке. Таким образом можно написать проще:
$ ls images/*.png >file_list |
и получить тот же результат. Затем вы можете посмотреть файл, используя просмотрщик текстовых файлов, например less.
Теперь представьте, что вам нужно узнать, сколько таких файлов существует. Вместо того, чтобы считать их вручную, вы можете использовать утилиту под названием wc (Word Count (подсчет слов)) с параметром -l, которая выведет в стандартный вывод количество строк в файле. Одно из решений следующее:
wc -l 0<file_list |
и это даст ожидаемый результат. Оператор < является оператором перенаправления ввода, а перенаправляющий дескриптор по умолчанию есть стандартный ввод, то есть 0, и вы может просто написать:
wc -l <file_list |
Теперь предположим, что мы хотим убрать все “расширения” файлов и положить результат в другой файл. Одним из инструментов для выполнения этого является sed (Stream EDitor (редактор потока)). Вы просто перенаправляете стандартный ввод sed в файл file_list и перенаправляете его вывод в результирующий файл the_list:
sed -e 's/\.png$//g' <file_list >the_list |
и ваш список создан и готов для просмотра на досуге любым просмотрщиком.
Очень полезно перенаправлять стандартный поток ошибок. Например, вы хотите узнать, какие каталоги в /shared для вас недоступны: одно из решений это создать список этого каталога и перенаправить ошибки в файл, не отображая при этом стандартного вывода:
ls -R /shared >/dev/null 2>errors |
что обозначает, что стандартный вывод был перенаправлен (>) в /dev/null, специальный файл, в котором теряется все, что в него пишется, (то есть не отображается стандартный вывод) и стандартный канал ошибок (2) перенаправлен (>) в файл errors.
Каналы (pipes, трубы) служат для комбинации перенаправления ввода и вывода. Принцип подобен физической трубе, что следует из названия: один процесс посылает данные в конец трубы, а другой процесс читает данные на другом конце трубы. Оператор канала это |. Давайте вернемся к примеру со списком файлов, описанному выше. Допустим, что вы хотите найти без сохранения списка во временный файл, сколько соответствующих файлов находится в нем . Тогда вы можете использовать следующую команду:
ls images/*.png | wc -l |
что значит, что стандартный вывод команды ls перенаправлен в стандартный ввод команды wc. Это приведет вас к желаемому результату.
Вы также можете прямо сложить вместе список файлов без расширений, используя следующую команду:
ls images/*.png | sed -e 's/\.png$//g' >the_list |
или, если вам надо просмотреть список без сохранения в файл:
ls images/*.png | sed -e 's/\.png$//g' | less |
Каналы и перенаправления предназначены не только для текста, который можно читать. Например, следующая команда, посланная из Terminal:
xwd -root | convert - ~/my_desktop.png |
выдаст скриншот вашего рабочего стола в файл my_desktop.png [7] в вашем домашнем каталоге.
[6] Возможно, вы подумаете, что безумно говорить так “файлы с окончаниями на .png”, вместо того, чтобы сказать “PNG картинки”. Однако, напомним еще раз, что файлы под UNIX имеют расширения только по соглашению: расширения ни в коем случае не определяют тип файла. Файл, имеющий окончание .png, вполне может быть картинкой JPEG, файлом приложения, текстовым файлом или любым другим. Кстати, то же самое и под Windows !
[7] Да, это будет действительно картинка PNG (однако, пакет ImageMagick должен быть инсталлирован в системе...).