リダイレクトされた入出力を使用したプログラムロギングのキャプチャ

リダイレクトされた入出力を使用したプログラムロギングのキャプチャ

私が書くプログラムの一般的な相互作用は次のとおりです。

Enter command: a_command
Completed a command

Enter command: another_command
Completed another command

./program < input.txt私は通常、以下を含むプログラムを実行しますinput.txt

a_command
another_command

私は上記のように(出力だけでなく)全体の相互作用をキャプチャできるようにしたいです。 Bashを使ってこれを行うにはどうすればよいですか?

編集:programbashスクリプトではなくバイナリファイル(具体的にはC ++で書かれています)。ソースコードにアクセスできますが、ソースコードを変更せずにこれを実行したいと思います。

ベストアンサー1

そのプロンプトの後に入力を印刷するには、プログラムが入力を待つ時間を知る必要があります。実行中のプログラムを見ると、違いはわかりません。 stdinで入力を待っているプログラムと他のもの(ネットワーク、ディスク、コンピューティングなど)を待っているプログラムとの違いはわかりません。

したがって、対話型使用のためのレコードのように見えるものを取得するプロセスは、次のようになります。

  • プログラムの開始。
  • 待ってから最初のプロンプトを認識します。
  • 入力を表示し、最初のプロンプトに送信します。
  • 2番目の入力プロンプトとそれ以降のすべての入力プロンプトも同じです。
  • プログラムが終了したら終了します。

このスクリプトを作成するための事実上の標準ツールは次のとおりです。予想される。スクリプトは次のとおりです(警告:機能しないコード、ブラウザに直接入力)。

#!/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

おすすめ記事