如何在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
相关产品推荐
相关产品推荐

