编辑:所以我最终在这里做的是直接在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调用,并且没有错误。有任何想法吗?谢谢。
答案 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"
}