使用重定向的输入和输出捕获程序的记录

使用重定向的输入和输出捕获程序的记录

我编写的程序的典型交互可能如下所示:

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 命令标志。

相关内容