2015-12-02 134 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

不錯!接得好。 –