我试图获取远程VM的OS版本并将其作为环境变量添加到同一个vm上,并且还在执行expect脚本的主机vm上进一步使用获取的值。
我试图导出获取值的值。但是变量没有被设定。
send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers`\r"
expect -re $prompt
我看到下面的问题:
can't read "vers": no such variable
while executing
"send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers`\r""
值被设置到远程虚拟机上的变量中,我应该能够在期望脚本中使用它。
这里有几个问题。首先,回想一下expect
使用与sh
相同的语法来表达变量。也就是说,如果我在expect
脚本中设置变量:
set somevar "somevalue"
我可以通过运行打印出来:
puts "$somevar"
这意味着当你有这样的命令时......
send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers`\r"
...然后期望在将该文本发送到连接的进程之前尝试扩展$vers
变量。你看到的错误来自expect
;我们可以像这样重现它:
expect1.7> puts "$var_that_does_not_exist"
can't read "var_that_does_not_exist": no such variable
您将需要在字符串中转义$
,如下所示:
send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo \$vers`\r"
这会将预期的命令发送到你的shell。
我怀疑可能存在第二个问题:您将变量vers
设置为以下输出:
rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers
目前尚不清楚为什么你最后有echo $vers
。由于在运行此命令时未设置$vers
,因此它只是在输出中添加一个空行。我相信你想简单地说:
send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$'`"