20 окт. 2000 г.

Азы linux (для детей) урок 29


Расширенные свойства перенаправлени


Существует три типа I/O (ввода-вывода), которые имеют свои собственные идентификаторы, называемые дескрипторами файла:
  • стандартный ввод: 0
  • стандартный вывод: 1
  • стандартная ошибка: 2
В следующих описаниях, если номер дескриптора файла не указан, и первый символ перенаправления оператор <, перенаправление ссылается на стандартный ввод (дескриптор файла 0). Если первый символ перенаправления оператор >, перенаправление ссылается на стандартный вывод (дескриптор файла 1).
Некоторые практические примеры внесут больше ясности:
ls > dirlist 2>&1
направит как стандартный вывод, так и стандартную ошибку в файл dirlist, в то время как команда
ls 2>&1 > dirlist
направит только стандартный вывод в dirlist. Это может быть полезным вариантом для программистов.
Существует сложность: не следует путать использование амперсанда здесь с использованием его в разделе "Интерактивные процессы", где амперсанд используется для запуска процесса в фоновом режиме. В данном случае он просто служит признаком того, что число, которое следует за ним, является не именем файла, а местом, на которое указывается потоку данных. Также отметим, что символ "больше, чем" не должен быть отделен пробелами от номера дескриптора файла. Если он будет отделен, мы снова укажем на вывод в файл. Пример ниже демонстрирует это:
[nancy@asus /var/tmp]$ ls 2> tmp

[nancy@asus /var/tmp]$ ls -l tmp
-rw-rw-r--  1 nancy nancy 0 Sept  7 12:58 tmp

[nancy@asus /var/tmp]$ ls 2 > tmp
ls: 2: No such file or directory
Первая команда, которую выполняет nancy, правильна (даже несмотря на отсутствие ошибок, и поэтому файл, в который перенаправлялась стандартная ошибка пуст). Вторая команда предполагает, что 2 - это имя файла, которого в данном случае нет, поэтому отображается ошибка.
Все эти особенности подробно описаны в info-страницах Bash.

Примеры

Анализ ошибок

Если ваш процесс порождает много ошибок, есть способ тщательно их изучить:
command 2>&1 | less
Такое часто используется при создании нового программного обеспечения с использованием команды make, так как здесь:
andy:~/newsoft> make all 2>&1 | less
--output ommitted--

Отделение стандартного вывода от стандартной ошибки

Конструкции подобные этим часто используется программистами, в результате вывод отображается в одном окне терминала, а ошибки в другом. Сначала выясняется, какой псевдо терминал вы используете выдачей команды tty.
andy:~/newsoft> make all 2> /dev/pts/7

Одновременная запись в вывод и в файлы

Вы можете использовать команду tee для копирования ввода на стандартный вывод и один или несколько выходных файлов за один раз. Использование опции -a c tee в результате добавляет ввод в файл(ы). Эта команда полезна, если вы хотите как увидеть, так и сохранить вывод. Операторы > и >> не позволяют выполнить оба действия одновременно.
Этот инструмент обычно называется подачей на конвейер (|), что демонстрируется в следующем примере:
mireille ~/test> date | tee file1 file2
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> cat file1
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> cat file2
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> uptime | tee -a file2
 11:10:51 up 21 days, 21:21, 57 users,  load average: 0.04, 0.16, 0.26

mireille ~/test> cat file2
Thu Jun 10 11:10:34 CEST 2004
 11:10:51 up 21 days, 21:21, 57 users,  load average: 0.04, 0.16, 0.26
 

Фильтры

Когда программа выполняет операции с вводом и записывает результат в стандартный вывод, она называется фильтром. Одним из наиболее распространенных видов использования фильтров является использование по реогранизованному выводу. Ниже мы обсудим несколько наиболее важных фильтров.

Дополнительная информация о grep

Как мы уже видели в разделе "Команда grep", grep сканирует строку вывода через строку поиска по определенным шаблонам. Все строки, содержащие шаблон будут распечатаны на стандартном выводе. Такое поведение может быть отменено путем использования опции -v.
Некоторые примеры: допустим, мы хотим знать, какие файлы в определенной директории были изменены в феврале:
jenny:~> ls -la | grep Feb Команда grep, как и большинство команд, учитывает регистр. Используйте опцию -i, чтобы не учитывать различие между верхним и нижним регистром. Также доступны многие расширения GNU, например --color, который полезен для подсветки терминов поиска в длинных строках, и --after-context, который печатает число строк после последней совпавшей строки. Вы можете оформить рекурсивных grep, который ищет во всех подкаталогах встречающихся каталогов, с помощью опции -r. Как обычно, опции могут быть объединены.
Регулярные выражения могут быть использованы для более подробной детализации совпадений, которые вы хотите выбрать из всех строк ввода. Лучшим способом познакомиться с регулярными выражениями является чтение документации по grep. Отличная глава включена в info-страницу grep. Поскольку обсуждение вводов и выводов регулярных выражений завело бы нас слишком далеко, настоятельно рекомендуется начать с документации, если вы хотите знать о них больше.
Поиграйте немного с grep, это займет у вас какое-то время для изучения этой самой базовой, но очень мощной команды фильтрации. Упражнения в конце этой главы помогут вам начать работу, см. раздел 5.5. "Упражнения".

Фильтрация вывода

Команда sort по умолчанию сортирует строки в алфавитном порядке:
thomas:~> cat people-I-like | sort Auntie Emmy Boyfriend Dad Grandma Mum My boss Но есть множество другого, что sort может делать. Просмотр размера файла, например. С помощью этой команды, содержимое каталога сортируется от наименьших файлов в начале, до самых больших в конце:
ls -la | sort -nk 5
Старый синтаксис sort.
Вы можете получить тот же результат с ls -la | sort +4n, но это старая форма, которая не соответствует текущим стандартам.
Команда sort также используется в сочетании с программой uniq (или sort -u) для сортировки вывода и отфильтровывания двойных записей:
thomas:~> cat itemlist 1 4 2 5 34 567 432 567 34 555 thomas:~> sort itemlist | uniq 1 2 34 4 432 5 555 567