2009-11-11 7 views
10

Rozwijam polecenie w bash dynamicznie. Działa to dobrze:Dynamiczne budowanie polecenia w bashu

COMMAND="java myclass" 
${COMMAND} 

Teraz chcę dynamicznie skonstruować polecenie redirectes wyjście:

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

Komenda nadal wywołuje proces java, ale wyjście nie jest przekierowywany do myfile.log

Dodatkowo, jeśli robię:

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

komenda nie jest prowadzony w t on tło.

Jakieś wskazówki, jak uzyskać przekierowanie dziennika i działające bity w tle? (Bash -x pokazuje komendy budowany zgodnie z oczekiwaniami)

(W rzeczywistości, w przeciwieństwie do tego przykładu, wartości log i tła są ustawione dynamicznie)

Odpowiedz

4

To nie działa, ponieważ notowania wyłączyć specjalnego znaczenia > i &. Musisz wykonać polecenia, które implementują te funkcje powłoki.

Aby przekierować, zadzwoń pod numer exec >> myfile.log 2>&1 przed poleceniem, które chcesz zarejestrować. Aby uzyskać program w tle, należy użyć nohup (nohup cmd args...).

+0

Dzięki za wyjaśnienie. – Joel

12

Można to zrobić za pomocą polecenia eval:

eval ${COMMAND} 
+4

Pamiętaj, że 'eval' może się zepsuć, jeśli parametry polecenia wymagają wyceny. –

+0

Skończyło się na używaniu tej odpowiedzi - jednak oznaczyłem Aarons jako poprawny, ponieważ był nieco bardziej kompletny ... chciałbym zaznaczyć je poprawnie. – Joel

12

eval robi to, co chcesz.

#!/bin/bash 

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


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