如何为expect -c脚本传递参数并保持标准输入打开?
解决Expect临时脚本参数传递与stdin保持打开的问题
错误原因
你遇到的can't read "argv": no such variable错误,核心原因有两点:
- 部分环境下Expect的
-c模式中,$argv变量的引用需要适配语法,或是你的Expect版本不支持{*}这种Tcl 8.5+才有的列表展开特性。 - 原命令缺少维持stdin打开的关键指令,即便参数传递正常,进程执行后也会直接退出,无法保持stdin连接。
正确执行方式
方式1:兼容旧版本Expect(用eval展开参数)
如果你的Expect版本较低,不支持{*}语法,可使用eval解析并执行参数列表:
expect -c 'eval spawn $argv; interact' -- echo hello world
方式2:支持Tcl 8.5+版本(用{*}展开)
若环境支持Tcl 8.5及以上,直接用{*}展开参数列表,写法更简洁:
expect -c 'spawn {*}$argv; interact' -- echo hello world
关键说明
--:用于分隔Expect自身选项和要执行的命令参数,避免命令中带-开头的参数被误判为Expect的选项。interact:这是保持stdin打开的核心指令,它会将当前终端的stdin/stdout绑定到spawn启动的进程,实现交互式输入输出,维持stdin连接。- 原命令中的
/dev/null是多余的,无需添加,interact已能满足stdin保持打开的需求。
内容的提问来源于stack exchange,提问作者KamilCuk
相关产品推荐
相关产品推荐

