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

如何为命令的stdout和stderr添加前缀并保留原有输出流

给命令的stdout和stderr分别添加前缀并保留原输出流

这个问题确实很常见——想要给命令的输出加前缀但又不想混同标准输出和标准错误流,我来给你几个实用的解决方案:

方法一:用Bash进程替换(最直观)

利用Bash的进程替换特性,可以分别对stdout和stderr进行处理,同时保留它们各自的输出流向:

your_command > >(sed 's/^/[prefix-out] /') 2> >(sed 's/^/[prefix-err] /' >&2)

解释:

  • > >(sed ...):把命令的stdout重定向到一个sed进程,该进程给每一行添加[prefix-out]前缀后,输出到原本的stdout(也就是你的终端或者后续的管道)。
  • 2> >(sed ... >&2):把命令的stderr重定向到另一个sed进程,添加[prefix-err]前缀后,通过>&2把结果输出回原本的stderr流,这样错误信息依然会走错误通道(比如不会被管道后面的命令当作正常输入)。

这个方法需要Bash或Zsh支持,大部分现代Linux/macOS环境都默认满足。

方法二:用Awk统一处理(更灵活)

如果你需要更复杂的逻辑(比如根据内容动态调整前缀),可以用Awk来区分并处理两个流:

your_command 2>&1 | awk '{
    # 示例:假设错误行以ERROR:开头,可根据实际情况修改判断规则
    if ($0 ~ /^ERROR:/) {
        print "[err] " $0 > "/dev/stderr"
    } else {
        print "[out] " $0 > "/dev/stdout"
    }
}'

不过这个方法需要你能通过内容区分原stdout和stderr,如果做不到的话,还是方法一更可靠。

方法三:用脚本封装(复用性强)

如果经常需要这个功能,可以写一个简单的脚本(比如叫prefix-output.sh):

#!/bin/bash
# 默认前缀可自定义,第一个参数是stdout前缀,第二个是stderr前缀
OUT_PREFIX="${1:-[stdout] }"
ERR_PREFIX="${2:-[stderr] }"

# 执行后续传入的命令并添加前缀
"${@:3}" > >(sed "s/^/$OUT_PREFIX/") 2> >(sed "s/^/$ERR_PREFIX/" >&2)

使用的时候直接:

./prefix-output.sh "[my-out] " "[my-err] " your_command --args

这样就可以快速给任意命令的输出添加自定义前缀,还能保留流的区分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:18:21