Przyjrzyjmy się kodowi narzędzia "mniej", a konkretnie temu, jak dostaje się wejście z klawiatury. Co ciekawe, na linii 80 ttyin.c, ustawia deskryptor pliku do odczytu z:Mniej pobiera dane z klawiatury ze stderr?
/*
* Try /dev/tty.
* If that doesn't work, use file descriptor 2,
* which in Unix is usually attached to the screen,
* but also usually lets you read from the keyboard.
*/
#if OS2
/* The __open() system call translates "/dev/tty" to "con". */
tty = __open("/dev/tty", OPEN_READ);
#else
tty = open("/dev/tty", OPEN_READ);
#endif
if (tty < 0)
tty = 2;
nie jest plik deskryptora 2 stderr? Jeśli tak, WTH ?! Myślałem, że wejście klawiatury zostało wysłane przez stdin.
Co ciekawe, nawet jeśli nie ls -l * | less
, po zakończeniu załadunku pliku, nadal można korzystać z klawiatury do przewijania w górę iw dół, ale jeśli nie ls -l * | vi
, wtedy vi krzyczeć na ciebie, ponieważ nie czyta ze standardowego wejścia . Jaki jest wielki pomysł? Jak trafiłem na tę dziwną, nową krainę, gdzie stderr jest zarówno sposobem zgłaszania błędów na ekranie, jak i czytania z klawiatury? Nie sądzę, że jestem już w Kansas ...
BTW, jeśli napiszesz 'ls -l * | vim -', vim wykona podobną magię. – ephemient