为什么expect的interact命令不起作用?

为什么expect的interact命令不起作用?

我正在尝试使用 Expect 来自动化 gdb 。我的脚本将启动 gdb,进行一些初始化,然后将控制权传递给用户。 Expect 的interact命令似乎是完成这项工作的完美工具。

现在考虑:

$ echo "spawn gdb
    expect \"(gdb) \"
    send \"help\r\"
    expect \"(gdb) \"
    interact" | expect -

在我的机器上,这个 scriptlet 生成 gdb,按预期发出帮助命令。但随后它立即退出脚本并使我返回到 bash 提示符。我希望用户留在 gdb 中并能够发出命令。

知道我在这里缺少什么吗?

答案1

interact将从标准输入获取输入expects,这是现在关闭的管道echo

您可以改为编写它(ksh/zsh/bash 语法):

expect <(echo "spawn gdb
  expect \"(gdb) \"
  send \"help\r\"
  expect \"(gdb) \"
  interact" )

它仍然通过管道提供,但是这一次,管道作为路径参数给出,因此expect期望的标准输入不受影响。

但在这种情况下,显然可以这样写:

expect -c '
  spawn gdb
  expect "(gdb)"
  send "help\r"
  expect "(gdb) "
  interact'

expect大多数 shell都sh允许通过-c.

如果您仍然需要传递命令的输出(就像echo您的情况一样),您-c也可以使用以下命令来执行此操作:

expect -c "$(echo...)"

然而,这意味着与管道相反的方法expect在该命令完成之前不会启动。

顺便说一句,在这里,您可以使用.gdbinit 文件或-ix选项来代替gdb,您实际上并不需要expect.

相关内容