如何通过管道/文件发送部分数据,然后以交互方式发送?

如何通过管道/文件发送部分数据,然后以交互方式发送?

我有一个要运行的命令,我们称之为program。它是一个类似于 bash 或 python REPL 的交互式程序。

我想用一些预定义的输入来启动这个程序。我试过program << "some_commands"。但执行完成后some_commands,我无法继续手动交互。

如果这个程序是 bash 我会用于.bashrc此目的。

使用具有预定义启动输入的此类程序的正确方法是什么?

答案1

您也可以在不使用 Expect 的情况下执行此操作:

{ echo foo ; cat ; } | command

答案2

expect是这项工作的工具:

#!/usr/bin/expect -f
spawn program
expect "I'm ready for input"
send "command 1\r"
expect "I'm ready for input"
send "command 2\r"
# ...
send "command last\r"
interact

interact命令将控制权返回给用户。

答案3

您可以使用回卷与您的程序进行交互。 Rlwrap 提供了一个基于 readline 库的行编辑器,与 bash 使用的相同。这通常不如提供行编辑器的程序所提供的行编辑器(例如,您不会获得任何语法着色或完成),但它比仅理解退格键的默认终端界面要好得多。

rlwrap -P 'some_commands' program

文本被传递到输入缓冲区,但不会发送到程序,因此您必须Enter在启动程序后按 键。整个文本作为单个字符串传递。它可以包含换行符。

相关内容