linux - شرح - bash معنى




إحباط برنامج نصي shell إذا أرجع أي أمر قيمة غير صفرية؟ (6)

أضف هذا إلى بداية النص البرمجي:

set -e

سيؤدي ذلك إلى إنهاء shell فورًا في حالة إنهاء أمر بسيط بقيمة خروج غير صفرية. الأمر البسيط هو أي أمر ليس جزءًا من if أو while أو حتى test أو جزء من && أو || قائمة.

راجع صفحة bash (1) man على الأمر الداخلي "set" لمزيد من التفاصيل.

أنا شخصيا بدء تقريبا جميع النصوص قذيفة مع "مجموعة -E". من المزعج حقًا أن يستمر البرنامج النصي بعناد عندما يفشل شيء ما في المنتصف ويكسر افتراضات لبقية البرنامج النصي.

لدي برنامج Bash shell النصي الذي يستدعي عددًا من الأوامر. أرغب في إنهاء برنامج نصي shell تلقائيًا بقيمة إرجاع 1 إذا كان أي من الأوامر يعرض قيمة غير صفرية.

هل هذا ممكن دون التحقق صراحة من نتيجة كل أمر؟

على سبيل المثال

dosomething1
if [[ $? -ne 0 ]]; then
    exit 1
fi

dosomething2
if [[ $? -ne 0 ]]; then
    exit 1
fi

إذا كان لديك تنظيف تحتاج إلى القيام به عند الخروج ، يمكنك أيضاً استخدام "trap" مع ERR الزائفة للإشارة. يعمل هذا بنفس طريقة تعويض INT أو أي إشارة أخرى؛ bash يطرح ERR في حالة خروج أي أمر بقيمة غير صفرية:

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

أو ، خاصةً إذا كنت تستخدم "set -e" ، يمكنك أن تحبس EXIT ؛ بعد ذلك يتم تنفيذ المصيدة عندما يخرج النص البرمجي لأي سبب ، بما في ذلك النهاية العادية ، والمقاطعات ، والخروج الناتج عن الخيار -e ، إلخ.


تشغيله مع -e أو set -e في الجزء العلوي.

انظر أيضا في set -u .


تعبير مثل

dosomething1 && dosomething2 && dosomething3

سيتوقف عن المعالجة عند إرجاع أحد الأمرين بقيمة غير صفرية. على سبيل المثال ، لن يقوم الأمر التالي بطباعة "تم":

cat nosuchfile && echo "done"
echo $?
1

مجرد إلقاء كلمة أخرى كمرجع لأنه كان هناك سؤال إضافي لمدخلات مارك إدجارس وهنا مثال إضافي ولمسات حول الموضوع بشكل عام:

[[ `cmd` ]] && echo success_else_silence

وهو نفس cmd || exit errcode cmd || exit errcode كما أظهر أحدهم.

على سبيل المثال. أرغب في التأكد من إلغاء تثبيت القسم في حالة تركيبه:

[[ `mount | grep /dev/sda1` ]] && umount /dev/sda1 

$? نادرا ما يكون هناك حاجة متغير. command; if [ $? -eq 0 ]; then X; fi المصطلح الزائف command; if [ $? -eq 0 ]; then X; fi command; if [ $? -eq 0 ]; then X; fi يجب دائما أن تكون مكتوبة كما if command; then X; fi if command; then X; fi if command; then X; fi .

الحالات التي $? مطلوب عندما يحتاج إلى فحص مقابل قيم متعددة:

command
case $? in
  (0) X;;
  (1) Y;;
  (2) Z;;
esac

أو عند $? يجب إعادة استخدامها أو التلاعب بها:

if command; then
  echo "command successful" >&2
else
  ret=$?
  echo "command failed with exit code $ret" >&2
  exit $ret
fi




shell