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

Nic*_*fon 8 scripting expect

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

现在考虑:

$ echo "spawn gdb
    expect \"(gdb) \"
    send \"help\r\"
    expect \"(gdb) \"
    interact" | expect -
Run Code Online (Sandbox Code Playgroud)

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

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

Sté*_*las 12

interact将从expects标准输入获取其输入,即echo现在关闭的管道。

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

expect <(echo "spawn gdb
  expect \"(gdb) \"
  send \"help\r\"
  expect \"(gdb) \"
  interact" )
Run Code Online (Sandbox Code Playgroud)

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

但是,在这种情况下,编写它的明显可能是:

expect -c '
  spawn gdb
  expect "(gdb)"
  send "help\r"
  expect "(gdb) "
  interact'
Run Code Online (Sandbox Code Playgroud)

expectsh和大多数 shell一样,允许使用-c.

如果您仍然需要传递命令的输出(如echo您的情况),您也可以-c使用:

expect -c "$(echo...)"
Run Code Online (Sandbox Code Playgroud)

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

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