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))).
Voir aussi [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –