在存在复杂 shell 接口的情况下如何关闭 Expect 脚本?

在存在复杂 shell 接口的情况下如何关闭 Expect 脚本?

我正在zsh里面tmux运行普雷斯托,并且基本的期望脚本不正确退出:

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

直接的自动预期结果会产生同样的问题。我注意到的一件事是:

~/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

这肯定与自定义提示的路径被缩写有关。

我很高兴改变我的提示系统,但理想情况下期望只适用于一些模组。


我正在评论唐的书(奥莱利),所以也许答案就在那里。与此同时,有什么技巧可以让expect程序稳健地退出吗?

相关内容