【发布时间】:2013-10-17 22:20:16
【问题描述】:
我感觉我缺少一些明显的东西,但到目前为止我的搜索没有结果。
我正在尝试使用 tcl/expect 脚本来启动 tclsh 交互式 shell,添加一个用于轻松重新加载实用程序以进行测试的过程,然后将正常控制权返回给我。
到目前为止,我发现让 tcl 交互式 shell “可用”的一种方法是用“rlwrap”启动它,这样我就可以使用箭头键等。
所以我尝试了以下脚本,当交互命令被命中时,rlwrap 的某些内容导致以前的输出被转储到标准输出。
我能做些什么来避免这种情况发生吗?
代码:
package require Expect
puts "Tcl version : [info tclversion]"
puts "Expect version: [exp_version]"
log_user 0
spawn -noecho rlwrap tclsh
# Create procedure to easily reload utilites after changes have been made
expect "% "
send {
proc reload {} {
# Procedure to reload utility source easily for testing
}
}
# Source utilities
expect "% "
send "reload\r"
send_user "\nUse 'reload' procedure to re-source utility files\n\n"
log_user 1
interact
输出:
Tcl version : 8.4
Expect version: 5.43.0
Use 'reload' procedure to re-source utility files
proc reload {} {
# Procedure to reload utility source easily for testing
}
% reload
%
你可以因为某种原因它呼应 proc 定义和重新加载命令的输入。一旦发生交互,就会发生这种情况。如果我将交互替换为“退出”,我将看不到任何输出。
当然我希望看到的输出是这样的:
Tcl version : 8.4
Expect version: 5.43.0
Use 'reload' procedure to re-source utility files
%
【问题讨论】:
-
试试
expect "% "之前log_user 1 -
Glenn 的建议很好,但不幸的是它似乎并没有改变输出。
-
发送proc后不发送回车。
-
我对此进行了实验,但似乎一点也不重要。不知道为什么,但它按预期工作(除了额外显示的输出)。 proc 被正确定义并且一旦交互允许我控制就可以使用。