Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 预期不会按预期工作_Linux_Bash_Scripting_Automation_Expect - Fatal编程技术网

Linux 预期不会按预期工作

Linux 预期不会按预期工作,linux,bash,scripting,automation,expect,Linux,Bash,Scripting,Automation,Expect,编辑:所以最终我要做的就是在mysql.expect脚本中直接运行它。任何需要更新的变量都将通过用于启动mysql.expect的标准bash脚本中的sed进行替换 我有一个运行expect的bash脚本,可以自动执行MySQL安装过程,如您所见。此脚本中需要调用expect的原因是为了获取本地bash变量,因此我不能通过expect运行它,而是需要按如下方式调用它: if [ catch "spawn /bin/bash ./mysql.sh" error ] { puts "Coul

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

我有一个运行expect的bash脚本,可以自动执行MySQL安装过程,如您所见。此脚本中需要调用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专家,但是
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(确定)。您看到“成功”是因为它确实出错了,但您正在测试其他条件

所以,我做了更多的测试,并更新了一点。您不需要
在那里,但您确实希望
交互
。使用
expect
生成某个内容后,您可以使用
expect
来处理输出,或者如果没有要处理的输出,只需让脚本与
交互运行即可

有趣的是,如果您使用
/bin/bash./mysql.sh
而不使用
交互
,那么这将不起任何作用,但不会实际运行脚本。如果只使用
/mysql.sh
,它将挂起。我假设在标准输入/输出方面,两者的情况有所不同

无论如何,我希望这能帮助你解决问题。额外添加的东西,因为我在这里玩得很疯狂——如果不想与脚本交互,您可能需要
exec
而不是
spawn

#!/usr/bin/expect

if { [ catch {puts [exec /bin/bash ./mysql.sh]} error ] } {
   puts "Could not spawn mysql.sh $error"
}
放置
,因为否则您将丢失脚本的输出。如果您不关心输出,可以使用:

#!/usr/bin/expect

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

通过expect运行此脚本时,mysql_安装的派生进程是否已开始运行?仍然没有得到任何线索,然后添加带有expect的
-d
标志并查看调试信息。感谢zerodiff,它现在至少显示了一个错误,这就是进度(“无法生成mysql.sh”)。