0

当我像这样以交互方式使用 expect 时效果很好:

root@vagrantup:/home/vagrant> expect -i
expect1.1> spawn screen -x
spawn screen -x
3195
expect1.2> send "ls\n"
expect1.3> exit

但是文件中使用的命令相同:

spawn screen -x
send "ls\n"
exit

仅有时有效,例如。每次执行文件时 1/10 次。这真的很奇怪。

我用这个命令执行文件:

expect -f Expectfile

我还测试了这些:

expect -b Expectfile
expect Expectfile

但我得到同样的错误。

它什么也没说。另一个屏幕(因为我使用的是“屏幕”命令)仅在某个时候响应。有谁知道为什么?

4

2 回答 2

4

我希望你ls用来代替别的东西,因为如果你只想要一个本地文件列表,你最好使用该glob命令。当然,你可能实际上正在做类似的事情,使用screen -xtoo 来做什么,但它让我觉得现在有点过于复杂了。

可能的失败(尽管由于缺乏证据我在这里在黑暗中拍摄)可能是使用虚拟终端的各种事物之间的交互(期望和屏幕都这样做,而且系统范围内没有那么多虚拟终端可用)或由于没有足够的时间重新建立与会话的连接而导致的某种计时问题。(虽然 10 次中有 9 次失败?这很多。)如果是时间问题,插入 anafter 500会有所帮助。如果是终端数量,那你就有问题了;也许可以使用类似的工具来发现这一点,lsof但是有很多活动部件,我不知道出了什么问题。

于 2010-09-19T20:19:38.280 回答
1

为什么?因为你误用了 Expect。

我不相信 stackoverflow 线程是一种有效的媒介来教授您所缺少的 Expect。一个更好的起点可能是这样的:您认为为什么应该使用 Expect?要像您尝试的那样自动化屏幕,您最好使用核心 Tcl,而不是 Tcl 的 Expect 扩展。

屏幕很棒,Expect 很棒,我一直支持自动化。您提出的特定组合听起来比可能需要的要复杂得多。

于 2010-09-19T19:56:07.937 回答