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

如何在Bash中通过管道将两个命令的输出保存到同一变量?

Bash中捕获管道前后命令的输出到同一变量(保留管道)

场景1:管道前后命令的输出均为标准输出(如ls -l | grep filename)

要同时保存ls -l的完整输出和grep的过滤结果,可先捕获ls -l的输出,再将其传递给grep,最后合并两者内容到目标变量:

# 捕获ls -l的完整输出
ls_output=$(ls -l)
# 基于ls的输出执行grep并捕获结果
grep_output=$(echo "$ls_output" | grep main.sh)

# 合并两个输出到变量(换行分隔)
combinedOutput="$ls_output"$'\n'"$grep_output"

# 验证结果
echo "$combinedOutput"

执行后combinedOutput会包含ls -l的全部内容,以及grep main.sh的过滤结果,与示例预期一致。

场景2:管道命令通过标准输出传输数据,输出信息在标准错误(如tar + pigz压缩)

tar cvf - /some/directory/会把归档数据输出到stdout(供pigz读取),而文件列表输出到stderr;pigz --verbose的日志信息也输出到stderr。要捕获这两个命令的stderr输出,同时不影响管道数据传输和文件写入:

# 用文件描述符重定向捕获两个命令的stderr输出
combinedOutput=$(
  tar cvf - /some/directory/ 2>&1 1>&3 | pigz --verbose -1 -p 4 2>&1 1>&3 >compressed_archive.tgz
) 3>&1

# 验证捕获的输出内容
echo "$combinedOutput"

核心逻辑说明:

  • 3>&1:创建临时文件描述符3,指向当前终端的标准输出(即最终要捕获输出的通道)
  • 2>&1 1>&3:将命令的stderr重定向到变量捕获通道,同时将stdout重定向到描述符3,保证管道内的数据流正常传递给下一个命令
  • 管道两端的命令都执行上述重定向,即可将两者的stderr输出统一捕获到combinedOutput,同时不影响归档压缩的正常执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:01:14