Решение ошибки "zsh: no matches found" при запуске задачи rake

Теперь в macOS по умолчанию используется zsh, что означает, что эта проблема возникает довольно часто.

В zsh:

% bin/rake plugin:spec[discourse-solved]
zsh: no matches found: plugin:spec[discourse-solved]
Почему это происходит?

Это связано с тем, что квадратные скобки интерпретируются как шаблон подстановки. В bash, если шаблон не находит совпадений, команда всё равно выполняется и работает. В отличие от этого, zsh выдаёт ошибку и не выполняет rake.

Для наглядности, в 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

Вы можете воспроизвести поведение zsh, включив опцию failglob в 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]

(спасибо @j.jaffeux и @pmusaraj за указание верного направления, а также @supermathie за примеры для bash :heart_eyes:)

Чтобы всё работало как ожидается, необходимо заключить весь аргумент для rake в кавычки

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

Ой. Звучит так, будто это вызовет массу проблем у людей, которые, скорее всего, даже не представляют, как найти решение. Надеюсь, они наткнутся на эту тему.

В основном всё в порядке — скрипты могут просто указывать bash, чтобы избежать любых проблем.

Действительно. Думаю, именно поэтому все мои скрипты bash начинаются с #!/usr/bin/env bash, даже если я не ожидаю, что они когда-нибудь запустятся на Mac :wink:

Или вы можете добавить алиас в конфигурацию ZSH. :slight_smile:
Это работает в Linux, поэтому, скорее всего, будет работать и в macOS.

alias rake='noglob rake'