tags:

views:

119

answers:

3

I am construcing a command in bash dynamically. This works fine:

COMMAND="java myclass"
${COMMAND}

Now I want to dynamically construct a command that redirectes the output:

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

The command still invokes the java process, but the output is not redirected to myfile.log

Additionally, if I do:

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

The command isn't run in the background.

Any clues on how to get the log redirect, and background bits working? (bash -x shows the commands being constructed as expected)

(In reality, unlike this example, the values of LOG and BACKGROUND are set dynamically)

+1  A: 

It doesn't work because quotes disable the special meaning of > and &. You must execute the commands which implement these features of the shell.

To redirect, call exec >> myfile.log 2>&1 before the command you want to log.

To run a program in the background, use nohup (nohup cmd args...).

Aaron Digulla
Thanks for the explanation.
Joel
+2  A: 

You could do it with the eval command:

eval ${COMMAND}
tangens
Beware that `eval` can break if the parameters of the command need quotes.
Aaron Digulla
I ended up using this answer - however I marked Aarons as correct as it was slightly more complete...wish I could mark them both correct.
Joel
A: 

eval does what you want.

#!/bin/bash

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


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