【问题标题】:Expect not working as expected预计不会按预期工作
【发布时间】:2014-12-15 14:29:08
【问题描述】:

编辑:所以最终我最终在这里做的是直接在 mysql.expect 脚本中运行它。任何需要更新的变量都将通过用于启动 mysql.expect 的标准 bash 脚本中的 sed 替换。

我有一个运行期望的 bash 脚本,并自动执行 MySQL 安装过程,如您所见 here。在这个脚本中需要调用expect的原因是为了获取本地bash变量,所以我不能只通过expect运行它,而是需要按如下方式调用它:

if [ catch "spawn /bin/bash ./mysql.sh" error ] {

   puts "Could not spawn mysql.sh $error"

}

我知道这行得通,因为我称之为“test.sh”的另一个脚本执行以下操作:

#!/bin/bash
source ./myvars.rc

echo "CONNECTED" >> "./out.html"

echo "$MYVARIABLE" >> "./out.html"

这工作正常,变量已正确添加到 out.html。 mysql.sh 脚本在直接调用时有效,但不是通过expect,并且没有错误。有任何想法吗?谢谢。

【问题讨论】:

  • 当你通过expect运行这个脚本时,mysql_installation的衍生进程是否开始运行?还是没找到线索,然后加上-d flag 和expect 看看调试信息。

标签: linux bash scripting automation expect


【解决方案1】:

我不是expect 专家,但您可能在spawn 命令中有语法错误。这似乎有效:

#!/usr/bin/expect

if { [ catch {spawn /bin/bash ./mysql.sh} error ] } {  
   puts "Could not spawn mysql.sh $error"
}
# This is the important part
interact

catch 如果您的命令成功,则返回 0(OK)。您看到“成功”是因为它确实出错了,但您正在测试其他条件。

所以,我做了更多的测试并更新了一点。你不想要!,但你确实想要interact。使用expect 生成某些内容后,您想使用expect 处理输出,或者如果没有要处理的输出,只需让脚本使用interact 运行。

有趣的是,如果您使用/bin/bash ./mysql.sh 而不使用interact,这将什么都不做,但不会实际运行脚本。如果您只使用./mysql.sh,它将挂起。我认为标准输入/输出在两者之间会发生不同的情况。

无论如何,我希望这有助于并真正解决您的问题。额外添加的东西,因为我在这里很忙——如果你不想与你的脚本交互,你可能想要exec 而不是spawn

#!/usr/bin/expect

if { [ catch {puts [exec /bin/bash ./mysql.sh]} error ] } {
   puts "Could not spawn mysql.sh $error"
}

puts 在那里,否则您将丢失脚本的输出。如果你不关心输出,你可以使用:

#!/usr/bin/expect

if { [ catch {exec /bin/bash ./mysql.sh} error ] } {
   puts "Could not spawn mysql.sh $error"
}

【讨论】:

  • 感谢 zerodiff,它现在至少显示了一个错误,即进度(“无法生成 mysql.sh”)。
猜你喜欢
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2016-01-15
  • 2023-03-20
相关资源
最近更新 更多