Динамическое построение команды в bash

Я строю команду в bash динамически. Это отлично работает:

COMMAND="java myclass"
${COMMAND}

Теперь я хочу динамически построить команду, которая перенаправляет вывод:

LOG=">> myfile.log 2>&1"
COMMAND="java myclass $LOG"
${COMMAND}

Команда все еще вызывает java-процесс, но вывод не перенаправляется на myfile.log

Кроме того, если я это сделаю:

BACKGROUND="&"
COMMAND="java myclass $BACKGROUND"
${COMMAND}

Команда не запускается в фоновом режиме.

Любые подсказки о том, как получить переадресацию журнала и работающие биты фона? (bash -x показывает, что команды строятся как ожидалось)

(В действительности, в отличие от этого примера, значения LOG и BACKGROUND устанавливаются динамически)

Ответ 1

Это не работает, потому что кавычки отключают специальный смысл > и &. Вы должны выполнить команды, которые реализуют эти функции оболочки.

Для перенаправления вызовите exec >> myfile.log 2>&1 перед командой, которую вы хотите зарегистрировать.

Чтобы запустить программу в фоновом режиме, используйте nohup (nohup cmd args...).

Ответ 2

Вы можете сделать это с помощью команды eval:

eval ${COMMAND}

Ответ 3

eval делает то, что вы хотите.

#!/bin/bash

CMD="echo foo"
OUT="> foo.log"
eval ${CMD} ${OUT}


CMD="sleep 5"
BG="&"
eval ${CMD} ${BG}