أكواد الخروج في لينكس سر كتابة نصوص برمجية خالية من الأخطاء
تعتبر أكواد الخروج في لينكس أداةً قويةً تُساعد المطورين على تحسين جودة النصوص البرمجية وتجنب الأخطاء الشائعة. عند تنفيذ الأوامر في الطرفية، تُعيد هذه الأكواد قيمًا محددة تُشير إلى نجاح العملية أو فشلها، مما يُتيح للمبرمجين اكتشاف المشكلات بسرعة ومعالجتها بكفاءة.
فهم هذه الأكواد يُمكن أن يُقلل من وقت التصحيح ويزيد من موثوقية البرامج. سواء كنت مُبتدئًا أو مُحترفًا، فإن إتقان التعامل مع أكواد الخروج سيمنحك تحكمًا أكبر في سير البرمجة ويُحسّن أداء التطبيقات التي تُطورها.
ملخص
- يُرجع كل أمر في لينكس رمز خروج، حيث يشير 0 إلى النجاح، بينما تشير القيم غير الصفرية إلى الفشل.
- يمكنك استخدام المتغير $? للوصول إلى رمز الخروج والتحكم في سير البرنامج في النصوص البرمجية.
- احذر من رموز الخروج غير التقليدية التي تختلف من أمر إلى آخر، مثل diff و curl.
سيُظهر كل أمر في لينكس رسائل خطأ في حال فشله، ولكن من الصعب الاعتماد على هذه المعلومات. يجب أن تستخدم نصوصك البرمجية رموز الخروج لتكون قوية قدر الإمكان.
ما هي رموز الخروج؟
عند تشغيل أمر لينكس، قد يفشل. قد تحدث أخطاء لأسباب مختلفة، ولكنك سترى عادةً رسالة توضح السبب:
تظهر رسالة الخطأ التي تراها في STDERR، وهو مسار مختلف عن STDOUT، يسمح لك بعزل الأخطاء عن المخرجات المتوقعة. كمستخدم، يُفترض أن يكون وصف الخطأ مُفيدًا، ولكن يجب أن تكون البرامج النصية والعمليات الآلية الأخرى على دراية بالأخطاء بشكل أكثر موثوقية.
إلى جانب رسائل الخطأ الواضحة، يُرجع كل أمر رمز خروج. وهو رقم بين 0 و255، يُشير إلى فشل الأمر أو نجاحه. افتراضيًا، يكون رمز الخروج مخفيًا، ولكن واجهة الأوامر لديك تُتيح الوصول إلى هذه القيمة في المتغير الخاص $?
لاحظ أن القيمة 0 تشير إلى النجاح، والقيمة غير الصفرية تعني الفشل. يمكنك التحقق من هذه القيمة عبر سطر الأوامر، وفحصها في نص برمجي، واستخدامها للتحكم في سير برامجك.
كيف أستخدم رموز الخروج؟
في المثال أعلاه، أرجع الأمر ls رمز خروج 0 عند نجاحه، و1 عند عدم صحة وسيطته. قد يبدو هذا غير بديهي، ويتعارض مع لغات البرمجة التقليدية التي تُعامل القيمة 0 كقيمة خاطئة والقيمة 1 كقيمة صحيحة. مع ذلك، يسمح هذا الإعداد بقيمة نجاح واحدة عالمية ومجموعة واسعة من القيم لتمثيل أنواع مختلفة من الأخطاء.
بالإضافة إلى تكرار المتغير $? للتحقق يدويًا من حالة الخروج، يمكنك استخدامه مع عبارة if الشرطية. إذا أرجع الأمر حالة خروج 0، فسيتم تشغيل العبارة كتلة then المرتبطة. وإلا، إذا وُجدت، فسيتم تشغيل كتلة else. على سبيل المثال:
if command; then echo "command succeeded"; else echo "command failed"; fi
يمكنك استخدام هذا البناء في البرنامج النصي shell، حيث يكون من الأسهل قليلاً تنسيقه لتحسين قابلية القراءة:
if command
then echo "command succeeded"
else echo "command failed"
fi
وهذا يعادل:
command
if [ $? -eq 0 ]
then echo "command succeeded"
else echo "command failed"
fi
يستخدم الإصدار الأطول صيغة الأقواس المربعة لاختبار قيمة $؟، ولكن عادةً ما يكون اختبار القيمة مباشرةً أسهل، كما في الحالة الأولى. تذكر أن $؟ يُمثل دائمًا رمز الخروج من آخر أمر، لذا توخَّ الحذر. قد تُغريك قيمة $؟ للتصحيح، على سبيل المثال.
command
echo "command returned exit code:" $?
if [ $? -eq 0 ]
then echo "command succeeded"
else echo "command failed"
fi
ولكن عند التحقق من الشرط، ستكون قيمة $? مساوية لحالة خروج echo، والتي من شبه المؤكد أنها تساوي 0. لتجنب ذلك، اختبر الأمر مباشرةً في الشرط أو خزّن قيمة $? في متغير.
ما الذي يجب معرفته أيضًا عن حالة الخروج؟
رموز الخروج بسيطة جدًا، تتبع مبادئ يونكس، وهذا جزء من قوتها. ولكن هناك بعض الأخطاء والحالات الاستثنائية التي يجب أن تكون على دراية بها.
رموز الخروج من واجهة الأوامر (Shell)
ستستخدم واجهة الأوامر (Shell) رموز الخروج حتى لو لم يعمل الأمر الذي تكتبه بشكل صحيح. على سبيل المثال، يستخدم كل من zsh وbash الرمز 127 إذا لم يتم العثور على الأمر، والرمز 126 إذا لم يكن الأمر قابلاً للتنفيذ:
رموز خروج غير تقليدية
بعض الأوامر تُخالف قواعد حالة الخروج قليلاً؛ فهي في الواقع مجرد أعراف. على سبيل المثال، يستخدم الأمر diff القيمة 0 للدلالة على “عدم وجود اختلافات”، والقيمة 1 للدلالة على “اختلافات”، والقيمة 2 للدلالة على خطأ:
قد يؤدي هذا إلى خلط معنى الشرطيات؛ على سبيل المثال:
if diff file1 file2; then
echo these files are the same!
fi
أمر curl غير بديهي بعض الشيء. قد تتوقع أن يُبلغ curl عن خطأ HTTP، مثل الخطأ 404 لعنوان URL غير موجود، كرمز حالة غير صفري، ولكنه لا يفعل ذلك:
يمكنك استخدام الخيار -f (–fail) لجعل curl يتصرف بشكل مختلف، وإرجاع رمز خروج 22 في حالة الفشل:
مع ذلك، انتبه إلى أن هذا ليس مضمونًا تمامًا، فبعض أخطاء HTTP، بما في ذلك تلك التي تتطلب مصادقة، ستظل تُرجع رمز خروج 0.
استخدام حالة الخروج في سلسلة أوامر
يُمكنك بسهولة الوصول إلى أحد أفضل اختصارات حالة الخروج دون الحاجة إلى التفكير. إليك مثال بسيط:
ls program && ./program && echo success || echo epic fail
يتيح لك العاملان المنطقيان && و|| تشغيل أكثر من أمر بناءً على حالة خروج الأوامر الأخرى. وهما مشابهان للعاملَين المقابلَين في معظم لغات البرمجة، إلا أنهما يلتزمان باتفاقية رمز الخروج. يُشغّل العامل && الأمر على يمينه فقط إذا كانت حالة خروج الأمر على يساره صفرًا. أما العامل ||، فيُشغّل الأمر على يمينه فقط إذا فشل الأمر على يساره بحالة غير صفرية.
تحدث حالة شائعة جدًا عند إنشاء برنامج من الصفر، باستخدام هذه الوصفة:
./configure && make && make install
الأجزاء الثلاثة لهذا الأمر تؤدي ما يلي:
- ./configure يُشغّل نصًا برمجيًا محليًا يفحص بيئتك ويُنشئ ملف Makefile.
- make يُشغّل برنامج Make ويبني البرنامج باستخدام ملف Makefile.
- make install ينسخ الملف التنفيذي المُنشأ إلى مسار معروف مثل /usr/local/bin.
في حال فشل أي جزء من هذه العملية، سيتوقف فورًا دون محاولة تنفيذ الباقي.
أمرا true وfalse
يتضمن نظام لينكس أمرين غريبين: true وfalse. لا يُؤدي أي منهما أي شيء، باستثناء إرجاع رمز خروج مناسب: 0 و1 على التوالي.
قد لا تبدو هذه الأوامر مفيدة جدًا، لكنها مفيدة للاختبار ولبعض مهام برمجة نصوص الشل. يمكنك استخدام true في جملة while لإنشاء حلقة لا نهائية:
while true
do
echo “running until you ^c”
sleep 10
done
يمكنك أيضًا استخدامها مع العوامل المنطقية لتغيير سلوك الأوامر. على سبيل المثال، يمكنك إيقاف تشغيل سلسلة أوامر طويلة مؤقتًا:
false && (none || of-these && commands || will-run)
أو يمكنك إجبار سلسلة الأوامر على الاستمرار في التشغيل، حتى لو فشل أحد الأوامر:
cat file-that-may-not-exist | true && echo done
إرجاع رمز الخروج من نصوصك البرمجية
ربما سبق لك استخدام أمر الخروج للخروج من الطرفية. تقنيًا، يُخرج هذا الأمر من نافذة الأوامر، مما يعني أنه يمكنك استخدامه لإيقاف نص برمجي أيضًا. افتراضيًا، ستُخرج نصوصك البرمجية بنفس رمز الأمر الأخير:
ولكن يمكنك تغيير رمز الخروج عن طريق تمرير معلمة رقمية إلى أمر الخروج:
exit number
سيخرج البرنامج النصي الآن برمز الحالة الذي أدخلته، ويمكنك استخدامه لإعلام الآخرين بحالات الخطأ المختلفة من برنامجك.
بمجرد معرفتك بأوامر الخروج، ستجدها سهلة الاستخدام. يمكنك استخدامها حتى دون تفكير، ولكن عند استخدام البرامج النصية، تأكد من استخدام رموز الخروج بشكل صحيح.
تُعد أكواد الخروج في لينكس عنصرًا أساسيًا في تطوير برمجيات قوية وفعّالة. من خلال فهمها جيدًا، يُمكنك تحسين أداء التطبيقات وتقليل الأخطاء البرمجية بشكل كبير. ابدأ بتجربة هذه الأكواد في مشاريعك القادمة، ولاحظ الفرق في جودة وسرعة التنفيذ.
هل واجهت تحديًا مع أكواد الخروج من قبل؟ شاركنا تجربتك في التعليقات!