tee
通过从 stdin 读取并将输入流拆分为 stdout 和文件来工作。
我正在尝试对进程的标准输入执行类似的操作。我希望命令的标准输入仍然附加到 tty 或伪终端,并且还能够从任意源(例如文件)接收输入。
我尝试了各种管道技巧和 IO 重定向,但无法复制将 stdin 作为终端的程序所需的场景。
这可能不可能,但我想我会问。
答案1
您可以编写一个程序来select()
调用 tty 和其他一些源,读取其中任一源的任何内容。但如果另一个源是文件,那就没有任何意义:文件总是可以立即读取,无需等待输入。因此,结果是您要么先处理文件,然后处理 tty 输入,或者反之亦然。 (除非文件非常大,并且您实际上需要等待磁盘一段可测量的时间。)
要先读取文件,然后读取 tty 输入/stdin,您可以使用cat file -
.
答案2
我不确定您的场景中如何涉及文件;管道标准输入可以读入临时文件(或保存在内存中),然后通过类似的方式恢复 tty 访问
#!/usr/bin/env expect
package require Tcl 8.5
package require fileutil
set tmpfile [::fileutil::tempfile]
while {[gets stdin line] >= 0} {
puts $tmpfh $line
}
close stdin
open /dev/tty r+
# and here the remainder of the program can interact with the terminal,
# and read from the $tmpfile as necessary
我用这个方法feed
REPL 的标准输入然后将该 REPL 转为交互式使用:
$ echo '(print "hello")' | feed - sbcl --noinform
* (print "hello")
"hello"
"hello"
* (quit)
(quit)
$