如何为需要返回值的Bash函数添加日志功能?
Bash函数里怎么分开返回值和日志输出
在Bash里用$(函数名)捕获返回值时,会把函数所有标准输出(stdout)的内容都抓进去,所以日志如果也输出到stdout,就会和返回值混在一起。要解决这个问题,核心就是把日志输出到标准错误流(stderr),这样就不会被$()捕获。
具体改法
修改你的logger函数,把输出重定向到stderr(对应文件描述符2),两种常用写法任选:
写法一:给printf加重定向
function logger() { printf "Random Log\n" >&2 }
写法二:用echo加重定向
function logger() { echo "Random Log" >&2 }
修改后的完整代码
function main() { local variable=$(nested) echo "Variable value is: $variable" } function nested() { printf "Value" logger } function logger() { printf "Random Log\n" >&2 } main
运行效果
执行后就能得到你想要的预期输出:
Random Log Variable value is: Value
额外补充
- stderr默认直接打印到终端,不会被
$()捕获,刚好满足日志和返回值分离的需求。 - 如果要把日志存到文件里,执行脚本时可以把stderr重定向到文件,比如:
./your_script.sh 2> log.txt,这样日志会写入log.txt,正常输出还是显示在终端。
内容的提问来源于stack exchange,提问作者Jsh0s
相关产品推荐
相关产品推荐

