3

我正在使用 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

这就是我试图使用期望的原因......

非常感谢!

4

1 回答 1

2

source是内置的 shell,而不是系统命令,因此您首先需要生成一个 shell,然后将源命令发送给它。然后该外壳将具有 NAME 变量中的值

于 2013-07-16T10:03:45.400 回答