Стандартный потоки Linux: stdin, stdout, stderr
Чтобы программы можно было использовать вместе необходим способ передачи данных из одной программы в другую. В Linux такой механизм реализован через стандартные потоки, всего их три:
stdin
— стандартный вводstdout
— стандартный выводstderr
— стандартный вывод ошибок
Большинство программ умеют принимать данные через stdin
и возвращать данные через stdout
. Для примера, запустим следующий скрипт на Python в консоли:
print('Стандартный вывод')
raise Exception('Стандартный поток ошибок')
2
python3 script.py
Стандартный вывод
Traceback (most recent call last):
File "/home/user/test/script.py", line 2, in <module>
raise Exception('Стандартный поток ошибок')
Exception: Стандартный поток ошибок
2
3
4
5
6
Такой результат получается из-за того, что консоль при запуске программы выводит все что программа передает в stdout
и в stderr
. Для переправления stdout
в файл используется команда >
:
python3 script.py > log.txt
Traceback (most recent call last):
File "/home/user/test/script.py", line 2, in <module>
raise Exception('Стандартный поток ошибок')
Exception: Стандартный поток ошибок
2
3
4
5
cat log.txt
Стандартный вывод
2
Для перенаправления патока ошибок аналогичная команда 2>
:
python3 script.py 2> err.txt
Стандартный вывод
2
cat err.txt
Traceback (most recent call last):
File "/home/user/test/script.py", line 2, in <module>
raise Exception('Стандартный поток ошибок')
Exception: Стандартный поток ошибок
2
3
4
5
Цифра 2 означает номер потока, все три потока имеют номера: stdin
— 0, stdout
— 1, stderr
— 2. Поэтому для перенаправления потока вывода можно так же написать 1>
. Команды 1>
и 2>
переписывают файл, если же нужно только дописывать в файл, то используются следующие команды: 1>>
и 2>>
. Если нужно перенаправить оба потока в файл, то используется команда &>
.
python3 script.py &> log.txt
cat log.txt
Стандартный вывод
Traceback (most recent call last):
File "/home/petro/Desktop/test/script.py", line 2, in <module>
raise Exception('Стандартный поток ошибок')
Exception: Стандартный поток ошибок
2
3
4
5
6
Для того чтобы на стандартный ввод программы поступили данные из файла используется команда <
.
grep root -c < /etc/passwd
2
2
Все вышеперечисленные команды перенаправляют потоки в файл и из файла. Команда |
переправляет stdout
одной программы в stdin
другой. С помощью этой команды можно строить цепочки программ с последовательной обработкой данных.
cat /etc/passwd | grep user | head
Кроме вышеуказанных перенаправлений ввода есть ещё две похожие команды управляющие потоками данных. Первая команда <<<
позволяет передать на стандартный поток ввода строку текста.
user@debian-server:~/test$ cat file.txt
file.txt
user@debian-server:~/test$ cat - file.txt <<< "stdin input"
stdin input
file.txt
2
3
4
5
Параметр -
заставляет команду cat
принимать ввод не только из файлов, но и из stdin
.
Команда <<
делает тоже самое, но позволяет передать многострочные текст.
user@debian-server:~/test$ cat - file.txt << EOF
> first line
> second line
> EOF
first line
second line
file.txt
2
3
4
5
6
7
Вместо EOF
можно использовать любой маркер начала и окончания ввода данных.