2010-09-30 3 views
0

J'ai le script shell suivant. Pour une raison quelconque, l'erreur standard et la sortie standard du programme java ne sont pas imprimées dans le fichier "log" mais apparaissent toujours dans la console. Y a-t-il un type où ou est-ce que je manque quelque chose?Erreur standard ne pas être redirigé de cette commande java dans bash

JAVACMD="java -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=19000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xss128k -Xmx700m -jar program.jar >log 2>&1 " 

echo "Starting server..."; 
$JAVACMD& 
+1

Voir aussi [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –

Répondre

3

Malheureusement, vous devrez utiliser eval si vous souhaitez conserver les opérateurs de redirection dans la valeur de chaîne.

Comme les autres caractères spéciaux shell, les opérateurs de redirection sont évalués uniquement s'ils ne sont pas entre guillemets. Lorsque vous développez le paramètre JAVACMD, il est divisé en espaces, mais il ne réévalue aucun des caractères spéciaux qu'il inclut. L'utilisation de eval force cette réévaluation.

Le problème avec eval est qu'il force tous les caractères être réévalué. Dans votre cas, aucun des autres personnages n'aura d'effets fâcheux. Si votre valeur de chaîne contenait un autre caractère shell-spécial (par exemple ;(){} ...) que vous ne vouliez pas que le shell réévalue, vous devrez l'échappement/quote à l'intérieur la valeur de chaîne de sorte que eval ne lui donnerait pas un caractère spécial sens.

⋮ 
eval "$JAVACMD &" 

Pour éviter des problèmes avec eval, je suggère de déplacer la réorientation de la valeur de la chaîne:

JAVACMD="… program.jar" 
⋮ 
$JAVACMD >log 2>&1 & 

fait de cette façon les seuls caractères de la valeur chaîne que vous devez surveiller Si vous avez besoin d'espaces blancs dans l'une des options/arguments, vous pouvez utiliser une variable tableau ou "[email protected]" (une variable singulière, similaire à un tableau, disponible dans tous les shells de type Bourne))).

1

Vous ne pouvez pas coller les redirections dans une variable comme celle-ci et attendez que bash les accepte. Exemple simple:

tesla:~ peter$ ECHOCMD='echo > log 2>&1' 
tesla:~ peter$ $ECHOCMD 
log 2>&1 

I.e. vos indicateurs de redirection deviennent des arguments simples, passés à votre invocation java. Une solution de contournement est de dire eval $JAVACMD mais cela ne rendra pas votre script plus propre.

2

Avez-vous essayé:

JAVACMD="java -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=19000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xss128k -Xmx700m -jar program.jar" 

echo "Starting server..."; 
$JAVACMD >log 2>&1 & 

Les redirections sont considérés comme arguments à la commande java comme ils sont contenus dans la variable.