Перенаправление ввода-вывода

Перенаправление ввода-вывода — возможность командной оболочки ряда операционных систем перенаправлять стандартные потоки в определённое пользователем место, например, в файл. Характерна для Unix-подобных операционных систем, но в разной степени реализована и в операционных системах других семейств.

Перенаправление стандартных потоков ввода вывода 
Перенаправление обычно осуществляется вставкой специального символа > между командами.
Обычно синтаксис выглядит так: команда1 > файл1 — выполняет команду1, помещая стандартный вывод в файл1; команда1 < файл1 выполняет команду1, используя в качестве источника ввода файл1 (вместо клавиатуры).
На каждый запрос ввода программы считывается одна строка текста из файла. Конструкция команда1 < файл1 > файл2 совмещает два предыдущих варианта: выполняет команду1 ввода из файла1 и вывода в файл2.

Конвейеры 

Конвейеры — это возможность нескольких программ работать совместно, когда выход одной программы непосредственно идет на вход другой без использования промежуточных временных файлов. Синтаксис: команда1 | команда2, выполняет команду1 используя её поток вывода как поток ввода при выполнении команды2, что равносильно использованию двух перенаправлений и временного файла:
 команда1 > ВременныйФайл
 команда2 < ВременныйФайл
 rm ВременныйФайл

Хороший пример командных конвейеров — это объединение echo с другой командой для получения интерактивности в неинтерактивных средах, к примеру:
 echo -e "ИмяПользователя\nПароль" | ftp localhost

Здесь запускается ftp-клиент, который подключается к локальному узлу (localhost). На запрос программы водит первую строку ИмяПользователя, затем на следующий запрос ввода считывает строку Пароль. Строки в команде echo разделены через \n.

Перенаправление из стандартных файловых дескрипторов 
В командной оболочке Unix, произошедшей из Bourne shell, предыдущие два действия можно усовершенствовать, указав номер (файловый дескриптор) непосредственно перед символом перенаправления. Этот номер указывает, какой именно поток используется для перенаправления. В Unix существуют следующие стандартные потоки ввода-вывода:

К примеру: команда1 2> файл1 выполняет команду1, направляя стандартный поток ошибок в файл1.

В командных оболочках, произошедших от C Shell, по правилам синтаксиса для указания потока, в который осуществляется перенаправление, нужно добавлять символ & после символа перенаправления.

Часто стандартный поток ошибок объединяют со стандартным потоком вывода, чтобы можно было обрабатывать ошибки и обычные результаты работы программы вместе. К примеру:

 find / -name .profile > results.txt 2>&1

попытается найти все файлы с именем .profile. Если выполнять эту команду без перенаправлений, она будет направлять результаты поиска в stdout, а сообщения об ошибках (к примеру, о недостаточности прав доступа при попытке поиска в защищённых каталогах) в stderr. По умолчанию эти роли выполняет консоль. Если стандартный поток вывода направлен в файл results.txt, то ошибки по-прежнему будут направляться в консоль. Чтобы и ошибки, и результаты поиска направлялись в файл results.txt, стандартные потоки ошибок и вывода были объединены с использованием 2>&1.

Написание 2>&1 перед > не будет работать, так как когда интерпретатор прочитает 2>&1, он ещё не знает, куда перенаправлен стандартный поток вывода, поэтому потоки ошибок и вывода не будут объединены.

Если объединённый результат нужно направить на вход другой программы посредством конвейера, тогда последовательность 2>&1 должна стоять перед знаком конвейера |. К примеру:
 find / -name .profile 2>&1 | less.

Упрощённая форма записи команды: команда > файл 2>&1 выглядит так: команда &> файл или
 команда >& файл

Цепочка конвейеров 
Команды перенаправления и конвейеризации могут быть объединены в цепочки для получения более сложных команд, к примеру:

 ls | grep '.sh' | sort > shlist

получает список содержимого текущего каталога, который фильтруется, оставляя только строки содержащие '.sh', затем этот отфильтрованный список лексически сортируется и окончательный результат помещается в файл shlist. Конструкции подобного типа часто встречаются в сценариях командной оболочки.

Перенаправление в несколько выводов 
Стандартная команда tee может перенаправить вывод команды в несколько мест одновременно. Пример:
 ls -lrt | tee файл1

направляет стандартный вывод команды ls -lrt (список файлов) как в консоль так и в файл1.

Перенаправление с добавлением 
В командной оболочке Bash можно осуществить перенаправление в файл с добавлением в конец. При этом информация, хранящаяся в файле, не будет удалена, а вся новая информация будет добавлена в конец этого файла. Синтаксис: команда1 >> файл1

Встроенный документ 
Некоторые оболочки, и даже прикладные языки высокого уровня (PHP, Perl) допускают синтаксис встроенных документов (см. Heredoc-синтаксис), позволяющий направлять входной поток из самого файла программы, например, на стандартный поток вывода:
 cat<<'EOF'
 Здесь помещается произвольный текст,
 в том числе — включающий в себя специальные символы
 EOF

Или в файл с добавлением в конец:
 cat<<'EOF'>>файл
 Здесь помещается произвольный текст,
 в том числе — включающий в себя специальные символы
 EOF
Завершающая сигнатура окончания встроенного документа EOF (можно использовать произвольное значение, но часто используется именно EOF — соответственно смыслу) должна начинаться с начала строки.

Ссылки 
 Redirection Definition by The Linux Information Project (LINFO)
 Перенаправления в Windows
 Стандартные потоки ввода-вывода на Xgu.ru — подробно об использовании потоков ввода-вывода в UNIX/Linux, о перенаправлении, каналах, именованных каналах, программах-фильтрах и многих тонкостях их использования

Unix
DOS
Текстовый интерфейс
Ввод-вывод