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

如何让Bash脚本set -x输出为粗体,命令输出保持正常

让bash的set -x追踪输出变成粗体的方法

这个问题我之前也碰到过,要让set -x的追踪行(比如+ echo foo)变成粗体,同时保持命令自身的输出正常,其实只需要利用bash的两个特性:PS4环境变量和DEBUG陷阱,全程不需要手动给命令加任何转义序列。

核心思路

  • PS4变量控制着set -x输出的前缀,默认是+ ,我们可以给它加上开启粗体的终端转义序列。
  • 但直接开启粗体后,后续命令的输出也会变成粗体,所以需要用DEBUG陷阱在每个命令执行前恢复终端的默认格式,确保命令输出正常。

实现示例

修改你的foo.sh脚本如下:

#!/bin/bash
# 设置PS4:开启粗体 + 默认的"+ "前缀
export PS4='\e[1m+ '
# 设置DEBUG陷阱,在每个命令执行前恢复终端默认格式(关闭粗体)
trap 'tput sgr0' DEBUG
# 开启命令追踪
set -x

# 你的命令在这里
echo foo
ls -l /dev/null
# 可以加更多命令测试
echo "another test line"

执行效果

运行脚本后,你会看到:
+ echo foo
foo
+ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Aug 28 10:00 /dev/null
+ echo "another test line"
another test line

所有set -x的追踪行都是粗体,命令输出保持正常格式,完全符合你的需求!

细节说明

  1. 为什么用tput sgr0而不是直接写\e[0m?
    tput sgr0是终端无关的命令,会自动适配不同的终端类型(比如xterm、tmux等)输出正确的恢复转义序列,比硬编码\e[0m兼容性更强。如果你的环境没有tput,也可以直接用echo -ne "\e[0m"替代陷阱里的tput sgr0。

  2. 子shell场景的处理
    如果脚本里有子shell(比如(echo bar)),默认情况下DEBUG陷阱不会传递到子shell中,导致子shell的set -x追踪行开启粗体后无法关闭。解决方法是加上set -o functrace,让陷阱在函数和子shell中生效:

    # 在设置陷阱前加上这一行
    set -o functrace
    

这样不管是主shell还是子shell里的set -x追踪行都会变成粗体,命令输出正常。

内容的提问来源于stack exchange,提问作者P i

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:57:56