Перенаправление (UNIX) | это... Что такое Перенаправление (UNIX)? (original) (raw)
У этого термина существуют и другие значения, см. Перенаправление.
В информатике перенаправление — это возможность присущая многим командным оболочкам, таким как командные оболочки UNIX, позволяющая перенаправлять стандартные потоки в определенное пользователем место, например в файл.
Содержание
- 1 Перенаправление стандартных потоков ввода вывода
- 2 Конвейеры
- 3 Перенаправление в/из стандартных файловых дескрипторов
- 4 Цепочка конвейеров
- 5 Перенаправление в несколько выводов
- 6 Перенаправление с добавлением
- 7 Встроенный документ
- 8 Внешние ссылки
Перенаправление стандартных потоков ввода вывода
Перенаправление обычно осуществляется вставкой специального символа > между командами. Обычно синтаксис выглядит так:
команда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 под именем ИмяПользователя, нажимает Enter и затем вводит пароль Пароль.
Перенаправление в/из стандартных файловых дескрипторов
В командной оболочке UNIX, произошедшей из Bourne shell, предыдущие два действия можно усовершенствовать, указав номер(файловый дескриптор) непосредственно перед символом перенаправления. Этот номер указывает какой именно поток используется для перенаправления. В UNIX существуют следующие стандартные потоки ввода/вывода:
Дескриптор | Название | Описание |
---|---|---|
0 | stdin | Стандартный ввод |
1 | stdout | Стандартный вывод |
2 | stderr | Стандартный вывод ошибок |
К примеру:
команда1 2> файл1
выполняет команду1 направляя стандартный поток ошибок в файл1
В командных оболочках произошедших от C Shell по правилам синтаксиса для указания потока, в который осуществляется перенаправление нужно добавлять символ & после символа перенаправления.
Часто стандартный поток ошибок объединяют со стандартным потоком вывода, чтобы можно было обрабатывать ошибки и обычные результаты работы программы вместе. К примеру:
find / -name .profile > результаты 2>&1
попытается найти все файлы с именем .profile. Если выполнять эту команду без перенаправлений она будет направлять результаты поиска в stdout, а сообщения об ошибках(к примеру о недостаточности прав доступа при попытке поиска в защищенных директориях) в stderr. По умолчанию эти роли выполняет консоль. Если стандартный поток вывода направлен в файл результаты, то ошибки по-прежнему будут направляться в консоль. Чтобы и ошибки и результаты поиска направлялись в файл результаты стандартные потоки ошибок и вывода были объединены используя 2>&1.
Написание 2>&1 перед > не будет работать, так как когда интерпретатор прочитает 2>&1, он ещё не знает куда перенаправлен стандартный поток вывода, поэтому потоки ошибок и вывода не будут объединены.
Если объединенный результат нужно направить на вход другой программы посредством конвейера, тогда последовательность 2>&1 должна стоять перед знаком конвейера. К примеру:
find / -name .profile 2>&1 | less
Упрощенная форма записи команды:
команда > файл 2>&1
выглядит так:
команда &> файл
или
команда >& файл
Цепочка конвейеров
Команды перенаправления и конвейеризации могут быть объединены в цепочки для получения более сложных команд, к примеру:
ls | grep '.sh' | sort > shlist
Получает список содержимого текущей директории, который фильтруется, оставляя только строки содержащие '.sh', затем этот отфильтрованный список лексически сортируется и окончательный результат помещается в файл shlist. Конструкции подобного типа часто встречаются в скриптах командной оболочки UNIX.
Перенаправление в несколько выводов
Стандартная команда tee может перенаправить вывод команды в несколько мест одновременно. Пример:
ls -lrt | tee файл1
направляет стандартный вывод команды ls -lrt (список файлов) как в консоль так и в файл1.
Перенаправление с добавлением
В командной оболочке Bash можно осуществить перенаправление в файл с добавлением в конец. При этом информация, хранящаяся в файле не будет удалена, а вся новая информация будет добавлена в конец этого файла. Синтаксис:
команда1 >> файл1
Встроенный документ
Некоторые оболочки, и даже прикладные ЯВУ (PHP, Perl) допускают синтаксис встроенных документов (см. Heredoc-синтаксис), позволяющий направлять входной поток из самого файла программы, например:
cat<<EOF Здесь помещается произвольный текст, в том числе включающий в себя специальные символы EOF
Завершающая сигнатура окончания встроенного документа EOF (можно использовать произвольное значение, но часто используется именно EOF - соответственно смыслу) должна начинаться с начала строки.
Внешние ссылки
- Redirection Definition by The Linux Information Project (LINFO)
- Перенаправления в Windows
- Стандартные потоки ввода/вывода на Xgu.ru — подробно об использовании потоков ввода/вывода в UNIX/Linux, о перенаправлении, каналах, именованных каналах, программах-фильтрах и многих тонкостях их использования