Forum Programmation.shell Echappement de variable étrange avec Bash

Posté par  (site Web personnel) .
Étiquettes : aucune
-1
23
déc.
2010
Bonjour à tous,

Voici mon problème : j'ai un script shell qui configure une jvm pour le lancement de tomcat en assignant des paramètres à la variable JAVA_OPTS.
Je souhaiterais indiquer à ma jvm de s'arrêter lors d'une "OutOfMemoryException", pour ça la jvm de sun fournit le paramètre "-XX:OnOutOfMemoryError=" auquel on fournit la commande à exécuter.
Sauf que dans mon cas, Bash échappe de façon incongrue mes paramètres, dans mon script j'ai :


[...]
export JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
export JAVA_OPTS="$JAVA_OPTS -XX:OnOutOfMemoryError=\"kill -9 %p\""
[...]


et la jvm refuse de démarrer :

Unrecognized option: -9
Could not create the Java virtual machine.


J'ai utilisé "set -x" pour voir ce qui était exécuté et je m'aperçois que Bash échappe n'importe comment une partie de la variable "JAVA_OPTS" :

... -XX:+DisableExplicitGC '-XX:OnOutOfMemoryError="kill' -9 '%p"' -D...

Comme on peux le voir il ajoute des simples quotes au début jusqu'au premier espace. Du coup ma commande "kill -9 %p" qui devait être un seul paramètre est interprété comme 3 par java.

Quelqu'un aurait-il une idée du pourquoi du comment?
Merci d'avance.
  • # chez moi ça marche

    Posté par  . Évalué à 2.

    salut, ça ne va pas beaucoup t'aider, mais chez moi ça marche :


    export JAVA_OPTS="$JAVA_OPTS -XX:OnOutOfMemoryError=\"kill -9 %p\""
    echo $JAVA_OPTS
    -XX:OnOutOfMemoryError="kill -9 %p"
    • [^] # Re: chez moi ça marche

      Posté par  (site Web personnel) . Évalué à 2.

      Moi aussi, si je fait un simple écho ça semble marcher mais avec "set -x", on vois bien que des simples quotes sont ajoutées :

      $ export JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
      $ export JAVA_OPTS="$JAVA_OPTS -XX:OnOutOfMemoryError=\"kill -9 %p\""
      $ echo $JAVA_OPTS
      -XX:+DisableExplicitGC -XX:OnOutOfMemoryError="kill -9 %p"
      $ set -x
      $ echo $JAVA_OPTS
      + echo -XX:+DisableExplicitGC '-XX:OnOutOfMemoryError="kill' -9 '%p"'
  • # normal...

    Posté par  . Évalué à 3.

    C'est un problème d'ordre d'expansion et d'IFS.

    $ v="a:b c"
    $ BAK=$IFS ; IFS=: ; ls $v ; IFS=$BAK
    ls: impossible d'accéder à a: Aucun fichier ou dossier de ce type
    ls: impossible d'accéder à b c: Aucun fichier ou dossier de ce type

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.