作者好奇一个问题:把文件 pipe 进 less 后按 j 仍能滚动,但 stdin 明明已经是一个耗尽了的管道,less 究竟从哪里读按键?文章用一个「程序自喂四次」的管线实验,拆解了类 Unix 系统中文件描述符的真相:stdin/stdout 属于进程而非管道,shell 会同时启动整条管线。作者进而揭示 fzf、less 等工具如何在 stdin 是管道时「夺回键盘」——通过直接打开 /dev/tty 或重新绑定 fd,而不是依赖被接管的标准输入。
less、fzf 等交互工具在管道输入下仍能响应用户按键的底层机制。