سؤال

بدون حجج trap يطبع الأوامر المعينة حاليًا لجميع الاعتراضات.ومع ذلك، فإن القشرة الفرعية لا ترث المصائد، لذا يفشل المثال المتعارف عليه لحفظ المصائد واستعادتها في bash:

save_traps=$(trap)
...
eval "$save_traps"

يتم تشغيل الملاءمة الموجودة على RHS للمهمة في غلاف فرعي، لذا فإن save_traps هو دائمًا السلسلة الفارغة.بخلاف كتابة مخرجات trap إلى ملف مؤقت، كيف يمكن للبرنامج النصي العثور على مجموعة الأوامر الحالية للملاءمة؟

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

المحلول

تناسبني.

إنشاء مصيدة عينة:

$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO

قم بتخزين المصيدة فيها save_traps:

$ save_traps=$(trap)

يزيل:

$ trap SIGIO
$ trap | wc -l
   0

يعيد:

$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO

تم اختباره مع:

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.

نصائح أخرى

على الرغم من أن صفحة Bash يبدو أنها تقول أنه تتم إعادة تعيين المصائد في القشرة الفرعية، ويتم تنفيذ استبدال الأوامر في قذيفة فرعية، إلا أن تشغيلها trap داخل $() يعمل على أي حال (تم اختباره في Bash 3.2 و4.2).وقد ورد ذكر ذلك أيضًا في POSIX traps=$(trap) يجب أن تعمل.

شكرا ل pgas في #bash في irc.freenode.net.

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