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