.profile/.bash_profile中tabs命令导致Expect脚本执行异常求助
解决思路与方案
1. 临时屏蔽tabs命令的终端控制输出
核心是让oracle用户的profile执行tabs -8时不产生控制字符,无需修改profile文件:
- 切换用户时指定
TERM=dumb终端类型,tabs命令在哑终端下不会输出控制序列:su - oracle -c 'TERM=dumb; source ~/.bash_profile; source oraenv <<< R01; 你的后续任务命令' - 或者在切换时临时替换
tabs为无操作命令:su - oracle -c 'alias tabs=true; source ~/.bash_profile; source oraenv <<< R01; 你的后续任务命令'
2. 绕过交互,直接给oraenv传递SID
避免用Expect处理oraenv的交互输入,直接通过Here字符串传递SID,减少Expect的交互场景:
# 在Expect脚本中,执行source oraenv时直接传入SID send "source oraenv <<< R01\r"
这样不需要等待oraenv的输入提示,从根源上避免控制字符干扰参数识别。
3. 在Expect中过滤终端控制字符
如果必须保留交互逻辑,在Expect中捕获输出后先过滤ANSI控制序列,再进行匹配或处理:
# 捕获输出并清理控制字符 expect -re "(.*)" { set raw_output $expect_out(1,string) # 移除所有ANSI终端控制序列 regsub -all {\x1b\[[0-9;]*[a-zA-Z]} $raw_output "" clean_output # 使用清理后的内容进行提示符匹配或参数解析 if {[string match "*$prompt*" $clean_output]} { # 执行后续操作 } }
同时,在调用目标命令时,确保Expect发送的参数是干净的,不受前面控制字符影响。
4. 跳过login shell的profile加载
如果oraenv的运行不需要profile中的其他配置,可以直接用非login shell切换,避免加载.profile和.bash_profile:
# 不带-的su不会加载login shell的profile su oracle -c 'source /u01/app/oracle/product/11.2.0/dbhome_1/bin/oraenv <<< R01; 你的后续任务命令'
注意:需要指定oraenv的绝对路径,确保环境变量正确。
内容的提问来源于stack exchange,提问作者dukul
相关产品推荐
相关产品推荐

