在Tcl expect中,有没有一种方法可以在不将输出从缓冲区中移除的情况下期望输出?

在Tcl expect中,有没有一种方法可以在不将输出从缓冲区中移除的情况下期望输出?,tcl,expect,Tcl,Expect,我正在寻找某种功能来“窥视”stdout,而无需将其从expect的缓冲区中删除,这样它就可以被另一个expect命令读入。或者,有没有办法在读取后将其放回缓冲区 编辑:被要求提供一些代码,它基本上是一个shell提示符,类似于: (prompt) bad_command_that_was_sent error message (prompt) successful_command_that_was_sent (prompt) other_successful_command long barf

我正在寻找某种功能来“窥视”stdout,而无需将其从expect的缓冲区中删除,这样它就可以被另一个expect命令读入。或者,有没有办法在读取后将其放回缓冲区

编辑:被要求提供一些代码,它基本上是一个shell提示符,类似于:

(prompt) bad_command_that_was_sent
error message
(prompt) successful_command_that_was_sent
(prompt) other_successful_command
long barf of data that has
very little consistency
and almost no way to tell when it\'s
about to end as the prompt just shows
up again suddenly but I really want to save
it and parse it.
(prompt) 
现在我是这样看的:

expect {
    -re "Error message regex" {error handling part}
    -re "Prompt regex" {anything I need to do with successes}
}

我目前正在使用一种变通方法,发送一个额外的换行符(
send“command\r\r”
),该换行符可以让我检测到两个提示,但这并不理想,而且实际上已经造成了一些错误。

如果要捕获所有命令输出,不包括提示:

set prompt_re {\(prompt\) $}
send -- "other_successful_command\r"
expect {
    -re $err_re {handle error}
    -re "(.+)$prompt_re" {
        doSomethingWith $expect_out(1,string)
    }
}
如果需要大量数据,请查看
match\u max
命令


所以你不知道什么时候会出错。我将假设远程系统是bourne类型的shell:执行命令,捕获输出,查询退出状态,然后判断命令的成功/失败

send -- "some command\r"
expect {
    -re "(.+)$prompt_re" {
        set commandOutput $expect_out(1,string)
        send "echo \$?\r"
        expect -re "(\\d+)\\s+$prompt_re"
        set exitStatus $expect_out(1,string)
        doSomethingWith $exit_status $command_output
    }
}

如果要捕获所有命令输出(不包括提示),请执行以下操作:

set prompt_re {\(prompt\) $}
send -- "other_successful_command\r"
expect {
    -re $err_re {handle error}
    -re "(.+)$prompt_re" {
        doSomethingWith $expect_out(1,string)
    }
}
如果需要大量数据,请查看
match\u max
命令


所以你不知道什么时候会出错。我将假设远程系统是bourne类型的shell:执行命令,捕获输出,查询退出状态,然后判断命令的成功/失败

send -- "some command\r"
expect {
    -re "(.+)$prompt_re" {
        set commandOutput $expect_out(1,string)
        send "echo \$?\r"
        expect -re "(\\d+)\\s+$prompt_re"
        set exitStatus $expect_out(1,string)
        doSomethingWith $exit_status $command_output
    }
}

你能发布一些代码吗?你能发布一些代码吗?问题是没有任何东西可以与$err\re匹配。只有下一个提示符,但有了这个提示符,该提示符仍然会被这个expect命令捕获,并且不会被以后的任何提示符捕获。问题是没有任何东西可以与$err\re匹配。只有下一个提示,使用这个提示,该提示仍然被这个expect命令捕获,并且不能被任何未来的命令捕获。