【发布时间】:2020-09-28 09:54:29
【问题描述】:
考虑下面的 Expect 脚本。它创建一个测试文件,每行都有一个字符 (a,b,c,a,b,c),然后使用 spawn 打开文件:
#!/usr/bin/expect -f
proc create_test_file {fname} {
set chan [open $fname w]
puts $chan "a\nb\nc"
puts $chan "a\nb\nc"
catch {close $chan}
}
log_user 0
create_test_file "test_file.txt"
set f [open "test_file.txt" r]
spawn -open $f
while {1} {
expect {
"c" { send_user "C\n" }
"b" { send_user "B\n" }
"a" { send_user "A\n" }
eof { break }
}
}
输出是:
C
C
预期的输出不会逐行处理文件,而是 而是一次。期望语句“c”中的第一行将丢弃第一行与 a 和 b,然后匹配第三行与 c,以此类推进行下一个循环。
其他的 expect 语句也会匹配这些行,但它们永远没有机会这样做,因为第一个语句首先匹配,即使第一个语句丢弃了更多的行。
我想我理解这种行为,但现在我的问题是:有没有办法调整期望的行为,以便匹配的期望语句是需要丢弃文件中最少行数的语句?这样生成的输出将变为以下内容:
A
B
C
A
B
C
【问题讨论】:
-
有不同的方法来做你描述的事情,但你真正的用例是什么?
-
注意,你的
puts应该是puts $chan。 -
是的,没错。复制时出错。