这是我在System.exit中意图的更好措辞,bash eval没有检测到返回代码。我需要一个 bash 脚本
- 运行一个应用程序(在我的例子中它是一个Java应用程序)
- 将 stderr 定向到文件
- 将标准输出 + 标准输出引导至终端
- 返回应用的退出代码
出于某种原因,这很难做到,尽管在我看来它像是企业应用程序的标准配置......谢谢!
[编辑]
通过包装此脚本来测试解决方案:
#!/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>&-