حل مشكلة "zsh: no matches found" عند تشغيل مهمة rake

تُرفق macOS الآن zsh كغلاف افتراضي، مما يعني أن هذه المشكلة تظهر بشكل متكرر.

في 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

يمكنك تكرار سلوك 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'