为何sed命令在Expect脚本中执行失败,手动执行却正常?
问题原因
Expect基于Tcl语言,Tcl会将字符串中的[]识别为命令替换语法,会尝试执行方括号内的内容作为Tcl命令。你脚本里的[0-9]被Expect当成了要执行的Tcl命令,但0-9并不是有效的Tcl命令,因此抛出invalid command name "0-9"错误。
而手动执行时,命令是在shell环境中运行,[0-9]仅作为sed正则表达式的字符组语法,不会被解析为命令,所以能正常工作。
解决方法
有两种简单的修复方式:
方法1:转义方括号
在Tcl中,用反斜杠\转义方括号,让它被当作普通字符处理:
send "sed -i -E 's/value=\[0-9\]+/value=9999/' target_file\r"
方法2:使用大括号包裹命令字符串
Tcl中,大括号{}内的内容会被当作字面量,不会解析命令替换或变量引用,这是更简洁的方式:
send {sed -i -E 's/value=[0-9]+/value=9999/' target_file\r}
两种方法都能让Expect正确将完整的sed命令发送到远程shell执行,避免Tcl的语法解析干扰。
内容的提问来源于stack exchange,提问作者Roger Mungo
相关产品推荐
相关产品推荐

