Я просматриваю код утилиты «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? Если да, то ЧТО?! Я думал, что ввод с клавиатуры был отправлен через стандартный ввод.
Интересно, что даже если вы сделаете ls -l * | less
, после завершения загрузки файла вы все равно сможете использовать клавиатуру для прокрутки вверх и вниз, но если вы сделаете ls -l * | vi
, тогда vi будет орать на вас, потому что он не читает со стандартного ввода. Какая большая идея? Как я оказался в этой странной новой стране, где stderr — это и способ сообщения об ошибках на экране, и способ чтения с клавиатуры? Я не думаю, что я больше в Канзасе...
ls -l * | vim -
, vim проделает аналогичную магию. - person ephemient   schedule 07.02.2011