bash脚本,将stderr定向到文件,stdout+stderr定向到终端,并返回退出代码



这是我在System.exit中意图的更好措辞,bash eval没有检测到返回代码。我需要一个 bash 脚本

  1. 运行一个应用程序(在我的例子中它是一个Java应用程序)
  2. 将 stderr 定向到文件
  3. 将标准输出 + 标准输出引导至终端
  4. 返回应用的退出代码

出于某种原因,这很难做到,尽管在我看来它像是企业应用程序的标准配置......谢谢!

[编辑]

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

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

这将满足您的要求:

#!/bin/bash
errlog="/var/log/my_app"
exec 2> >(tee "$errlog")
java -jar /path/to/app.jar
exit $?  

解释

  • exec 2 >捕获 STDERR(如果您在右侧提供文件,STDERR 将在此文件中重定向,终端上不再有)
  • >( ) 是一个 bash 进程替换(这在后台创建文件描述符)
  • tee既可以在终端上显示 STDERR 并将 STDERR 保存到日志文件中
# 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>&-

最新更新