нужна помощь в устранении состояния гонки в моем коде - PullRequest
1 голос
/ 12 апреля 2019

Мой код работает бесконечно, не выходя из цикла. Я звоню ожидать сценария из сценария оболочки, который работает нормально, проблема здесь в том, что скрипт не выходит из цикла 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 голосов
/ 12 апреля 2019

Проблема в том, что ваш реальный шаблон "\$.*>" соответствует буквально , а не как регулярное выражение.Вам нужно передать флаг -re, чтобы этот шаблон соответствовал RE, например, так (я использовал больше строк, чем ; символов, так как я думаю, что это понятнее, но YMMV там):

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

Это также действительно хорошая идея помещать регулярные выражения в { фигурные скобки }, если вы можете, поэтому последовательности с обратной косой чертой (и другие метасимволы Tcl) внутрине подставляйся.Вам не нужно ... но 99,99% всех случаев лучше.

...