我正在尝试使用 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
.