java - 标准错误未从 bash 中的此 java 命令重定向

标签 java linux bash unix shell

我有以下 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/

相关文章:

Java Regex 使用正则表达式保留预期字符串并删除其他字符串

Java Web 应用程序性能

c - 当我在 Linux Mint 的终端窗口上编译具有 getchar() 等的程序时,我没有得到输出

Bash:限制并发作业的数量?

java - 如何删除 jtextfield、jbutton 和 raisebevel 边框之间的空间

java - 在 Java 1.4 中如何查看子字符串是否存在于另一个字符串中?

linux - sed 用 NULL 替换空格

linux - 使用 dpkg 从 debian 软件包安装的文件不属于 root

bash - 使用 prolog 输出到 bash shell

bash - 为什么 bash 大括号扩展在某些算术表达式中有效,但在其他表达式中无效?