Shell脚本执行错误未写入日志,如何捕获错误输出?
解决Shell脚本错误信息无法写入日志的问题
这其实是个非常常见的Shell重定向问题,很多刚接触脚本的朋友都会遇到~
首先得先搞清楚Shell里的两个关键输出流:
- 标准输出(stdout):对应文件描述符
1,就是命令正常执行的输出(比如你脚本里echo $PATH、echo $PWD的内容) - 标准错误(stderr):对应文件描述符
2,就是命令执行出错时的提示信息(比如python: not found这类报错)
你用的sh file.sh > /tmp/out其实是sh file.sh 1> /tmp/out的简写——它只把标准输出重定向到了/tmp/out,但标准错误还是默认输出到终端,这就是为什么你看不到错误信息在日志里的原因。
解决方法分两种场景:
1. 把错误信息和正常输出写到同一个日志文件
有两种常用写法:
POSIX兼容的写法(适用于所有符合POSIX标准的Shell,比如dash、bash):
sh file.sh > /tmp/out 2>&1这里的
2>&1表示「把文件描述符2(stderr)的输出重定向到文件描述符1(stdout)当前指向的位置」,也就是和正常输出一起写入/tmp/out。Bash简化写法(更简洁,仅适用于bash等支持扩展的Shell):
sh file.sh &> /tmp/out这个写法和上面的效果完全一致,只是把
> /tmp/out 2>&1简化成了&> /tmp/out。
执行完上面的命令后,/tmp/out里就会同时包含echo的输出和python: not found的错误信息了。
2. 把错误信息单独写入另一个文件
如果你想把正常输出和错误信息分开保存,可以这样写:
sh file.sh > /tmp/out 2>/tmp/error.log
这样/tmp/out里只有正常的输出内容,/tmp/error.log里会单独记录所有错误信息。
内容的提问来源于stack exchange,提问作者Akashdeep Saluja
相关产品推荐
相关产品推荐

