如何实施"后备条件"在期待中的while循环?

时间:2016-08-04 20:55:42

标签: while-loop expect

我有一台我远程登录的机器,然后通过" ctrl + C"直到我看到提示。 ctrl + C可能并不总是有效,所以我必须每隔5秒尝试一次,直到看到预期的输出($ prompt)。

如果我没有得到$提示,我如何确保我可以有效地重试while循环?此代码是否为最佳做法?我担心的是,我不知道当" ctrl + C"失败,它可能是任何东西,除非它是$提示,否则必须忽略它。

while { $disableFlag == 0 } {
    send "^C\r"
    expect {
                "*$prompt*" {
                    puts "Found the prompt"
                    sleep 5
                }
                "*" {
                    set disableFlag 1
                    puts "Retrying"
                    sleep 5
                }
    }
}

1 个答案:

答案 0 :(得分:0)

你可能想要这样的东西(未经测试)

set timeout 5
send \03
expect {
    "*$prompt*" {
        puts "found the prompt"
    }
    timeout {
        puts "did not see prompt within $timeout seconds. Retrying"
        send \03
        exp_continue
    }
}

# do something after seeing the prompt

\03是ctrl-C的八进制值:请参阅http://wiki.tcl.tk/3038

如果你想最终摆脱困境:

set timeout 5
set count 0
send \03
expect {
    "*$prompt*" {
        puts "found the prompt"
    }
    timeout {
        if {[incr count] == 10} {  # die
            error "did not see prompt after [expr {$timeout * $count}] seconds. Aborting"
        }
        puts "did not see prompt within $timeout seconds. Retrying"
        send \03
        exp_continue
    }
}