在 tcl/expect 中处理多个进程
handling multiple processes in tcl/expect
我正在尝试处理两个进程,这两个进程在 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"
}
}
不幸的是,输出是:
[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)
我在编写这个示例时遵循了书本 "Exploring Expect",但我没有看到我所做的有什么不同。
我也试过使用 send -i
和 expect -i
但没有任何运气(错误消息消失了,但 -i
似乎被忽略了)。
spawn
returns unix 进程 ID(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 -i
和send -i
。
我正在尝试处理两个进程,这两个进程在 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"
}
}
不幸的是,输出是:
[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)
我在编写这个示例时遵循了书本 "Exploring Expect",但我没有看到我所做的有什么不同。
我也试过使用 send -i
和 expect -i
但没有任何运气(错误消息消失了,但 -i
似乎被忽略了)。
spawn
returns unix 进程 ID(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 -i
和send -i
。