我真正的目标是编写一个脚本,该脚本将在本地运行以通过 ssh 连接到远程服务器,重新启动 tomcat,并用于expect
等待“服务器正在启动”消息,或者在启动失败时退出非零值。我的尝试是这个脚本。我使用 localhost 进行调试,并使用 INFO 而不是“启动失败”来人为触发退出:
ssh -T localhost <<SSH_EOF
docker restart app
expect <<EXPECT_EOF
set timeout 30
spawn docker logs --since 1s -f app
expect_before "INFO" { exit 1 }
expect "Server startup in"
EXPECT_EOF
if [[ $? -eq 0]]; then
echo "Success!"
else
echo "Failed!"
fi
SSH_EOF
脚本确实在第一条 INFO 消息时退出,但打印成功!为什么它不会以 1 退出?
答案1
您正在使用<<
包含这里的文件,即受参数扩展、命令替换和算术扩展的影响。特别是,$?
在传递给 ssh 之前,就被 0 替换了(可能)。
您需要引用此处的分隔符以避免这种情况,例如<<'SSH_EOF'
。实际分隔符仍然是SSH_EOF
。您可能应该对 expect 执行相同的操作EXPECT_EOF
,以防将来的更改涉及$
。