Behebung des Fehlers "zsh: no matches found" beim Ausführen des rake-Tasks

macOS wird nun standardmäßig mit zsh als Shell ausgeliefert, was bedeutet, dass dieses Problem recht häufig auftritt.

In zsh:

% bin/rake plugin:spec[discourse-solved]
zsh: keine Übereinstimmungen gefunden: plugin:spec[discourse-solved]
Warum passiert das?

Dies liegt daran, dass die eckigen Klammern als Glob-Muster interpretiert werden. In Bash schlägt das Glob-Muster fehl, aber der Befehl wird dennoch ausgeführt und funktioniert. Im Gegensatz dazu wirft zsh einen Fehler aus und führt rake nicht aus.

Zur Veranschaulichung, in 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

Sie können das zsh-Verhalten in Bash nachahmen, indem Sie die Option failglob aktivieren:

○ → echo bin/rake plugin:spec[discourse-solved]
bin/rake plugin:spec[discourse-solved]

○ → shopt -s failglob

○ → echo bin/rake plugin:spec[discourse-solved]
bash: keine Übereinstimmung: plugin:spec[discourse-solved]

(danke an @j.jaffeux und @pmusaraj für die Hinweise in die richtige Richtung und an @supermathie für die Bash-Beispiele :heart_eyes:)

Damit es wie erwartet funktioniert, müssen Sie das gesamte Rake-Argument in Anführungszeichen setzen:

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

Oje. Das klingt danach, als würde das für Leute, die wahrscheinlich keine Ahnung haben, wie sie das Problem lösen sollen, eine ganze Menge Ärger verursachen. Hoffentlich finden sie diesen Beitrag.

Es ist größtenteils in Ordnung – Skripte können einfach Bash angeben, um Probleme zu vermeiden.

Das ist durchaus richtig. Ich vermute, das ist der Grund, warum alle meine bash-Skripte mit #!/usr/bin/env bash beginnen, obwohl ich nicht erwarte, dass sie jemals auf einem Mac ausgeführt werden :wink:

Oder Sie können Ihrem ZSH-Konfigurationsprofil einen Alias hinzufügen. :slight_smile:
Das funktioniert unter Linux, also wird es wahrscheinlich auch unter macOS funktionieren.

alias rake='noglob rake'