1 авг. 2008 г.

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

Например, представьте себе, что вам надо получить список файлов, оканчивающихся на .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
который выдаст вам искомый результат. Оператор < - это оператор перенаправления ввода, а дескриптором по умолчанию, который перенаправляется этим оператором, является стандартный ввод, т.е. 0, и вы можете ввести просто строку:

wc -l 
Теперь представьте, что вам нужно удалить все «расширения» файлов и поместить результат в другой файл. Одной из утилит для выполнения этого является sed (Stream EDitor - потоковый редактор). Вы просто перенаправляете стандартный ввод sed в файл file_list, а его вывод перенаправляете в результирующий файл, т.е. the_list:

sed -e 's/\.png$//g' the_list
и ваш список создан, готовый для просмотра в удобное для вас время любой из программ просмотра.
Также полезным может оказаться перенаправление стандартных ошибок. Например, вам нужно узнать, к каким каталогам в /shared у вас нет доступа: одним из решений будет рекурсивное получение списка файлов в этом каталоге и перенаправление ошибок в файл, не показывая при этом стандартного вывода:

ls -R /shared >/dev/null 2>errors
это означает, что стандартный вывод будет перенаправлен (>) в специальный файл /dev/null, в котором удаляется все, что вы в него записываете (т.е. стандартный вывод не отображается), а поток стандартных ошибок (2) перенаправляется (>) в файл errors.

Комментариев нет: