К сожалению, вам придется использовать eval
, если вы хотите сохранить операторы перенаправления в строковом значении.
Как и другие специальные символы оболочки, операторы перенаправления оцениваются, только если они не заключены в кавычки. Когда вы расширяете параметр JAVACMD, он разделяется на пробелы, но не переоценивает какие-либо специальные символы, которые он включает. Использование eval
вызывает эту переоценку.
Проблема с eval
заключается в том, что он заставляет каждый символ пересматриваться. В вашем случае, ни один из других персонажей не будет иметь неблагоприятных последствий. Если ваше строковое значение содержало какой-либо другой специальный символ оболочки (например, ;(){}
…), который вы не хотели, чтобы оболочка переоценивала, вы должны экранировать / заключить его в кавычки внутри строкового значения, чтобы eval
не придал бы этому особого значения.
⋮
eval "$JAVACMD &"
Чтобы избежать проблем с eval
, я предлагаю переместить перенаправление из строкового значения:
JAVACMD="… program.jar"
⋮
$JAVACMD >log 2>&1 &
Сделано таким образом, единственными символами в строковом значении, которые вы должны остерегаться, являются символы пробела (например, если вам нужен какой-то встроенный пробел в одном из параметров / аргументов; если вы столкнетесь с этим, вы можете рассмотреть возможность использования переменная-массив или "$@"
(единственная переменная в виде массива, доступная во всех оболочках, подобных Борну)).