Citer les arguments de ligne de commande dans les scripts Shell
Lors de l’écriture de scripts Shell, en particulier pour des applications comme WINE qui interagissent avec les structures de fichiers Windows, il est crucial de citer correctement les arguments de ligne de commande. Un problème courant rencontré est la mauvaise gestion de ces arguments, ce qui peut entraîner des erreurs lorsque les chemins contiennent des espaces ou des caractères spéciaux. Dans cet article, nous discuterons de la manière de gérer et de résoudre efficacement ces problèmes de citation.
Le Problème
Considérons un scénario où vous avez un script Shell conçu pour exécuter une application WINE. Le script prend une liste d’arguments, convertit les chemins Unix en chemins Windows, puis invoque l’exécutable. Malheureusement, en raison d’une citation inappropriée dans les arguments de ligne de commande, une erreur se produit :
wine: impossible de trouver ''/home/chris/.wine/drive_c/Program'
Problèmes Clés Observés :
- Troncature de chemin : Le chemin vers l’exécutable est tronqué au premier espace, malgré le fait qu’il soit encadré de guillemets simples.
- Interprétation du Backslash : Un backslash suivi de ’t’ (
\t
) est interprété comme un caractère de tabulation plutôt qu’une chaîne littérale.
Comprendre le Problème de Citation
Ces problèmes proviennent de la manière dont le shell interprète les guillemets et les caractères spéciaux dans les substitutions de commande. Voici pourquoi ces problèmes se produisent :
- Lorsque les arguments sont transmis au shell, des espaces peuvent provoquer la rupture de la commande à moins qu’ils ne soient correctement cités.
- Les variables étendues en chaînes peuvent contenir des caractères échappés, qui doivent également être traités avec soin pour éviter des transformations non souhaitées.
Par exemple, si vous écho une variable qui contient des séquences d’échappement, elles peuvent être mal interprétées. Cela peut ressembler à ce qui suit :
Y='y\ty'
Z="z${Y}z"
echo $Z # Affiche : zy yz (et non zy yz)
Un tel comportement peut entraîner des défis de débogage et des résultats inattendus dans les scripts.
La Solution
Pour résoudre ces problèmes de citation, en particulier dans notre exemple de script Shell, nous pouvons utiliser la commande intégrée eval
. Cette commande réévalue les arguments qui lui sont fournis, permettant un parsing correct de la chaîne de commande avant l’exécution.
Correction étape par étape
-
Modifier la dernière ligne du script : Au lieu d’exécuter la commande directement, enveloppez-la dans
eval
:eval "$CMD"
-
Avantages de l’utilisation de
eval
:- Espaces dans les chemins : Cela permet de traiter correctement les chemins avec des espaces (comme
Program Files
) car cela évalue l’ensemble de la chaîne entre guillemets comme une seule commande. - Gestion des échappements : L’utilisation de
eval
peut aider à s’assurer que les séquences d’échappement sont traitées de manière appropriée, réduisant le risque de traductions non intentionnelles de caractères comme le\t
se convertissant en tabulation.
- Espaces dans les chemins : Cela permet de traiter correctement les chemins avec des espaces (comme
-
Test : Après avoir effectué cet ajustement, testez votre script avec divers entrées, en particulier celles contenant des espaces et des caractères d’échappement, pour vous assurer que tout fonctionne comme prévu.
Exemple final de script
Voici à quoi pourrait ressembler votre script Shell révisé :
#! /bin/sh
if [ "${1+set}" != "set" ]
then
echo "Usage; winewrap EXEC [ARGS...]"
exit 1
fi
EXEC="$1"
shift
ARGS=""
for p in "$@"; do
if [ -e "$p" ]; then
p=$(winepath -w "$p")
fi
ARGS="$ARGS '$p'"
done
CMD="wine '$EXEC' $ARGS"
echo $CMD
eval "$CMD"
Conclusion
Citer les arguments de ligne de commande dans les scripts Shell est une compétence critique, en particulier lors de la gestion de chemins d’application complexes dans des environnements comme WINE. En utilisant eval
, vous pouvez contourner les erreurs courantes liées à la mauvaise interprétation des espaces et des caractères d’échappement, garantissant que vos scripts fonctionnent de manière fluide et efficace.
N’hésitez pas à expérimenter avec vos scripts et à partager vos réflexions ou questions supplémentaires dans les commentaires ci-dessous !