gpt4 book ai didi

期待退出太早

转载 作者:行者123 更新时间:2023-12-04 04:58:22 28 4
gpt4 key购买 nike

我有以下 bash 脚本(script.sh):

#!/bin/bash
read -p "Remove? (y|n): " answer
echo "You answered '$answer'."

我想用expect来驱动它。我有以下脚本(expect.exp,在同一目录中):
#!/usr/bin/expect -f
set timeout -1
spawn -noecho ./script.sh
expect "^Remove"
send "y\r"

但它没有按预期工作(双关语)。结果是:
~/Playground$ ./expect.exp 
Remove? (y|n): ~/Playground$

因此,expect 脚本在第一个 'expect "^Remove"' 行以某种方式失败并立即退出,并且 script.sh 的其余部分不会执行。我在这里做错了什么?
我一直在关注在线找到的基本教程(带有 ftp 示例的教程)。我在 Kubuntu 12.10 上使用 expect 5.45。

编辑
因此,如果我在最后添加“交互”或“期望 eof”,它会发生变化。但我不知道发生了什么以及为什么。有什么帮助吗?

最佳答案

我看到的两件事:

  • "^Remove"是一个正则表达式,但默认情况下 expect使用 glob 模式。试试
    expect -re "^Remove"
  • 在开发程序时,添加 exp_internal 1到脚本的顶部。然后expect会告诉你发生了什么。


  • 啊,我看到expect给 ^加了特殊的含义超越 Tcl's glob patterns .

    However, because expect is not line oriented, these characters (^ and $) match the beginning and end of the data (as opposed to lines) currently in the expect matching buffer



    所以你看到的是你发送 y\r然后您期望脚本退出,因为它无事可做。当您的脚本退出时,生成的子进程将被终止。因此需要先等待生成的 child 结束: expect eof

    关于期待退出太早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16458528/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com