Васильев Андрей Михайлович, 2024
Версии презентации
В момент запуска процесса ему выделяются стандартные потоки для ввода и вывода информации
0
, stdin
— стандартный поток ввода1
, stdout
— стандартный поток вывода2
, stderr
— стандартный поток вывода сообщений об ошибкахПроцесс, инициирующий запуск другого процесса, определяет на какие файловые дескрипторы будут переданы работающему процессу
Процесс во время своей работы может самостоятельно изменить направление потоков, однако эта возможность используется в основном управляющими процессами (например интерпретатором Bash)
ls
#
Приложение ls
не использует стандартный поток ввода, данные ему передаются
исключительно через аргументы
stdout
используется для вывода списка файловstderr
используется для вывода информации об ошибкахПример вывода на стандартный поток вывода:
$ ls -1 /tmp
mc-andrey
mozilla_andrey0
...
Пример вывода на поток ошибок:
$ ls /abc
ls: невозможно получить доступ к '/abc': Нет такого файла или каталога
Без применения специальных действий различить два вывода мы не сможем
Bash позволяет перенаправить поток вывода любой команды в файла
КОМАНДА > output_log.txt
Результат работы команды будет записан в файл output_log.txt
ls
#
$ ls -l /usr/bin > /tmp/ls-output.txt
$
В результате запуска пользователю не будет выведено никакой информации, а она
будет записана в файл /tmp/ls-output.txt
echo
#
Поток вывода можно перенаправлять и для встроенных команд Bash
echo 'Hello, world!' > text.txt
В результате будет создан файл text.txt
с содержимым 'Hello, world!'
Помимо touch
можно воспользоваться перенаправлением вывода для создания пустых
файлов
> empty.txt
Пустая команда не выводит ничего, в результате будет создан файл empty.txt
С технической точки зрения перенаправление потока выглядит следующим образом:
>
w
, запись с начала
Помимо перезаписи файла Bash может добавлять результаты в конец текстового файла
Синтаксис:
КОМАНДА >> output_log.txt
Стандартный поток вывода будет записан в конец файла output_log.txt
В отличие от предыдущей формы файл открывается с флагом a
ls
#
$ ls -l /usr/bin > ls-output.txt
$ ls -l /usr/bin >> ls-output.txt
В результате выполнения этой последовательности в файле ls-output.txt
будет
находиться два вывода результата запуска команды ls -l /usr/bin
stderr
#
stderr
#
$ ls -l /some > ls-info.txt
ls: невозможно получить доступ к '/some': Нет такого файла или каталога
Хотя stdout
был перенаправлен, но приложение всё-равно вывело информацию пользователю
stderr
#
Синтаксис:
КОМАНДА 2> error-info.txt
В результате будет создан файл error-info.txt
, содержащий информацию из потока
stderr
запущенной команды
Все данные из потока stdout
будут показаны пользователю
Бывает так, что приложение посылает много информации на поток stderr
и мы хотим его игнорировать. Для этих целей можно воспользоваться специальным файлом /dev/null
:
КОМАНДА 2> /dev/null
Все данные, которые записываются в файл /dev/null
, пропадают. Это могут использовать любые приложения
Для решения этой задачи надо сначала перенаправить stdout
в один файл, а затем
перенаправить поток stderr
в поток stdout
:
КОМАНДА > output.txt 2>&1
Форма записи 2>&1
говорит, что поток №2 надо связать с потоком №1
КОМАНДА 2>&1 > output.txt
Такая запись свяжет сначала поток ошибок со стандартным потоком вывода, а после
уже перенаправит поток вывода в файл output.txt
. В результате будет
перенаправлен только стандартный поток вывода
Если надо перенаправить все потоки в один файл, то можно воспользоваться &>
:
КОМАНДА &> output.txt
КОМАНДА &>> output.txt
В результате запуска весь вывод будет добавлен в конец файла output.txt
cat
#
$ cat --help
Использование: cat [КЛЮЧ]… [ФАЙЛ]…
Печатает слияние ФАЙЛ(ов) на стандартный вывод.
Приложение считывает файлы, пути к которым переданы через аргументы, и выводит результат на стандартный поток вывода
Самое простое применение — чтение текстовых файлов
Если не cat
не указать файлы, то оно берёт информацию со стандартного потока
ввода
Если перенаправить поток вывода в файл, то данные с потока ввода будут сразу записываться в файл
cat > data.txt
Для завершения работы приложения надо послать сигнал завершения потока Ctrl+D
Для перенаправления потока ввода у процесса надо использовать следующий синтаксис:
КОМАНДА < input.txt
В результате поток ввода будет команды будет получать данные из файла
input.txt
Вместе с cat
его можно использовать для чтения файла:
$ cat < input.txt
...
При написании консольных программ часто приходится повторять одни и те же действия для проверки работы приложения. Для решения этой задачи удобно
В этом случае вам не придётся повторять ввод данных множество раз
Большинство интерактивных приложений могут использовать другие способы по взаимодействию с пользователем и не поддерживают такой формат тестирования, но предоставляют более удобные псевдографические элементы для взаимодействия