期望条件似乎不起作用

Expect conditionals don't seem to be working

编辑:没有条件一切正常。添加条件会破坏脚本。我在其他更简单的脚本中尝试了条件语句,并且这些都有效。

编辑 2:添加完整的脚本,因为 expect 条件的其他实例已经起作用

我正在尝试修改一个 autoexpect 生成的 expect 脚本,该脚本在构建成功时运行但不处理构建失败。

经过大量研究,我无法弄清楚为什么我的期望条件不起作用

#!/usr/bin/expect -f

set force_conservative 0  ;# set to 1 to force conservative mode even if
                          ;# script wasn't run conservatively originally
if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}

set timeout -1
spawn $env(SHELL)
match_max 100000
expect "~$ "
send -- "sudo su\r"
expect "/home/ubuntu# "
send -- "cd ../../opt/application/"
send -- "\r"
expect  "/opt/application# "
send -- "./buildwar.sh \r"
expect  {
        "BUILD SUCCESSFUL\r" {
                send -- "su appuser\r"
                expect  "/opt/application$ "
                send -- "../../home/ubuntu/shutdown.sh \r"
                expect  "\"outcome\" => \"success\"}"
                send -- "exit\r"
                expect "/opt/application# "
                send -- "./deploywar.sh \r"
                expect "BUILD SUCCESSFUL"
                send -- "su appuser\r"
                expect  "/opt/application$ "
                send -- "../../home/ubuntu/startup.sh \r"
                expect "Deployed \"application.war\""
                send -- "exit\r"
                send -- "exit\r"
                send -- "exit\r"
                exit 0
        }

        "BUILD FAILED\r" {
                exit 1
        }
}

您需要匹配 \n - 尽管您忽略它也没关系。

您可能需要 运行 期望调试 (expect -d)。您实际上并没有显示您期望的数据。

对我有用:

$ expect -c '
  log_user 0
  spawn sh -c {echo "BUILD SUCCESSFUL"}
  expect {
          "BUILD SUCCESSFUL\r" {
                  #various and sundry other code to run
                  exit 123
          }

          "BUILD FAILED\r" {
                  exit 56
          }
  }
'
$ echo $?
123
$ expect -c '
  log_user 0
  spawn sh -c {echo "BUILD FAILED"}
  expect {
          "BUILD SUCCESSFUL\r" {
                  #various and sundry other code to run
                  exit 123
          }

          "BUILD FAILED\r" {
                  exit 56
          }
  }
'
$ echo $?
56

问题是嵌套 expect 语句似乎不起作用,因此代替发布的代码,以下工作:

#!/usr/bin/expect -f

set force_conservative 0  ;# set to 1 to force conservative mode even if
                          ;# script wasn't run conservatively originally
if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}

set timeout -1
spawn $env(SHELL)
match_max 100000
expect "~$ "
send -- "sudo su\r"
expect "/home/ubuntu# "
send -- "cd ../../opt/application/"
send -- "\r"
expect  "/opt/application# "
send -- "./buildwar.sh \r"
expect  {
        "BUILD SUCCESSFUL\r" {
                send -- "su appuser\r"
        }

        "BUILD FAILED\r" {
                exit 1
        }
}
expect  "/opt/application$ "
send -- "../../home/ubuntu/shutdown.sh \r"
expect  "\"outcome\" => \"success\"}"
send -- "exit\r"
expect "/opt/application# "
send -- "./deploywar.sh \r"
expect "BUILD SUCCESSFUL"
send -- "su appuser\r"
expect  "/opt/application$ "
send -- "../../home/ubuntu/startup.sh \r"
expect "Deployed \"application.war\""
send -- "exit\r"
send -- "exit\r"
send -- "exit\r"