rake 작업을 실행할 때 발생하는 "zsh: no matches found" 오류 해결

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

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에게 올바른 방향을 알려주셔서 감사드리며, bash 예제는 @supermathie에게 감사드립니다 :heart_eyes:)

기대하는 대로 동작하려면 rake 인수를 전체적으로 따옴표로 감싸야 합니다.

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

아프네요. 문제를 어떻게 해결해야 할지 감도 잡지 못할 가능성이 높은 사람들에게 큰 불편을 초래할 것 같습니다. 다행히 이 주제를 찾아내길 바랍니다.

대체로 괜찮습니다 - 스크립트에서 bash를 명시하면 문제를 피할 수 있습니다.

그렇긴 하죠. 제 bash 스크립트들은 Mac에서 실행될 거라고 기대하지 않지만, #!/usr/bin/env bash로 시작하는 이유를 이제 알 것 같습니다 :wink:

또는 ZSH 설정에 별명을 추가할 수도 있습니다. :slight_smile:
이 방법은 Linux에서 작동하므로 macOS에서도 작동할 가능성이 높습니다.

alias rake='noglob rake'