如何使用Expect控制bash? My Expect脚本如下所示:
#!/usr/bin/expect
# ENABLE DEBUGGING
exp_internal 1
set timeout 10
log_user 0
spawn bash -i
sleep 5
send "ls -1 db*\r"
expect {
-re "^db.*$" {
puts $expect_out(0,string)
}
timeout {
send_error "Script has reached the 'timeout' branch\n"
}
}
但我总是得到这个由超时引起的输出:
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {4740}
send: sending "ls -1 db*\r" to { exp4 }
Gate keeper glob pattern for '^db.*$' is 'db*'. Activating booster.
expect: does "" (spawn_id exp4) match regular expression "^db.*$"? Gate "db*"? gate=no
expect: does "Agent pid 6228\r\nIdentity added: /home/wakatana/.ssh/id_rsa (/home/wakatana/.ssh/id_rsa)\r\n\u001b[?1034h\u001b]0;~/scripts\u0007\r\r\n\u001b[32mwakatana@ANTARES \u001b[33m~/scripts\u001b[0m\r\r\n$ ls -1 db*\r\n" (spawn_id exp4) match regular expression "^db.*$"? Gate "db*"? gate=yes re=no
expect: does "Agent pid 6228\r\nIdentity added: /home/wakatana/.ssh/id_rsa (/home/wakatana/.ssh/id_rsa)\r\n\u001b[?1034h\u001b]0;~/scripts\u0007\r\r\n\u001b[32mwakatana@ANTARES \u001b[33m~/scripts\u001b[0m\r\r\n$ ls -1 db*\r\ndbupgrade.log\r\n" (spawn_id exp4) match regular expression "^db.*$"? Gate "db*"? gate=yes re=no
expect: does "Agent pid 6228\r\nIdentity added: /home/wakatana/.ssh/id_rsa (/home/wakatana/.ssh/id_rsa)\r\n\u001b[?1034h\u001b]0;~/scripts\u0007\r\r\n\u001b[32mwakatana@ANTARES \u001b[33m~/scripts\u001b[0m\r\r\n$ ls -1 db*\r\ndbupgrade.log\r\n\u001b]0;~/scripts\u0007\r\r\n\u001b[32mwakatana@ANTARES \u001b[33m~/scripts\u001b[0m\r\r\n$ " (spawn_id exp4) match regular expression "^db.*$"? Gate "db*"? gate=yes re=no
expect: timed out
Script has reached the 'timeout' branch
我尝试ls
的文件存在:
$ ls -1 db*
dbupgrade.log
PS:这是受this问题
的启发答案 0 :(得分:2)
在Expect
中,^
和$
的意思截然不同:
请注意,在许多编辑器中,
^
和$
匹配开头和 分别是行尾。但是,因为期望不是行 面向,这些字符匹配的开头和结尾 当前在期望匹配中的数据(与线相对) 缓冲强>
你可以这样做:
[STEP 101] # cat foo.exp
spawn bash --noprofile --norc
sleep 1
send "ls -1 db*\r"
expect {
-re {[\r\n]+(db.*?)[\r\n]+} {
send_user "\n>>> $expect_out(1,string) <<<\n"
}
}
[STEP 102] # ls -1 dbupgrade.log
dbupgrade.log
[STEP 103] # expect foo.exp
spawn bash --noprofile --norc
bash-4.3# ls -1 db*
dbupgrade.log
>>> dbupgrade.log <<<
[STEP 104] #