Shell脚本如何仅将指定输出返回给调用方并保留控制台日志
实现方案
核心原理:Shell中$()命令替换默认仅捕获**标准输出流(文件描述符1,stdout)**的内容,而控制台默认会同时打印标准输出和标准错误流(文件描述符2,stderr)的所有内容,利用该特性即可实现需求。
方案1:最低改造成本(推荐)
将不需要被捕获的信息类日志输出到标准错误流,仅把需要返回的最终结果保留在标准输出流即可,调用侧代码无需任何修改。
修改后的sample.sh示例:
#!/bin/bash # some git operations # 信息类日志输出到stderr,不会被$()捕获,但会正常打印到控制台 echo "some informative logs 1" >&2 echo "some informative logs 2" >&2 echo "some informative logs 3" >&2 echo "some informative logs 4" >&2 if some_condition ; then # 最终结果输出到stdout,会被捕获存入变量 echo "This condition evaluated true" else echo "This condition evaluated false" fi
调用侧仍使用原有逻辑即可:
result=$(sh sample.sh) echo "------- " $result
方案2:不修改原有日志输出流
如果原有日志有固定输出要求不能改写到stderr,可以通过自定义文件描述符实现:
- 修改
sample.sh,将最终结果输出到自定义的文件描述符3:
#!/bin/bash # some git operations # 日志正常输出到stdout,会直接打印到控制台 echo "some informative logs 1" echo "some informative logs 2" echo "some informative logs 3" echo "some informative logs 4" if some_condition ; then # 最终结果输出到自定义文件描述符3 echo "This condition evaluated true" >&3 else echo "This condition evaluated false" >&3 fi
- 修改调用侧代码,仅捕获文件描述符3的内容:
# 仅捕获文件描述符3的内容赋值给result,stdout内容正常打印到控制台 result=$(sh sample.sh 3>&1 1>&2) echo "------- " $result
内容的提问来源于stack exchange,提问作者Johnykutty
相关产品推荐
相关产品推荐

