需要帮助消除我的代码中的竞争条件

时间:2019-04-12 07:27:29

标签: tcl expect

我的代码正在无限运行而不会出现循环。 我正在调用shell脚本中的Expect脚本,效果很好, 这里的问题是脚本不是从timout {}循环中出来的。 有人可以在这方面帮助我。

    spawn ssh ${USER}@${MACHINE}
    set timeout 10
    expect "Password: "
    send -s "${PASS}\r"

    expect $prompt
    send "cmd\r"

    expect $prompt
    send "cmd1\r"

    expect $prompt
    send "cmd2\r"

    expect $prompt
    send "cmd3\r"

    expect $prompt
    send "cmdn\r"
    #cmdn --> is about running script which takes around 4 hours

    expect {
         timeout { puts "Running ....."  #<--- script is nout coming out of loop its running infinitely
         exp_continue   }
         eof {puts "EOF occured"; exit 1}
         "\$.*>" { puts "Finished.." ; exit 0}


    }

1 个答案:

答案 0 :(得分:0)

问题在于您的真实模式"\$.*>" literally 而不是正则表达式。您需要传递-re标志,以将该模式作为RE进行匹配,像这样(我使用的行数多于;个字符,因为我认为这样更清晰,但YMMV在那里) :

expect {
    timeout {
        puts "Running ....."
        exp_continue
    }
    eof {
        puts "EOF occured"
        exit 1
    }
    -re {\$.*>} {
        puts "Finished.."
        exit 0
    }
}

如果可以的话,将正则表达式放在{大括号}中也是一个 好主意 ,因此反斜杠序列(以及其他Tcl内的元字符)不会被替换。您不必……但是所有案例中有99.99%的情况会更好。