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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:04:04