Динамическое построение команды в 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}