我正在使用 expect 来自动化一些 bash 脚本。一切正常,直到我需要执行源脚本;然后我得到这个错误:
couldn't execute "source setNAME.sh": no such file or directory
while executing
"spawn "source setNAME.sh""
(file "./setNAME.exp" line 2)
我以基本方式使用期望(生成/期望/发送/交互);问题在于产卵。让我举一个非常简单的例子:
读取名称、回显值并作为“NAME”导出到环境的脚本:
/home/edu/scripts [] cat setNAME.sh
#!/bin/bash
echo "Your name?"
read name
export NAME=$name
echo "Provided NAME is $name"
如果您使用 'source' 执行,则输入值将作为环境变量导出。正是我需要的:
/home/edu/scripts [] source setNAME.sh
Your name?
Dennis
Provided NAME is Dennis
/home/edu/scripts [] echo $NAME
Dennis
让我们使用 expect 来避免交互,将 'edu' 设置为名称:
/home/edu/scripts [] cat setNAME.exp
#!/usr/bin/expect
spawn setNAME.sh
expect "Your name?"
send edu\r
interact
/home/edu/scripts [] setNAME.exp
spawn setNAME.sh
Your name?
edu
Provided NAME is edu
/home/edu/scripts [] echo $NAME
Dennis
但显然,名称仍然是 Dennis:“edu”显示在 sh 脚本输出中,但未导出为 NAME,因为期望脚本生成 setNAME.sh 脚本,但没有源代码(或脚本前的点)。
问题是我不能这样做,因为我在一开始就收到了错误评论。
有什么想法可以解决/负担这种需求吗?
在我的情况下,脚本要复杂得多,其他解决方案也无效,例如:
source script.sh << EOF
<option1>
<option2>
...
EOF
这就是我试图使用期望的原因......
非常感谢!