macOS 现在默认使用 zsh 作为 shell,这意味着这个问题相当频繁地出现。
在 zsh 中:
% bin/rake plugin:spec[discourse-solved]
zsh: no matches found: plugin:spec[discourse-solved]
为什么会发生这种情况?
这是因为方括号被解释为 glob 模式。在 bash 中,如果 glob 模式无法匹配,命令仍会执行并正常工作。相比之下,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
你可以通过在 bash 中启用 failglob 选项来复现 zsh 的行为:
○ → 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 示例
)
若要按预期工作,你需要将整个 rake 参数用引号包裹:
% bin/rake "plugin:spec[discourse-solved]"