我有以下 shell 脚本。由于某种原因,java 程序的标准错误和标准输出没有打印到文件“日志”中,而是始终出现在控制台中。是否有某种类型或我遗漏了什么?
JAVACMD="java -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=19000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xss128k -Xmx700m -jar program.jar >log 2>&1 "
echo "Starting server...";
$JAVACMD&
最佳答案
遗憾的是,如果您想将重定向运算符保留在字符串值中,您将不得不使用 eval
。
与其他 shell 特殊字符一样,重定向运算符只有在未被引用时才会被评估。当您展开 JAVACMD 参数时,它将按空格拆分,但不会重新评估它包含的任何特殊字符。使用 eval
强制重新评估。
eval
的问题在于它强制对每个 字符进行重新计算。在你的情况下,其他角色都不会产生任何不良影响。如果您的字符串值包含一些您不希望 shell 重新评估的其他 shell 特殊字符(例如 ;(){}
…),您将不得不在 内部转义/引用它 字符串值,这样 eval
就不会赋予它特殊的含义。
⋮
eval "$JAVACMD &"
为避免 eval
出现问题,我建议将重定向移出字符串值:
JAVACMD="… program.jar"
⋮
$JAVACMD >log 2>&1 &
通过这种方式,您需要注意的字符串值中唯一的字符是空白字符(例如,如果您需要在其中一个选项/参数中嵌入一些空白;如果遇到这种情况,您可能会考虑使用数组变量或 "$@"
(在所有 Bourne-like shell 中都可用的单数类数组变量)。
关于java - 标准错误未从 bash 中的此 java 命令重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3830470/