Le script shell suivant prend une liste d'arguments, convertit les chemins Unix en chemins WINE/Windows et appelle l'exécutable donné sous WINE.Citation d'arguments de ligne de commande dans des scripts shell
#! /bin/sh
if [ "${1+set}" != "set" ]
then
echo "Usage; winewrap EXEC [ARGS...]"
exit 1
fi
EXEC="$1"
shift
ARGS=""
for p in "[email protected]";
do
if [ -e "$p" ]
then
p=$(winepath -w $p)
fi
ARGS="$ARGS '$p'"
done
CMD="wine '$EXEC' $ARGS"
echo $CMD
$CMD
Cependant, il y a un problème avec la citation des arguments de ligne de commande.
$ winewrap '/home/chris/.wine/drive_c/Program Files/Microsoft Research/Z3-1.3.6/bin/z3.exe' -smt /tmp/smtlib3cee8b.smt
Executing: wine '/home/chris/.wine/drive_c/Program Files/Microsoft Research/Z3-1.3.6/bin/z3.exe' '-smt' 'Z: mp\smtlib3cee8b.smt'
wine: cannot find ''/home/chris/.wine/drive_c/Program'
Notez que:
- Le chemin vers l'exécutable est en cours trancha au premier espace, même si elle est seule cité.
- Le caractère "\ t" dans le dernier chemin est en cours de transformation en un caractère de tabulation.
De toute évidence, les citations ne sont pas analysées comme je le souhaitais par le shell. Comment puis-je éviter ces erreurs?
EDIT: Le "\ t" a été étendu à travers deux niveaux d'indirection: d'abord, "$p"
(et/ou "$ARGS"
) est élargie en Z:\tmp\smtlib3cee8b.smt
; puis, \t
est en cours de développement dans le caractère de tabulation. Ceci est (apparemment) équivalent à
Y='y\ty'
Z="z${Y}z"
echo $Z
qui donne
zy\tyz
et pas
zy yz
MISE À JOUR: eval "$CMD"
le tour est joué. Le problème "\t
" semble être la faute de l'écho: "Si le premier opérande est -n, ou si l'un des opérandes contient une barre oblique inverse ('\'), les résultats sont définis par l'implémentation." (POSIX specification of echo
)
Les deux chemins sont des chemins Unix parfaitement valides * en entrée du script *. Les guillemets simples devraient éliminer le besoin d'espaces d'échappement. Et le "\ t" est automatiquement généré par la commande 'winepath' (il transforme"/tmp "en" Z: \ tmp "). –