نشر رمز الخروج للمتصل في حالة حدوث خطأ في الصدفة من البرنامج النصي الذي يحتوي على مصيدة خروج

StackOverflow https://stackoverflow.com//questions/25064292

  •  23-12-2019
  •  | 
  •  

سؤال

هل من الممكن نشر رمز الخروج للمتصل في حالة وجود خطأ في بناء الجملة في برنامج Bash النصي باستخدام مصيدة EXIT؟على سبيل المثال، إذا كان لدي:

#! /bin/bash

set -eu

trap "echo dying!!" EXIT

echo yeah
echo $UNBOUND_VARIABLE
echo boo

بعد ذلك، يؤدي تشغيله إلى الحصول على رمز الخروج 0 حتى لو لم ينته البرنامج النصي بنجاح:

$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!

$ echo $?
0

ولكن إذا قمت بالتعليق على مصيدة الخروج، فسيرجع البرنامج النصي 1.وبدلاً من ذلك، إذا استبدلت السطر الذي يحتوي على المتغير غير المنضم بأمر يُرجع قيمة غير صفرية (على سبيل المثال: /bin/false)، يتم نشر قيمة الخروج هذه كما أرغب في ذلك.

هل كانت مفيدة؟

المحلول 2

يرتبط هذا السلوك بإصدارات Bash المختلفة.يعمل النص الأصلي كما هو متوقع على Bash 4.2 ولكن ليس على 3.2.إن وجود التعليمات البرمجية المعرضة للخطأ في ملف نصي منفصل وتشغيله في غلاف فرعي يعمل على حل المشكلات الموجودة في إصدارات Bash السابقة:

#!/bin/bash

$BASH sub.sh
RETVAL=$?

if [[ "$RETVAL" != "0" ]]; then
  echo "Dying!! Exit code: $RETVAL"
fi

sub.sh:

set -eu

echo yeah
echo $UNBOUND_VARIABLE
echo boo

نصائح أخرى

تخرج الصدفة بنتيجة آخر أمر تم تنفيذه.في حالة الفخ الخاص بك، هذا echo, والتي عادة ما تعود بنجاح.

لنشر القيمة الخاصة بك، ببساطة exit معها.

#!/bin/bash

set -eu

die() {
  echo "Dying!!"
  exit "$1"
}

trap 'die $?' EXIT

echo yeah
echo $unbound
echo boo

لاحظ ذلك أيضًا set -e يعتبر ضارًا - فهو يجعلك تعتقد أن البرنامج النصي سينتهي في حالة فشل الأمر، وهو ما لن يحدث دائمًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top