私は通常、stdin(手動キーボード入力)を介して対話するコンパイルされたCOTSプログラム(.exe)を持っています。代わりに、文字列を介した入力オファーを試しました<<<
。
通常私はこのプログラムを呼び出します...
./program.exe
その後、必要なオプションを指定したら(この場合は「G」を押す)、いくつかの操作を行い、画面にいくつかのテキストを出力します。
以下を使用してスクリプトに「G」オプションを提供しようとしました。
./program.exe<<<G
ところで、プログラムは一度ではなく「G」オプションを使用して実行され続けているようです。出力が画面にいっぱいになり、強制終了するまで端末が使用できなくなります。文字列は常に送信されますか<<<
?問題は、プログラムが標準入力から読み取ることを期待し、それを処理するように設計されていないことです<<<
....これを行う方法はありますか?
答え1
<<<
「文字列を継続的に転送」しません。文字列を一度だけ送信します。より正確には、文字列を含む一時ファイルを生成し、プログラムの標準入力で開きます。
このプログラムに問題があるようです。プログラムが最後に到達すると、入力ストリームを巻き戻します。
このエラーを解決するには、一時ファイルの代わりにパイプを使用して入力を送信します。パイプは巻き戻すことができないため、この特定のエラーは発生しません。
echo G | ./program.exe
パイプを使用すると、他のエラーが発生する可能性があります。一部のプログラムは、入力が端末から出ないと実際には正しく実行されません。配管が機能しない場合、次のステップは予想される実際の端末を使用してプログラムを実行します(ユーザー対話なし:管理対話が予想されます)。 Expectを使用すると、端末が送受信する内容とタイミングを制御できます。以下は、G
Enterプログラムが開始されるとすぐに入力をシミュレートする期待されるスクリプトです。
#!/usr/bin/expect -f
spawn ./program.exe
send "G\r"