Sur un Mac, placez un motif générique entre guillemets simples pour empêcher le shell zsh par défaut de le développer avant l’exécution de la commande. Par exemple, printf '%s\n' '*.csv' transmet le texte littéral *.csv comme un seul argument. Les guillemets sont supprimés par le shell ; l’astérisque parvient au programme. Si le programme utilise lui-même des motifs, il peut interpréter cet astérisque par la suite.
Pourquoi le caractère générique change avant l’exécution de la commande
Lorsque vous saisissez une commande dans Terminal, le shell traite ses arguments avant de démarrer le programme. Dans zsh, un * sans guillemets peut déclencher la génération de noms de fichiers : le shell remplace le motif par les noms de fichiers correspondants. S’il n’y a aucune correspondance, zsh signale normalement une erreur, bien que des options du shell puissent modifier ce comportement. Le manuel de zsh décrit la génération de noms de fichiers et son comportement en l'absence de correspondance.
Apple définit zsh comme le shell par défaut dans Terminal, bien qu’un Mac puisse être configuré pour utiliser un autre shell. Le guide de Terminal d’Apple explique le shell par défaut et comment en changer. La méthode des guillemets simples ci-dessous convient pour zsh et Bash ; si vous utilisez un autre shell, consultez son manuel car les règles de guillemets peuvent varier.
Utiliser des guillemets simples pour un caractère générique littéral
Saisissez le motif générique entre des guillemets simples, en conservant tous les autres caractères qui en font partie. Par exemple :
printf '%s\n' '*.csv'
La sortie est le texte littéral *.csv, que le répertoire actuel contienne ou non des fichiers CSV. printf reçoit le motif comme argument et l’affiche ; le shell ne développe pas l’astérisque. Les guillemets relèvent de la syntaxe du shell, ils ne sont donc pas inclus dans l’argument. Le guide d’Apple sur les scripts shell explique que les guillemets simples désactivent le développement du shell au sein du texte entre guillemets. Apple : Flow Control, Expansion, and Parsing.
Cela est particulièrement important lorsqu’un programme est censé gérer lui-même un motif. Sur macOS, par exemple, find peut faire correspondre des noms de fichiers à l’aide du motif fourni à -name :
find . -type f -name '*.log'
Ici, le shell transmet *.log littéralement à find ; ensuite, find applique sa propre correspondance de noms de fichiers aux fichiers situés sous le répertoire actuel. L'utilisation de guillemets empêche le shell de remplacer le motif par les noms présents dans le répertoire actuel avant que find ne puisse l’utiliser. La signification du motif dépend du programme récepteur : l’utilisation de guillemets dans le shell contrôle le développement par le shell, et non la façon dont le programme interprète son argument.
Quand utiliser plutôt une barre oblique inverse
Pour un motif court, une barre oblique inverse (antislash) peut protéger un caractère générique individuel en dehors des guillemets :
printf '%s\n' \*.csv
Cela transmet également l’astérisque de manière littérale. Les guillemets simples sont souvent plus faciles à lire lorsqu’un motif contient plusieurs caractères spéciaux, des espaces ou des crochets. Par exemple, 'chapter [0-9]*.txt' empêche les crochets et le caractère générique d’être interprétés par le shell. Apple documente l’échappement par barre oblique inverse et le comportement des guillemets simples dans son guide sur les scripts shell.
Erreurs courantes d'utilisation des guillemets
Les guillemets doubles ne protègent pas tous les caractères du shell de manière fiable. Ils empêchent le développement des caractères génériques dans zsh, mais autorisent toujours certains développements, notamment les variables telles que $name et les substitutions de commande comme $(command). Pour un motif qui doit arriver exactement tel qu’il a été saisi, utilisez des guillemets simples, sauf si l’argument a besoin de l’un de ces développements.
Un guillemet simple ne peut pas apparaître à l’intérieur d’une chaîne entre guillemets simples en tant que caractère ordinaire. Si le motif contient lui-même une apostrophe, fermez la partie entre guillemets, ajoutez l’apostrophe en utilisant une autre méthode d’échappement, puis rouvrez les guillemets simples ; Apple présente cette technique d’échappement du shell dans son guide. Pour les motifs inhabituels, examinez attentivement la commande exacte avant de l’exécuter.
Distinguez également le développement du shell du comportement du programme récepteur. Mettre *.log entre guillemets ne force pas un programme à traiter l’astérisque comme un caractère ordinaire ; cela garantit seulement que le shell le transmet tel quel. Un utilitaire comme find -name peut l’interpréter comme un motif, tandis qu’une autre commande peut le traiter littéralement. Consultez la propre documentation de cette commande lorsque la distinction est importante.
Une vérification rapide avant d’appuyer sur Entrée
Demandez-vous ce que le programme doit recevoir. S’il a besoin d’un motif générique, placez le motif entre guillemets simples et confirmez que les options de la commande sont configurées pour interpréter les motifs comme prévu. Si le programme doit recevoir un nom de fichier réel, laissez le développement du shell activé le cas échéant, ou fournissez le nom de fichier directement. L’essentiel est de mettre les guillemets au niveau du shell lorsque vous souhaitez que le programme reçoive lui-même les caractères génériques.
Sources
14 Expansion (zsh) — zsh.sourceforge.io
Modifier le shell par défaut dans Terminal sur Mac — Apple Support
Flow Control, Expansion, and Parsing — Apple Developer