Na początku byłem zaskoczony. Jednak po przeczytaniu odpowiedzi i przeprowadzeniu krótkiego dochodzenia wydaje się to proste. Oto co znalazłem. (w końcu nie było niespodzianki).
Przed przekierowaniem stdin, stdout i stderr są zgodnie z oczekiwaniami podłączone do tego samego urządzenia.
#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
Dlatego po większości przekierowań (czyli jeśli stderr) nie jest przekierowywany. stderr jest nadal podłączony do terminala. Dlatego można go odczytać, aby uzyskać dane z klawiatury.
Jedyną rzeczą, która powstrzymuje pliki używane w nieoczekiwanym kierunku, jest konwencja, a potoki są jednokierunkowe.
Inny przykład:
cat | less
To idzie źle po stronie, gdy less
próbuje odczytać terminal (nie jest to niespodzianką, podobnie jak cat
czytanie terminalu).
/dev/tty
jest bardziej tajemniczy, to nie jest link do /proc/self
.
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
Zobacz, jakie są relacje między moim obecnym terminalem sterującym a `/ dev / tty`? do eksploracji. Dzięki @StephenKitt za link.
/dev/tty
, zobacz to pytanie .