2015-12-02 51 views
0

我想处理两个进程,它们必须同时运行。但是,我不断收到消息,指出其中一个进程不存在。在tcl/expect中处理多个进程

下面是一个最小的(不)工作示例(我不是真的FTP工作,但那将其他人运行的东西):

#!/usr/bin/expect 

set spawn_id_bash [spawn /bin/bash] 
set spawn_id_ftp [spawn ftp ftp.ccc.de] 

send "anonymous\n" 
expect { 
    "*Password*" { 
      puts "\nftp works" 
    } 
    default { 
      puts "\nftp defaulted" 
    } 
} 

set spawn_id $spawn_id_bash 
send "uname\n" 
expect { 
    "*Linux*" { 
      puts "\nbash works" 
    } 
    default { 
      puts "\nbash defaulted" 
    } 
} 

不幸的是,输出是:

[[email protected] linuxhome]$ /tmp/blub.tcl 
spawn /bin/bash 
spawn ftp ftp.ccc.de 
anonymous 
Trying 212.201.68.160... 
Connected to ftp.ccc.de (212.201.68.160). 
220-+-+-+-+-+-+-+-+-+ 
220-|o|b|s|o|l|e|t|e| 
220-+-+-+-+-+-+-+-+-+ 
220- 
220- 
220-Please use HTTP instead: 
220- 
220-* http://cdn.media.ccc.de 
220 
Name (ftp.ccc.de:martin): 331 Please specify the password. 
Password:ftp works 
can not find channel named "4648" 
while executing 
"send "uname\n"" 
(file "/tmp/blub.tcl" line 19) 

我在写这个例子的时候跟着书"Exploring Expect",我没有看到我做了什么不同。

我也使用send -iexpect -i没有任何的运气(错误消息已不存在,但在其他方面-i似乎被忽略)尝试。

回答

1

spawn返回unix进程标识(PID,整数),而不是spawn_id(字符串)。例如:

# cat foo.exp 
send_user "[spawn -noecho sleep 1] $spawn_id\n" 
expect eof 
# expect foo.exp 
20039 exp6 
# 

所以,你应该这样写:

spawn /bin/bash 
set spawn_id_bash $spawn_id 

spawn ftp ftp.ccc.de 
set spawn_id_ftp $spawn_id 

然后你可以使用expect -isend -i

+0

不错!接得好。 –