Expectを使用してgdbを自動化しようとしています。私のスクリプトはgdbを起動し、いくつかの初期化を実行し、ユーザーに制御を渡します。 Expectのinteract
コマンドは、仕事に最適なツールのように見えました。
さて、次のことを考えてみましょう。
$ echo "spawn gdb
expect \"(gdb) \"
send \"help\r\"
expect \"(gdb) \"
interact" | expect -
マイコンピュータでは、このスクリプトレットはgdbを生成し、期待どおりにヘルプコマンドを実行します。しかし、すぐにスクリプトを終了してbashプロンプトに戻ります。ユーザーがgdbに滞在しながらコマンドを実行できることを願っています。
ここで何を見逃しているのか知っていますか?
答え1
interact
expects
入力は閉じたパイプである標準入力から取得されますecho
。
代わりに作成できます(ksh/zsh/bash構文)。
expect <(echo "spawn gdb
expect \"(gdb) \"
send \"help\r\"
expect \"(gdb) \"
interact" )
それでもパイプを介して提供されますが、今回はパイプがパス引数として提供されるため、expect
予想される標準入力は影響を受けません。
ただし、この場合は明らかに次のように書くことができます。
expect -c '
spawn gdb
expect "(gdb)"
send "help\r"
expect "(gdb) "
interact'
expect
ほとんどのシェルはsh
これを許可します-c
。
それでもコマンド出力を渡す必要がある場合(echo
あなたの場合のように)、-c
次のコマンドを使用してそれを行うこともできます。
expect -c "$(echo...)"
expect
ただし、これはコマンドが完了するまでパイプと反対のメソッドが起動しないことを意味します。
ちなみに、ここでは.gdbinit
ファイルや-ix
オプションを代わりに使用できますが、gdb
実際には必要ありませんexpect
。