Wiki

Перенаправление команд

Стандартный ввод (вход) - "stdin" в ОС UNIX осуществляется с клавиатуры терминала, а стандартный вывод (выход) - "stdout" направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений - "stderr", о котором речь будет чуть позже.

Команда, которая может работать со стандартным входом и выходом, называется ФИЛЬТРОМ.
Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы ">" и ">>" обозначают перенаправление вывода.

	ls >f1

команда "ls" сформирует список файлов текущего каталога и поместит его в файл "f1" (вместо выдачи на экран). Если файл "f1" до этого существовал, то он будет затерт новым.
     pwd >>f1

команда pwd сформирует полное имя текущего каталога и поместит его в конец файла "f1", т.е. ">>" добавляет в файл, если он непустой.

Символы "<" и "<<" обозначают перенаправление ввода.

     wc -l <f4   и   wc -l >f4  f2

Данный конвейер из файла "f1" ("cat") выберет все строки, содержащие слово "result" ("grep"), отсортирует ("sort")
полученные строки, а затем пронумерует ("cat -b") и выведет результат в файл "f2".

Поскольку устройства в ОС UNIX представлены специальными файлами, их можно использовать при перенаправлениях. Специальные файлы находятся в каталоге "/dev". Например, "lp" - печать; "console" - консоль; "ttyi" - i-ый терминал; "null" - фиктивный (пустой) файл (устройство).
Тогда, например,

     ls > /dev/lp

выведет содержимое текущего каталога на печать, а
     f1 < /dev/null  обнулит  файл "f1".
 
     sort f1 | tee /dev/lp | tail -20

В этом случае будет отсортирован файл "f1" и передан на печать, а 20 последних строк также будут выданы на экран.

Вернемся к перенаправлению выхода. Стандартные файлы имеют номера: 0 - stdin, 1 - stdout и 2 - stderr. Если вам не желательно иметь на экране сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл (или вообще "выбросить", перенаправив в файл "пустого устройства" - /dev/null). Например при выполнении команды

     cat f1 f2

которая должна выдать на экран последовательно содержимое файлов "f1" и "f2", выдаст вам, например, следующее
    111111 222222
 
    cat: f2: No such file or directory

где 111111 222222 - содержимое файла "f1", а файл "f2" отсутствует, о чем команда "cat" выдала сообщение в стандартный файл диагностики, по умолчанию, как и стандартный выход, представленный экраном.

Если вам не желательно такое сообщение на экране, его можно перенаправить в указанный вами файл:

     cat f1 f2 2>f-err

сообщения об ошибках будут направляться (об этом говорит перенаправление "2>") в файл "f-err". Кстати, вы можете всю
информацию направлять в один файл "ff", использовав в данном случае конструкцию
     cat f1 f2 >>ff 2>ff

Можно указать не только какой из стандартных файлов перенаправлять, но и в какой стандартный файл осуществить перенаправление.
     cat f1 f2 2>>ff 1>&2

Здесь сначала "stderr" перенаправляется (в режиме добавления) в файл "ff", а затем стандартный выход перенаправляется на "stderr", которым к этому моменту является файл "ff". То есть результат будет аналогичен предыдущему.

Конструкция "1>&2" - означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить "&"; вся конструкция пишется без пробелов.

  • <&- - закрывает стандартный ввод.
  • >&- - закрывает стандартный вывод.