2013-05-30 119 views
2

我在shell脚本中有一个expect脚本。我的问题是我无法从子预期脚本获得一个变量值到shell父脚本。如何从孩子预期脚本返回值到父sh脚本

请在下面找到我的代码:

#!/bin/sh 

expect <<- DONE 
spawn telnet myemailserver.com imap 
expect "* OK The Microsoft Exchange IMAP4 service is ready." 

send "a1 LOGIN myuser mypass\r" 
expect "a1 OK LOGIN completed." 

send "a2 EXAMINE INBOX\r" 
expect "a2 OK EXAMINE completed." 

send "a3 SEARCH UNSEEN\r" 
expect "a3 OK SEARCH completed." 
set results $expect_out(buffer) 
set list [split $results "\n"] 

send "a4 LOGOUT\r" 
expect "Connection closed by foreign host." 

spawn echo $list 

expect eof 
DONE 

echo $list 
exit 0 

我发现,在最后一行的变量列表是空的。有没有办法将变量$ list的值传递给shell父脚本?

回答

1

你的这里 - 文件受制于shell变量扩展之前该脚本被给予期望的解释器。 $list变量被替换为空(假设您的程序中没有名为list的shell变量)。您需要确保here-doc是单引号的(如下所示)

就像使用awk或sed一样,shell进程间通信是通过沿标准IO通道传递数据来执行的:shell脚本必须捕获该预期程序的输出:

list=$(expect <<'END' 
    log_user 0   
    # expect program here 
    puts $list 
END 
) 
echo $list 

由于我抑制,以仅发送重要信息反馈到外壳,log_user 0催生程序的正常端子输出,必须更换spawn echo与期望的puts命令。