Перенаправление ввода-вывода
Перенаправление ввода-вывода — возможность командной оболочки ряда операционных систем перенаправлять стандартные потоки в определённое пользователем место, например, в файл. Характерна для 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 существуют следующие стандартные потоки ввода-вывода:
Дескриптор | Название | Описание |
---|---|---|
0 | stdin | Стандартный ввод |
1 | stdout | Стандартный вывод |
2 | stderr | Стандартный вывод ошибок |
К примеру: команда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, о перенаправлении, каналах, именованных каналах, программах-фильтрах и многих тонкостях их использования