Я просматриваю код утилиты "less", а именно, как он получает ввод на клавиатуре. Интересно, что в строке 80 ttyin.c он задает дескриптор файла для чтения из:
/*
* 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;
Не является файловым дескриптором 2 stderr? Если да, то WTH?! Я думал, что ввод с клавиатуры был отправлен через stdin.
Интересно, что даже если вы делаете ls -l * | less
, после того, как файл закончит загрузку, вы все равно можете использовать клавиатуру для прокрутки вверх и вниз, но если вы сделаете ls -l * | vi
, тогда vi будет кричать на вас, потому что это не читать с stdin. Какая большая идея? Как я попал на эту странную новую землю, где stderr - это способ сообщить об ошибках на экран и прочитать с клавиатуры? Я не думаю, что я в Канзасе больше...