在tcl/expect中处理多个流程

在tcl/expect中处理多个流程,tcl,expect,Tcl,Expect,我试图处理两个进程,它们必须在expect中同时运行。然而,我一直得到这样一个信息:其中一个进程并不存在 下面是一个最小的(不)工作示例(我不是真正使用ftp,但这将适用于其他人): 不幸的是,结果是: [martin@martin 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.6

我试图处理两个进程,它们必须在expect中同时运行。然而,我一直得到这样一个信息:其中一个进程并不存在

下面是一个最小的(不)工作示例(我不是真正使用ftp,但这将适用于其他人):

不幸的是,结果是:

[martin@martin 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)
我在写这个例子的时候遵循了这本书,我看不出有什么不同


我还尝试了使用
send-I
expect-I
,但没有任何运气(错误消息消失了,但在其他方面
-I
似乎被忽略)。

spawn
返回unix进程id(
PID
,一个整数),而不是
spawn\u id
(一个字符串)。例如:

#cat foo.exp
发送用户“[spawn-noecho sleep 1]$spawn\u id\n”
预期eof
#期待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-i
send-i

spawn /bin/bash
set spawn_id_bash $spawn_id

spawn ftp ftp.ccc.de
set spawn_id_ftp $spawn_id