bash脚本,指示stderr到文件,stdout + stderr到终端,并返回退出代码

时间:2012-12-01 08:25:19

标签: bash error-handling stdout stderr

这是我在System.exit return code isn't detected by bash eval中更好的措辞。我需要一个

的bash脚本
  1. 运行一个应用程序(在我的例子中是一个java应用程序)
  2. 将stderr定向到文件
  3. 将stderr + stdout指向终端
  4. 返回应用的退出代码
  5. 出于某种原因,这很难做到,尽管在我看来它就像是企业应用程序的标准配置...... 谢谢!

    [编辑]

    通过包装此脚本来测试解决方案:

    #!/bin/sh
    echo "This is Standard Out"
    echo "This is Standard Error" >&2
    cat meow
    

2 个答案:

答案 0 :(得分:2)

这符合您的要求:

#!/bin/bash

errlog="/var/log/my_app"

exec 2> >(tee "$errlog")

java -jar /path/to/app.jar

exit $?  

<强>说明

  • exec 2 >捕获STDERR(如果您在右侧提供文件,则STDERR将在此文件中重定向,终端上不再重定向)
  • >( )是一个bash process substitution(这在后台创建文件描述符)
  • tee同时显示终端上的STDERR&amp;将STDERR保存到日志文件

答案 1 :(得分:1)

# Save old stdout
exec 3>&1
# Redirect stderr to pipe, stdout to saved descriptor, pipe goes to tee
app_command 2>&1 >&3 | tee errorfile
# close temporary descriptor now that app is done
exec 3>&-