Я спочатку здивувався. Однак після прочитання відповідей і проведення невеликого розслідування здається простим. Тож ось що я знайшов. (врешті-решт сюрпризу не було.)
Перед перенаправленням 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
див. Це питання .