Стандартная ошибка не перенаправляется из этой команды Java в Bash - PullRequest
0 голосов
/ 30 сентября 2010

У меня есть следующий сценарий оболочки. По какой-то причине стандартная ошибка java-программы и стандартный вывод не выводятся в файл «log», а вместо этого всегда отображаются в консоли. Есть какой-то тип где или я что-то упускаю?

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&

Ответы [ 3 ]

3 голосов
/ 30 сентября 2010

К сожалению, вам придется использовать eval, если вы хотите сохранить операторы перенаправления в строковом значении.

Как и другие специальные символы оболочки, операторы перенаправления оцениваются, только если они не заключены в кавычки. Когда вы расширяете параметр JAVACMD, он разделяется на пробелы, но не переоценивает какие-либо специальные символы, которые он включает. Использование eval вызывает эту переоценку.

Проблема с eval заключается в том, что он заставляет каждый символ пересматриваться. В вашем случае, ни один из других персонажей не будет иметь неблагоприятных последствий. Если ваше строковое значение содержало какой-либо другой специальный символ оболочки (например, ;(){}…), который вы не хотели, чтобы оболочка переоценивала, вы должны экранировать / заключить его в кавычки внутри строкового значения, чтобы eval не придал бы этому особого значения.

⋮
eval "$JAVACMD &"

Чтобы избежать проблем с eval, я предлагаю переместить перенаправление из строкового значения:

JAVACMD="… program.jar"
⋮
$JAVACMD >log 2>&1 &

Сделано таким образом, единственными символами в строковом значении, которые вы должны остерегаться, являются символы пробела (например, если вам нужен какой-то встроенный пробел в одном из параметров / аргументов; если вы столкнетесь с этим, вы можете рассмотреть возможность использования переменная-массив или "$@" (единственная переменная в виде массива, доступная во всех оболочках, подобных Борну)).

2 голосов
/ 30 сентября 2010

Вы пробовали:

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"

echo "Starting server...";
$JAVACMD >log 2>&1 &

Перенаправления считаются аргументами команды java, поскольку они содержатся в переменной.

1 голос
/ 30 сентября 2010

Вы не можете вставлять перенаправления в такую ​​переменную и ожидать, что bash их примет. Простой пример:

tesla:~ peter$ ECHOCMD='echo > log 2>&1'
tesla:~ peter$ $ECHOCMD
log 2>&1

т.е. Ваши индикаторы перенаправления становятся простыми аргументами, передаваемыми вашему вызову Java.

Один из обходных путей - сказать eval $JAVACMD, но это не сделает ваш скрипт чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...