期望不按预期工作

时间:2014-10-20 14:47:11

标签: linux bash scripting automation expect

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

我有一个运行期望的bash脚本,并自动执行MySQL安装过程,如您所见here。需要在此脚本中调用期望的原因是源本地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调用,并且没有错误。有任何想法吗?谢谢。

1 个答案:

答案 0 :(得分:1)

我不是期望专家,但您可能在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"
}