私が書くプログラムの一般的な相互作用は次のとおりです。
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
bashスクリプトではなくバイナリファイル(具体的には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
答え2
set -x
プログラムファイルにこの行を追加します。
例:
#!/bin/bash
set -x #echo on
ls $PWD
これにより、コマンドが出力される前にすべての変数が展開され、コマンド全体が印刷されます。
出力:
+ ls /home/user/
file1.txt file2.txt
確認するこの回答Stackoverflow で、同様の設定コマンドフラグを取得します。