سؤال

أود أن أحاول محاصرة الإشارة 1 ولكني أفشل

#!/bin/bash
# capture an interrupt # 0
trap 'echo "Exit 0 signal detected..."' 0
trap 'echo "Exit 1 signal detected..."' SIGHUP

# display something
echo "This is a checkpoint 1"
exit 1

echo "This is checkpoint 2"
# exit shell script with 0 signal
exit 0

Output--
kithokit@15:02:55 trunk (master) $ ./test.sh 
This is a checkpoint 1
Exit 0 signal detected...
kithokit@15:03:44 trunk (master) $ 

حتى لو كان المخرج 1، فإنه يقع دائمًا في الفخ 0، هل يعرف أحد كيفية حل هذه المشكلة؟

شكرًا

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

المحلول

exit 1 لا يرسل SIGHUP.يتم الخروج برمز الإرجاع (حالة الخروج AKA) 1.لإرسال استخدام SIGHUP kill:

#!/bin/bash
# capture an interrupt # 0
trap 'echo "Signal 0 detected..."' 0
trap 'echo "SIGHUP detected..."' SIGHUP

# display something
echo "This is a checkpoint 1"
kill -1 $$

echo "This is checkpoint 2"
# exit shell script with 0 signal
exit 0

$$ هو معرف العملية الحالية.لذا، kill -1 $$ يرسل الإشارة 1 (SIGHUP) إلى العملية الحالية.إخراج البرنامج النصي أعلاه هو:

This is a checkpoint 1
SIGHUP detected...
This is checkpoint 2
Signal 0 detected...

كيفية التحقق من رمز الإرجاع عند الخروج

إذا كان الهدف هو التحقق من رمز الإرجاع (المعروف أيضًا بحالة الخروج) بدلاً من التقاط إشارات خاصة، فكل ما يتعين علينا فعله هو التحقق من متغير الحالة $? عند الخروج:

#!/bin/bash
# capture an interrupt # 0
trap 'echo "EXIT detected with exit status $?"' EXIT

echo "This is checkpoint 1"
# exit shell script with 0 signal
exit "$1"
echo "This is checkpoint 2"

عند التشغيل في سطر الأوامر، ينتج عن ذلك:

$ status_catcher 5
This is checkpoint 1
EXIT detected with exit status 5
$ status_catcher 208
This is checkpoint 1
EXIT detected with exit status 208

لاحظ أن عبارة trap يمكن أن تستدعي دالة bash والتي يمكن أن تتضمن عبارات معقدة بشكل تعسفي لمعالجة رموز الإرجاع المختلفة بشكل مختلف.

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