Сначала я был удивлен. Однако после прочтения ответов и небольшого расследования все кажется простым. Итак, вот что я нашел. (в конце концов не было ничего удивительного.)
Перед перенаправлением 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 за ссылку.
/dev/tty
см. Этот вопрос .