複雑なシェルインタフェースがある場合は、Expectスクリプトをどのように閉じますか?

複雑なシェルインタフェースがある場合は、Expectスクリプトをどのように閉じますか?

私は走っていますzshtmuxプレスト楽章、デフォルトの予想スクリプトが正しく終了しません。

set timeout -1
spawn $env(SHELL)
expect  -regex ".*"
send "echo 'foo'\r"
expect -regex ".*foo.*\r"
send "^D"
expect eof

結果は期待どおりに出力され、スクリプトは終了します。ただし、キーボードをfoo押すまで公開されたプロンプトは削除されます。CTRL-Cこの時点で、aが%印刷され、次の行が表示されます。

❯ ./modified-autoexpect-recording.exp
spawn /bin/zsh
echo 'foo'
❯ echo 'foo'
foo
~/ < ... fancy stuff ... ❯  ^C%  # this was a manual CTRL-C event from a broken prompt
~/ < ... fancy stuff ... ❯       # this is working

直接自動的に予想される結果は同じ問題を引き起こします。私が注目したことの1つは次のとおりです。

~/long/path/here ❯ ^C%              
~/lo/pa/here ❯ # after exiting the frozen prompt

エンドツーエンドのAutoExpectの例:

$: autoexpect
$: echo 'foo'
foo
$:[CTRL-D]
$: ./script.exp
$:[CTRL-C]%
$: # prompt works

次の修正後も動作は変わりません。

# changes at beginning
set log_user 0
set stty sane

# changes at end
send -- '^D' # -> send -- \x04

これは、短縮されるカスタムプロンプトへのパスに関連している必要があります。

プロンプトシステムを変更することを嬉しく思いますが、理想的にはいくつかのモードでのみ機能することを期待しています。


私はドンの本(O'Reilly)を見直しているので、おそらく答えがあるでしょう。その間、予想プログラムを正常に終了する方法はありますか?

関連情報