Risoluzione dell'errore "zsh: no matches found" durante l'esecuzione di un task rake

macOS ora include zsh come shell predefinita, il che significa che questo problema si presenta abbastanza regolarmente.

In zsh:

% bin/rake plugin:spec[discourse-solved]
zsh: no matches found: plugin:spec[discourse-solved]
Perché succede questo?

Questo accade perché le parentesi quadre vengono interpretate come un pattern glob. In bash, il glob non riesce a trovare una corrispondenza, ma il comando viene comunque eseguito e funziona. Al contrario, zsh genera un errore e non esegue rake.

Per illustrare, in 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

Puoi replicare il comportamento di zsh abilitando l’opzione failglob in 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]

(grazie a @j.jaffeux e @pmusaraj per avermi indicato la direzione giusta, e a @supermathie per gli esempi bash :heart_eyes:)

Per farlo funzionare come previsto, è necessario racchiudere l’intero argomento di rake tra virgolette

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

Ouch. Sembra che questo possa causare molti problemi a persone che probabilmente non hanno idea di come risolvere il problema. Speriamo che trovino questo argomento.

Va bene per la maggior parte dei casi: gli script possono semplicemente specificare bash per evitare qualsiasi problema.

È vero. Immagino sia per questo che tutti i miei script bash iniziano con #!/usr/bin/env bash, anche se non mi aspetto che vengano mai eseguiti su un Mac :wink:

Oppure, puoi aggiungere un alias alla tua configurazione ZSH. :slight_smile:
Funziona su Linux, quindi probabilmente funzionerà anche su macOS.

alias rake='noglob rake'