Как (и почему) используют stderr и для чтения и для записи?

Оказывается, они действительно эквивалентны, согласно man zshbuiltins (раздел "disown"): просто синтаксические альтернативы для одной и той же операции.

Anticlimactic…

12
30.06.2018, 20:22
2 ответа

Сначала я удивился. Однако после прочтения ответов и небольшого расследования все кажется простым. Итак, вот что я нашел. (В итоге не было ничего удивительного.)

Перед перенаправлением stdin, stdout и stderr, как и ожидалось, подключены к одному и тому же устройству.

#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdout -> /proc/self/fd/1

#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12

Следовательно, после большинства перенаправлений -(, то есть если stderr )не перенаправляется. stderr все еще подключен к терминалу. Поэтому его можно прочитать, чтобы получить ввод с клавиатуры.

Единственное, что мешает использовать файлы в неожиданном направлении, — это условность и однонаправленность каналов.

Другой пример, попробуйте:

cat | less

Это происходит после страницы, когда lessпытается прочитать терминал (, это не удивительно, так как catтакже читает терминал ).

/dev/ttyболее загадочен, это не ссылка на /proc/self.

#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty

См. какие отношения между моим текущим управляющим терминалом и `/dev/tty `? для объяснения. Спасибо @StephenKitt за ссылку.

8
27.01.2020, 19:56

Когда вы входите в систему, stdin, stdout и stderr подключаются к терминалу, с которого вы входите в систему. Точнее, tty обычно открывается, а stdout и stderr являются результатом двух dup(2)операций на первом дескриптор файла. Это позволяет читать из stderr, чтобы получить ввод от терминала.

Как упоминалось в другом ответе, программы читают из stderr, чтобы получить интерактивный ответ на вопрос.

Поскольку пользователь не может знать, при каких обстоятельствах программа читает из stderr, это бесполезная попытка преднамеренно записать данные в stderr из другой программы.

Обратите внимание, что сегодня программы обычно сначала пытаются открыть /dev/ttyи используют stderr только в случае, если это не работает.

Программы, которые читаются только из stderr, обычно никогда не модифицировались с 1979 года, и такие программы обычно содержат такие конструкции, как:

int i 1;

или

i =* 2;

, которые не принимаются современными компиляторами C. Как результат,маловероятно, что вы сегодня найдете программу, которая никогда не открывает /dev/tty, а читает интерактивные ответы из stderr.

6
27.01.2020, 19:56

Теги

Похожие вопросы