我编写的程序的典型交互可能如下所示:
Enter command: a_command
Completed a command
Enter command: another_command
Completed another command
我通常运行我的程序./program < input.txt
,其中input.txt
包含:
a_command
another_command
我希望能够像上面那样捕获整个交互(而不仅仅是输出)。我怎样才能用 bash 做到这一点?
编辑:program
是一个二进制文件(具体来说,它是用 C++ 编写的),而不是 bash 脚本。我可以访问源代码,但我想在不修改源代码的情况下执行此操作。
答案1
为了在相应的提示后打印输入,您需要知道程序何时等待输入。无法通过观察正在运行的程序来区分:您无法区分正在等待 stdin 上输入的程序和正在等待其他内容(网络、磁盘、计算等)的程序。
因此,获取看起来像交互式使用的记录的过程必须如下所示:
- 启动程序。
- 等待并识别第一个提示。
- 显示输入并将其发送到第一个提示。
- 第二个输入提示和所有后续输入提示也是如此。
- 当程序退出时退出。
编写此脚本的事实上的标准工具是预计。该脚本看起来像这样(警告:不工作的代码,直接在我的浏览器中键入):
#!/usr/bin/expect -f
set transcript_file [open "transcript" wb]
spawn myprogram
expect "Enter command:"
puts -nonewline $transcript_file $expect_out(buffer)
send "a_command\r"
puts -nonewline $transcript_file "a_command\r"
puts -nonewline $transcript_file $expect_out(buffer)
send "another_command\r"
puts -nonewline $transcript_file "another_command\r"
puts -nonewline $transcript_file $expect_out(buffer)
…
expect eof
close $transcript_file
答案2
set -x
在程序文件中添加该行。
例子:
#!/bin/bash
set -x #echo on
ls $PWD
这将扩展所有变量并在命令输出之前打印完整的命令。
输出:
+ ls /home/user/
file1.txt file2.txt
查看这个答案从 Stackoverflow 获取更多类似的 set 命令标志。