You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何模拟交互式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:05:24