2009-11-11 14 views
10

Sto costruendo un comando in bash dinamicamente. Questo funziona bene:Creazione dinamica di un comando in bash

COMMAND="java myclass" 
${COMMAND} 

Ora voglio costruire dinamicamente un comando che reindirizzare le l'uscita:

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

Il comando richiama ancora il processo di Java, ma l'uscita non viene reindirizzato a myfile.log

Inoltre, se faccio:

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

Il comando non viene eseguito in t lui sfondo.

Eventuali indizi su come ottenere il reindirizzamento del registro e il funzionamento dei bit di sfondo? (Bash -x mostra i comandi in costruzione come previsto)

(In realtà, a differenza di questo esempio, i valori di LOG e BASSA sono impostati dinamicamente)

risposta

4

Non funziona perché citazioni disabilita il significato speciale > e &. È necessario eseguire i comandi che implementano queste funzionalità della shell.

Per reindirizzare, chiamare exec >> myfile.log 2>&1 prima del comando che si desidera registrare.

Per eseguire un programma in background, utilizzare nohup (nohup cmd args...).

+0

Grazie per la spiegazione. – Joel

12

Si potrebbe fare con il comando eval:

eval ${COMMAND} 
+4

Attenzione che 'eval' può rompersi se i parametri del comando hanno bisogno di virgolette. –

+0

Ho finito per usare questa risposta, tuttavia ho contrassegnato Aarons come corretto poiché era leggermente più completo ... vorrei poterli contrassegnare entrambi corretti. – Joel

12

eval fa ciò che si vuole.

#!/bin/bash 

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


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