للتحقق مما إذا كان برنامج Shell النصي قد نجح في اختصار Mac، التقط حالة الخروج الخاصة به فور تشغيله وأعد إرسال هذا الرقم كنص. في الاختصارات، أضف إجراء Run Shell Script، ثم استخدم إجراء If للتفرع بناءً على القيمة المُرجعة: تعني 0 النجاح وفقًا للعرف المتبع في shell؛ بينما تشير القيمة غير الصفرية إلى وجود خطأ أو نتيجة أخرى غير ناجحة. تجعل هذه الطريقة الحالة صريحة بدلاً من افتراض أن الاختصار يتيح متغير حالة منفصلاً.
إضافة إجراء shell والتقاط الحالة
افتح الاختصار في تطبيق الاختصارات على جهاز Mac الخاص بك. ابحث في مكتبة الإجراءات عن Run Shell Script وأضفه. تصف شركة Apple إجراءات البرامج النصية لـ shell بأنها جزء من منظومة اختصارات Mac، على الرغم من أن دليل مستخدم الاختصارات لا يوثق كل إعداد أو تفاصيل الإصدار لهذا الإجراء. إذا لم يكن موجودًا في مكتبة الإجراءات لديك، فلا تستبدله بإجراء Automator الذي يحمل اسمًا مشابهًا وتفترض أنه يعمل بالطريقة نفسها؛ تحقق من الإجراءات المتاحة على جهاز Mac الخاص بك. نظرة عامة على الاختصارات من Apple
في حقل البرنامج النصي، ضع أمر البرنامج النصي في سطر واحد، ثم التقط $? في السطر التالي مباشرةً. على سبيل المثال، إذا كان البرنامج النصي قابلاً للتنفيذ وموجودًا في المسار التوضيحي الموضح أدناه:
/Users/yourname/Scripts/refresh-files.sh >/dev/null
script_status=$?
printf '%s' "$script_status"
استبدل المسار النموذجي بالمسار الفعلي لبرنامجك النصي. ترسل عملية إعادة التوجيه الإخراج القياسي للبرنامج النصي إلى /dev/null، بحيث يحتوي الإخراج النصي للإجراء على رقم الحالة فقط. احذف >/dev/null إذا كنت تريد الحصول على مخرجات البرنامج النصي أيضًا، ولكن النص المُرجع قد يتضمن حينئذٍ كلاً من تلك المخرجات والحالة معًا. لا يتم منع الخطأ القياسي (Standard error) عبر إعادة التوجيه هذه.
يحمل $? حالة الخروج الخاصة بآخر أمر تم تنفيذه مؤخرًا. ولهذا السبب يجب أن يأتي التعيين مباشرة بعد استدعاء البرنامج النصي: فإذا تم تشغيل أمر آخر أولاً، فإن $? سيصف هذا الأمر بدلاً من ذلك. بعد ذلك، يصدر printf الرقم المحفوظ كنص، والذي يمكن لتطبيق الاختصارات استخدامه كمخرج للإجراء. دليل Apple لسير عمل البرامج النصية لـ shell على Mac
التفرع بناءً على الرقم المُرجع
أضف إجراء If بعد Run Shell Script. اضبط مدخلاته على مخرجات إجراء shell، واختر الشرط النصي هو (is)، وأدخل 0. ضع إجراءات النجاح تحت If وأي معالجة للفشل تحت Otherwise. يقوم إجراء If في اختصارات Mac بتوجيه المحتوى إلى أحد مسارين استنادًا إلى الشرط الذي تقوم بتهيئة إعداداته. دليل Apple لإجراءات If في الاختصارات على Mac
تعامل مع النتيجة كنص لأن إجراء shell يطبعها. يجب أن يُرجع التشغيل الناجح 0؛ بينما يجب أن تسلك النتيجة غير الصفرية المسار الآخر. يمكنك وضع إجراء Show Alert في مسار الفشل وتضمين قيمة الحالة في رسالته، أو تمرير القيمة إلى إجراء لاحق لتسجيلها في السجلات. غالبًا ما تستخدم برامج shell النصية قيمًا غير صفرية مختلفة للتمييز بين أسباب الفشل، لذا فإن الاحتفاظ بالرقم يمكن أن يساعد في التشخيص.
تجنب الأخطاء الشائعة عند التحقق من الحالة
لا تضع echo $? في إجراء لاحق وتتوقع أن يشير إلى عملية shell السابقة. يبدأ كل إجراء shell تنفيذ أمر خاص به؛ ويكون $? ذا معنى فقط داخل تشغيل shell نفسه وبعد الأمر الذي تريد معرفة حالته مباشرةً. وبالمثل، فإن طباعة الحالة قبل تشغيل البرنامج النصي لا يؤدي إلا إلى طباعة نتيجة ما تم تشغيله سابقًا فقط.
إذا كان البرنامج النصي ينفذ عدة أوامر، فقد تعتمد حالة الخروج النهائية على كيفية كتابة البرنامج النصي. على سبيل المثال، يمكن لأمر لاحق ناجح أن يخفي فشلًا سابقًا ما لم يقم البرنامج النصي بنقل هذا الفشل أو معالجته عن قصد. يمكن للاختصار فقط التفرع بناءً على الحالة التي يرجعها البرنامج النصي في النهاية. راجع معالجة الأخطاء الخاصة بالبرنامج النصي نفسه إذا كانت النتيجة لا تعكس الخطوة التي تهمك.
عند تشغيل اختصار من Terminal
إذا كان هدفك هو التحقق مما إذا كان الاختصار بأكمله قد تم تشغيله بنجاح من Terminal، فإن Apple توثق أمر shortcuts منفصلاً: shortcuts run "Shortcut Name". يخرج هذا الأمر بـ 0 عند نجاح تشغيل الاختصار وبـ 1 عند حدوث خطأ. هذه هي حالة استدعاء الاختصار، وليست متغيرًا مخصصًا يحتوي على رمز الخروج الخاص بإجراء shell الداخلي. لاستخدام حالة البرنامج النصي نفسه في مسار تفريع الاختصار، التقطها واطبعها داخل إجراء shell كما هو موضح أعلاه. دليل سطر الأوامر من Apple للاختصارات على Mac
النمط العملي بسيط: قم بتشغيل البرنامج النصي، واحفظ $? على الفور، واطبع تلك القيمة المحفوظة، وقارن النص الناتج بـ 0 في إجراء If. يمنح ذلك اختصار Mac مسار نجاح ومسار فشل واضحين مع إبقاء القرار مرتبطًا بنتيجة الخروج الفعلية للبرنامج النصي.
المصادر
استخدام إجراء برنامج نصي لـ shell في سير عمل Automator على Mac — دعم Apple
استخدام إجراءات If في الاختصارات على Mac — دعم Apple
تشغيل الاختصارات من سطر الأوامر — دعم Apple