سؤال

ولدي سيناريو بسيط والذي يستخدم لبدء برنامج آخر. هذا برنامج آخر قد تسفر أحيانا SIGSEGV، مما يعطل الانتاج بلدي. لذا واضاف لقد اثنين من الخطوط التي من المفترض أن توجيه stderr مؤقتا إلى /dev/null بحيث يتم تجاهل SIGSEGV. ما يلي هو مشروع قانون بلدي:

exec 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>1

والمشكلة هي أن السطر الأخير لا تفعل ما أريد. السطر الأول يعمل من الواضح، والموجهات وstderr. ومن المفترض أن السطر الأخير لإعادة stderr يعود إلى ما كان عليه قبل (التي أشرت المفترض فقط هو نفس stdout).

وسيتم أبريسياتيد أي مساعدة!

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

المحلول

وثمة خيار آخر هو:

exec 3> /dev/stderr 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3

وأو حتى

exec 3>&2 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3

وبهذه الطريقة النصي يحافظ على الفصل بين المعياري وستدير للبرنامج النصي (أي في المعياري النصوص وستدير يمكن إعادة توجيه بشكل منفصل.

نصائح أخرى

لماذا لا مجرد توجيهها على المدى progname فقط؟

   progname > ./tmp/run.txt 2>/dev/null && run_status='OK'

وأو ربما

{
   progname > ./tmp/run.txt && run_status='OK'
} 2>/dev/null
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top