Solucionar el error "zsh: no matches found" al ejecutar la tarea rake

macOS ahora incluye zsh como shell predeterminado, lo que significa que este problema surge con bastante frecuencia.

En zsh:

% bin/rake plugin:spec[discourse-solved]
zsh: no matches found: plugin:spec[discourse-solved]
¿Por qué ocurre esto?

Esto se debe a que los corchetes se interpretan como un patrón glob. En bash, el patrón glob falla al no encontrar coincidencias, pero el comando se ejecuta de todos modos y funciona. En cambio, zsh genera un error y no ejecuta rake.

Para ilustrarlo, en 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

Puedes replicar el comportamiento de zsh activando la opción failglob en 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]

(gracias a @j.jaffeux y @pmusaraj por indicarme la dirección correcta, y a @supermathie por los ejemplos en bash :heart_eyes:)

Para que funcione como se espera, debes envolver todo el argumento de rake entre comillas:

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

Ay. Eso suena a que va a causar muchos problemas a personas que probablemente no tengan idea de cómo resolver el problema. Ojalá encuentren este tema.

Es mayormente aceptable: los scripts solo pueden especificar bash para evitar cualquier problema.

Es cierto. Supongo que por eso todos mis scripts de bash comienzan con #!/usr/bin/env bash, aunque no espero que se ejecuten nunca en un Mac :wink:

O bien, puedes agregar un alias a tu configuración de ZSH. :slight_smile:
Esto funciona en Linux, así que probablemente también funcione en macOS.

alias rake='noglob rake'