Interested Article - Перенаправление ввода-вывода
- 2020-05-07
- 2
Перенаправление ввода-вывода — возможность командной оболочки ряда операционных систем перенаправлять стандартные потоки в определённое пользователем место, например, в файл. Характерна для 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 — соответственно смыслу) должна начинаться с начала строки.
Ссылки
- by The Linux Information Project (LINFO)
- — подробно об использовании потоков ввода-вывода в UNIX/Linux, о перенаправлении, каналах, именованных каналах, программах-фильтрах и многих тонкостях их использования
- 2020-05-07
- 2