2009-11-11 8 views
10

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

COMMAND="java myclass" 
${COMMAND} 

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

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

Команда еще вызывающий процесс Java, но выход не перенаправлен myfile.log

Кроме того, если я:

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

команда не выполняется в т он фон.

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

(В действительности, в отличие от этого примера, значение LOG и ПРЕДПОСЫЛОК устанавливаются динамически)

ответ

4

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

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

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

+0

Спасибо за объяснение. – Joel

12

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

eval ${COMMAND} 
+4

Остерегайтесь того, что 'eval' может сломаться, если параметры команды нуждаются в котировках. –

+0

Я закончил тем, что использовал этот ответ, однако я пометил Ааронов как правильные, поскольку он был немного более полным ... хотелось бы отметить, что они оба правильны. – Joel

12

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

#!/bin/bash 

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


CMD="sleep 5" 
BG="&" 
eval ${CMD} ${BG} 
Смежные вопросы