Résolution de l'erreur "zsh: no matches found" lors de l'exécution d'une tâche rake

macOS est désormais livré avec zsh comme shell par défaut, ce qui signifie que ce problème se produit assez régulièrement.

Dans zsh :

% bin/rake plugin:spec[discourse-solved]
zsh: no matches found: plugin:spec[discourse-solved]
Pourquoi cela se produit-il ?

C’est parce que les crochets sont interprétés comme un motif de glob. Dans bash, le glob échoue à correspondre à un motif, mais la commande est tout de même exécutée et fonctionne. En revanche, zsh lève une erreur et n’exécute pas rake.

Pour illustrer, dans bash :

○ → echo bin/rake plugin:spec[discourse-solved]
bin/rake plugin:spec[discourse-solved]

○ → touch plugin:specd

○ → echo bin/rake plugin:spec[discourse-solved]
bin/rake plugin:specd

Vous pouvez reproduire le comportement de zsh en activant l’option failglob dans bash :

○ → echo bin/rake plugin:spec[discourse-solved]
bin/rake plugin:spec[discourse-solved]

○ → shopt -s failglob

○ → echo bin/rake plugin:spec[discourse-solved]
bash: no match: plugin:spec[discourse-solved]

(merci à @j.jaffeux et @pmusaraj pour m’avoir orienté dans la bonne direction, et à @supermathie pour les exemples bash :heart_eyes:)

Pour que cela fonctionne comme prévu, vous devez entourer tout l’argument de rake de guillemets

% bin/rake "plugin:spec[discourse-solved]"

Ouch. Cela risque de causer pas mal de problèmes à des gens qui ne savent probablement pas comment identifier le problème. Espérons qu’ils tomberont sur ce sujet.

C’est généralement sans problème : les scripts peuvent simplement spécifier bash pour éviter tout tracas.

Tout à fait. Je suppose que c’est pourquoi tous mes scripts bash commencent par #!/usr/bin/env bash, même si je ne m’attends pas à ce qu’ils s’exécutent un jour sur un Mac :wink:

Sinon, vous pouvez ajouter un alias à votre configuration ZSH. :slight_smile:
Cela fonctionne sur Linux, donc cela devrait probablement fonctionner sur macOS également.

alias rake='noglob rake'