Зачем процессы туда данные отправляют?
Этот пост является неким анонсом публикации про перенаправление ввода-вывода:
>, >>, |. Чтобы понять, как оно работает, следует сначала разобрать потоки данных, в которые перенаправление и происходит.
И так, у каждой программы существует 3 системных потока:
stdout,
stderr,
stdin. Потоки представляют собой сущности для транспорта информации - для простоты пока можно считать их файлами под дескрипторами 0 (
in), 1 (
out), 2 (
err):
$ cd /proc/551981/fd
$ ls
0 1 103 2 43
В примере выше мы зашли в виртуальную директорию процесса 551981 (PID), в которой хранятся дескрипторы открытых файлов. По ним, как раз, происходит чтение и запись информации.
STDIN
Данный поток используется процессом для получения информации извне. Когда мы запрашиваем какой-то ввод от пользователя, данные попадают в
stdin, после чего считываются из него программой.
Давайте запустим команду
cat:
$ cat
Hello bro
Hello bro
В примере выше
cat ожидает от пользователя ввод, который впоследствии считывается с потока
stdin (по 0 дескриптору) и направляется в поток
stdout для вывода в терминал. Как результат, мы видим дубликат нашего текста.
Никто нам также не запрещает закрыть дескриптор, отвечающий за
stdin - в таком случае программа просто не сможет получить данные.
STDOUT
Поток
stdout (дескриптор 1) отвечает за вывод информации программой. По умолчанию все, что в него попадает, выводится в терминал:
$ echo $USER
parallels
STDERR
Еще один поток вывода информации (дескриптор 2), который отвечает за отображение ошибок. Если программа не смогла сделать все как надо — она пишет именно в него. Например, когда
rm пытается удалить несуществующий файл:
$ rm example.txt
rm: example.txt: No such file or directory
Если вы вдруг не различили
stdout от
stderr либо хотите убедиться в том, что программа завершилась с ошибкой, можете воспользоваться следующей командой для получения кода возврата:
$ rm example.txt
rm: example.txt: No such file or directory
$ echo $?
1
Значение
1 говорит о том, что в программе были ошибки,
0 - все хорошо. Такой прием бывает полезен для написания скриптов автоматизации - нам иногда следует понимать, нормально ли прога отработала.
🐧 LinuxCamp