https://stackoverflow.com/questions/15230289/read-keyboard-input-within-a-pipelined-read-loop中的答案解决了在管道中读取键盘输入的紧急问题:
mycommand-outputpiped | while read line
do
# do stuff
read confirm < /dev/tty
done
为什么它能正常工作?没有tty
重定向到标准输入吗?我可以获取一个文件描述符来/dev/tty
代替它read -u fd
吗?TIA
之所以有效,是因为
/dev/tty
是控制终端(如果有的话),通过从该终端重定向,您可以确保read
从该终端读取数据,而不是重定向之前的任何标准输入。如果您不这样做,read
则会从 的输出读取数据mycommand-outputpiped
。程序的标准输入最初由其父进程决定。当从终端中的 Shell 启动进程时,如果没有重定向,则该标准输入将成为 Shell 的控制终端;但任何标准输入的重定向都会取代它。
通过重定向标准输入,
/dev/tty
您将获得一个文件描述符 0;但由于read
默认情况下会从该文件读取,-u
因此没有用处。没有其他文件描述符保证指向/dev/tty
。在许多 Shell 中,您可以显式打开其他文件描述符,但在这种情况下,没有太多理由这样做。