なぜインタラクションコマンドが機能しないのですか?

なぜインタラクションコマンドが機能しないのですか?

Expectを使用してgdbを自動化しようとしています。私のスクリプトはgdbを起動し、いくつかの初期化を実行し、ユーザーに制御を渡します。 Expectのinteractコマンドは、仕事に最適なツールのように見えました。

さて、次のことを考えてみましょう。

$ echo "spawn gdb
    expect \"(gdb) \"
    send \"help\r\"
    expect \"(gdb) \"
    interact" | expect -

マイコンピュータでは、このスクリプトレットはgdbを生成し、期待どおりにヘルプコマンドを実行します。しかし、すぐにスクリプトを終了してbashプロンプトに戻ります。ユーザーがgdbに滞在しながらコマンドを実行できることを願っています。

ここで何を見逃しているのか知っていますか?

ベストアンサー1

interactexpects入力は閉じたパイプである標準入力から取得されます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

おすすめ記事