Стандартный потоки Linux: stdin, stdout, stderr

Чтобы программы можно было использовать вместе необходим способ передачи данных из одной программы в другую. В Linux такой механизм реализован через стандартные потоки, всего их три:

  • stdin — стандартный ввод
  • stdout — стандартный вывод
  • stderr — стандартный вывод ошибок

Большинство программ умеют принимать данные через stdin и возвращать данные через stdout. Для примера, запустим следующий скрипт на Python в консоли:

print('Стандартный вывод')
raise Exception('Стандартный поток ошибок')
1
2
python3 script.py
Стандартный вывод
Traceback (most recent call last):
  File "/home/user/test/script.py", line 2, in <module>
    raise Exception('Стандартный поток ошибок')
Exception: Стандартный поток ошибок
1
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: Стандартный поток ошибок
1
2
3
4
5
cat log.txt
Стандартный вывод
1
2

Для перенаправления патока ошибок аналогичная команда 2>:

python3 script.py 2> err.txt
Стандартный вывод
1
2
cat err.txt 
Traceback (most recent call last):
  File "/home/user/test/script.py", line 2, in <module>
    raise Exception('Стандартный поток ошибок')
Exception: Стандартный поток ошибок
1
2
3
4
5

Цифра 2 означает номер потока, все три потока имеют номера: stdin — 0, stdout — 1, stderr — 2. Поэтому для перенаправления потока вывода можно так же написать 1>. Команды 1> и 2> переписывают файл, если же нужно только дописывать в файл, то используются следующие команды: 1>> и 2>>. Если нужно перенаправить оба потока в файл, то используется команда &>.

python3 script.py &> log.txt
1
cat log.txt
Стандартный вывод
Traceback (most recent call last):
  File "/home/petro/Desktop/test/script.py", line 2, in <module>
    raise Exception('Стандартный поток ошибок')
Exception: Стандартный поток ошибок
1
2
3
4
5
6

Для того чтобы на стандартный ввод программы поступили данные из файла используется команда <.

grep root -c < /etc/passwd
2
1
2

Все вышеперечисленные команды перенаправляют потоки в файл и из файла. Команда | переправляет stdout одной программы в stdin другой. С помощью этой команды можно строить цепочки программ с последовательной обработкой данных.

cat /etc/passwd | grep user | head
1

Кроме вышеуказанных перенаправлений ввода есть ещё две похожие команды управляющие потоками данных. Первая команда <<< позволяет передать на стандартный поток ввода строку текста.

user@debian-server:~/test$ cat file.txt 
file.txt
user@debian-server:~/test$ cat - file.txt <<< "stdin input"
stdin input
file.txt
1
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
1
2
3
4
5
6
7

Вместо EOF можно использовать любой маркер начала и окончания ввода данных.

Последниее изменение: 20.12.2023, 16:26:33