Resolving o erro "zsh: nenhuma correspondência encontrada" ao executar tarefa rake

O macOS agora vem com zsh como shell padrão, o que significa que esse problema surge com bastante regularidade.

No zsh:

% bin/rake plugin:spec[discourse-solved]
zsh: no matches found: plugin:spec[discourse-solved]
Por que isso acontece?

Isso ocorre porque os colchetes são interpretados como um padrão glob. No bash, o padrão glob falha ao encontrar uma correspondência, mas o comando é executado de qualquer maneira e funciona. Em contraste, o zsh gera um erro e não executa o rake.

Para ilustrar, no 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

Você pode replicar o comportamento do zsh ativando a opção failglob no 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]

(obrigado a @j.jaffeux e @pmusaraj por me apontarem na direção certa, e a @supermathie pelos exemplos em bash :heart_eyes:)

Para fazer com que funcione conforme o esperado, você precisa envolver todo o argumento do rake entre aspas

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

Ai. Isso parece que vai causar bastante dor de cabeça para pessoas que provavelmente não terão ideia de como descobrir o problema. Esperemos que elas encontrem este tópico.

É quase tudo tranquilo — os scripts podem apenas especificar o bash para evitar qualquer dor de cabeça.

Muito verdadeiro. Acho que é por isso que todos os meus scripts bash começam com #!/usr/bin/env bash, mesmo que eu não espere que eles rodem em um Mac :wink:

Ou, você pode adicionar um alias à sua configuração do ZSH. :slight_smile:
Isso funciona no Linux, então provavelmente funcionará no macOS também.

alias rake='noglob rake'