如何模拟交互式Shell执行脚本以生成符合文档需求的输出?
模拟交互式Shell执行脚本并输出简洁会话格式
需求说明
出于文档记录需求,希望以模拟手动在交互式Shell中输入的方式执行Shell脚本,仅保留脚本内命令的会话式输出,剔除额外的执行跟踪信息。
目标脚本(demo 文件)
x=123 echo $x
当前执行方式及问题
当前使用以下命令执行脚本:
PS4="$PS1" set -x -v . ./demo
得到的输出包含冗余的脚本调用跟踪:
. ./demo user@host:~/tmp$ . ./demo x=123 user@host:~/tmp$ x=123 echo $x user@host:~/tmp$ echo 123 123
期望输出格式
user@host:~/tmp$ x=123 user@host:~/tmp$ echo $x 123
以下是几种实现方案(不局限于bash):
解决方案
方法1:使用script命令生成纯会话记录
script是系统自带的会话记录工具,可直接生成符合需求的交互式输出:
# 直接在终端输出符合格式的内容 script -q -c 'bash -i -c "source ./demo"' /dev/null
参数说明:
-q:静默模式,隐藏工具自身的启动/结束提示-c:指定要执行的命令bash -i:启动交互式bash,确保提示符正常显示
执行后终端会直接输出期望的会话格式内容。
方法2:过滤set -x的输出内容
如果坚持使用set -x跟踪,可通过文本过滤保留需要的行:
PS4="$PS1" set -x -v . ./demo 2>&1 | grep -E "^$PS1|^[0-9]+$"
通过正则匹配,仅保留以提示符开头的命令行和纯数字类的输出行(可根据实际输出内容调整正则规则)。
方法3:用expect脚本模拟手动输入
编写expect脚本(命名为simulate_session.exp):
#!/usr/bin/expect spawn bash -i set prompt "user@host:~/tmp\\$ " expect -re $prompt send "x=123\r" expect -re $prompt send "echo \$x\r" expect -re $prompt send "exit\r" expect eof
赋予执行权限并运行:
chmod +x simulate_session.exp ./simulate_session.exp
脚本会完全模拟手动输入命令的过程,输出标准的交互式会话内容。
内容的提问来源于stack exchange,提问作者Pinke Helga
相关产品推荐
相关产品推荐

