Динамическое построение команды в bash - PullRequest
14 голосов
/ 11 ноября 2009

Я строю команду в 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 устанавливаются динамически)

Ответы [ 3 ]

15 голосов
/ 11 ноября 2009

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

eval ${COMMAND}
12 голосов
/ 11 ноября 2009

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

#!/bin/bash

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


CMD="sleep 5"
BG="&"
eval ${CMD} ${BG}
5 голосов
/ 11 ноября 2009

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

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

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

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