是否有类似于 stdin 的“tee”工具?

是否有类似于 stdin 的“tee”工具?

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

我用这个方法feedREPL 的标准输入然后将该 REPL 转为交互式使用:

$ echo '(print "hello")' | feed - sbcl --noinform
* (print "hello")

"hello"
"hello"
* (quit)
(quit)
$ 

相关内容