Erreur standard ne pas être redirigé depuis cette commande java dans bash

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 quelque chose me manque?

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& 

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 du shell, les opérateurs de redirection ne sont évalués que s’ils ne sont pas cités. Lorsque vous développez le paramètre JAVACMD, il se divisera sur les espaces, mais ne réévaluera pas les caractères spéciaux qu’il contient. Utiliser eval force cette réévaluation.

Le problème avec eval est qu’il force chaque caractère à être réévalué. Dans votre cas, aucun des autres personnages n’aura d’effets indésirables. Si votre valeur de chaîne contenait un autre caractère spécial de shell (par exemple ;(){} …) que vous ne vouliez pas que le shell soit réévalué, vous devriez l’échapper / le citer dans la valeur de la chaîne pour que eval ne le donne pas une signification particulière

 ⋮ eval "$JAVACMD &" 

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

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

Ainsi, les seuls caractères de la valeur de chaîne que vous devez surveiller sont les espaces (par exemple, si vous avez besoin d’espaces incorporés dans l’une des options / arguments, vous pouvez utiliser une variable de tableau ou "$@" (une variable singulière, ressemblant à un tableau, disponible dans tous les shells de type Bourne)).

As-tu 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ées comme des arguments de la commande java, car elles sont contenues dans la variable.

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

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

C’est-à-dire que vos indicateurs de redirection deviennent des arguments simples, transmis à votre invocation java.

Une solution consiste à dire eval $JAVACMD mais cela ne rendra pas votre script plus propre.