我正在致力于在 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/