2009-11-11 19 views
10

Estoy construyendo un comando en bash dinámicamente. Esto funciona bien:Construyendo dinámicamente un comando en bash

COMMAND="java myclass" 
${COMMAND} 

Ahora quiero construir dinámicamente un comando que redirectes la salida:

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

El comando todavía invoca el proceso de java, pero la salida no se redirige a myfile.log

Además, si lo hago:

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

El comando no se ejecuta en t el fondo.

¿Alguna pista sobre cómo obtener el redireccionamiento del registro y el funcionamiento de los bits de fondo? (-x golpe muestra los comandos que se construyen como se esperaba)

(En realidad, a diferencia de este ejemplo, los valores de log y el fondo están fijados de forma dinámica)

Respuesta

4

No funciona porque cotizaciones desactivar el significado especial de > y &. Debe ejecutar los comandos que implementan estas características del shell.

Para redirigir, llame al exec >> myfile.log 2>&1 antes del comando que desea iniciar sesión.

Para ejecutar un programa en segundo plano, use nohup (nohup cmd args...).

+0

Gracias por la explicación. – Joel

12

Se podía hacerlo con el comando eval:

eval ${COMMAND} 
+4

Tenga en cuenta que 'eval' puede romperse si los parámetros del comando necesitan comillas. –

+0

Terminé usando esta respuesta; sin embargo, marqué Aarons como correcto, ya que fue un poco más completo ... desearía poder marcar ambos correctos. – Joel

12

eval hace lo que quiere.

#!/bin/bash 

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


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