1

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

  1. 运行一个应用程序(在我的情况下它是一个 java 应用程序)
  2. 将 stderr 指向一个文件
  3. 将 stderr + stdout 指向终端
  4. 返回应用程序的退出代码

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

[编辑]

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

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

2 回答 2

2

这将满足您的要求:

#!/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 保存到日志文件
于 2012-12-01T10:12:17.733 回答
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>&-
于 2012-12-01T09:43:53.323 回答