0

我将如何使用 shell 脚本运行命令(这是一个命令行 Java 应用程序)、读取其输出并在其中输入输入。那可能吗?我听说过一个叫做 GNU Screen 的东西,但是当我用谷歌搜索它时,它看起来对我没有帮助?我很困扰。所以基本上我需要运行一个命令,获取它的输出,发送它的输入。注意:你需要输入'exit'来停止命令,所以是的。我在这里很困惑。给我指点 GNU Screen 的教程和解释或者给我看一些东西会很有帮助。

4

3 回答 3

1

使用输入输出重定向。例如,

java yourprog args > output.txt 2> erroutput.txt < input.txt

input.txt 将包含您将在命令行中输入的字符串。System.out.println 将转到 output.txt,System.err.println 将转到 erroutput.txt

Screen 只是一个虚拟终端模拟器,它允许您从单个 shell 屏幕拥有多个 shell。

于 2012-12-18T02:59:49.247 回答
0

如果您不需要等待输入exit

output=$(echo "exit" | java prog)
于 2012-12-18T02:57:10.473 回答
0

听起来您正在寻找的是Expect,“[...] 一种用于自动化交互式应用程序的工具,例如 telnet、ftp、passwd、fsck、rlogin、tip 等。” 使用Tcl脚本语言。

但是,如果您发送给程序的任何命令都不依赖于同一程序的先前输出,那么 Bash 本身可能会运行得很好;只需使用临时文件和 I/O 重定向(如 Usman Saleem 的回答):

  • 将命令列表保存到第一个文件中;和
  • 将程序的标准输入重定向到该文件;和
  • 将标准输出重定向到第二个文件。

read内置命令可能对读取生成的输出文件很有用。

GNU screen只是一个“终端多路复用器”程序,a) 允许您通过单个调制解调器或 SSH 连接拥有多个终端“窗口”,并且 b) 允许您在与服务器断开连接后保持程序运行。这不是您正在寻找的程序。

我建议不要做的一件事是让你的 shell 脚本既生成程序的输入又实时接受程序的输出。数据将被捕获在 stdio 输出缓冲区中,并且可能发生死锁。这就是创建 Expect 的原因。

于 2012-12-18T03:33:33.820 回答