linux - 使用 bash 捕获交互式程序的输出和输入

标签 linux bash shell

我正在致力于在 bash 中自动化交互式命令行 Java 程序,以验证该程序是否为输入生成正确的输出(基本上是 bash 中的穷人单元测试)。

例如,如果我有一个 java 程序要求用户输入他们的全名,然后只输出他们的名字,它应该看起来像这样:

Enter your name: John Doe
John

用户输入“John Doe”的位置。

运行它的简单 bash 命令可能如下所示:

OUTPUT=`echo "John Doe" | java NameReader`

OUTPUT=`java NameReader <<< "John Doe"`

这两者的问题在于 $OUTPUT 现在包含以下内容:

Enter your name: John

因为发送到 stdin 的文本(及其换行符)并没有像我们在控制台中看到的那样在程序输出中重现。

理想情况下,$OUTPUT 将包含以下内容:

Enter your name: John Doe
John

但我可以忍受这个:

Enter your name: 
John

(完全省略了输入,但输出在新行上,正如预期的那样)

在 bash 中有没有一种方法(不改变底层的 java 程序)让通过管道传输到 stdin 的文本在 java 程序读取它的“时间”也通过管道传输到 stdout,所以完整的交互式 session 是被俘虏了?

(还有一点要注意:一些搜索表明 spawn/expect 命令可能会有帮助,但是运行它的系统似乎没有它们可用)

最佳答案

您可以使用脚本命令

script -q -c "java NameReader" log.txt

这将在log.txt 文件中记录java NameReader 命令的输入和输出。

关于linux - 使用 bash 捕获交互式程序的输出和输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37305963/

相关文章:

linux - 在另一个脚本提示 : No such file or directory 中执行 shell 脚本

python - Python可以在打开套接字时选择什么网络适配器吗?

java - 为什么我收到 "bash: export: ` =/usr/jdk/jdk-1.8.0_7 1': not a valid identifier"消息?

bash - 如何在 bash 中按字母和数字排序?

bash - 使用 bash 搜索并替换特定行

linux - 在命令 "*/"中使用 "ls -d */"列出目录的任何原因?

c++ - Unix 域套接字 (C++) - 客户端使服务器守护进程崩溃

linux - 如何捕获已将其重定向到/dev/null 的正在运行的进程的标准输出

linux - wpa_supplicant 告诉 "No Drivers enabled"

bash - 为什么我不将 shell 命令的结果保存到我的变量中?