الصفحة الرئيسية » howto » كيف يمكنك تشغيل أمر في الخلفية بدون إخراج إلا إذا كان هناك خطأ؟

    كيف يمكنك تشغيل أمر في الخلفية بدون إخراج إلا إذا كان هناك خطأ؟

    إذا كنت شخصاً مشغولاً ، فإن آخر ما تحتاج إليه هو أن تتضايق من كمية هائلة من الإخطارات "غير المفيدة" ، فكيف تهدئ الأمور؟ إن وظيفة SuperUser Q & A اليوم لديها بعض الإجابات الرائعة لمساعدة القارئ على إخماد كمية الإنتاج.

    تأتي جلسة الأسئلة والأجوبة اليوم مقدمة من SuperUser-a subdivision of Stack Exchange ، وهي مجموعة مجتمعية مدفوعة من مواقع Q & A.

    السؤال

    يريد قارئ SuperUser Xster معرفة كيفية تشغيل أمر في الخلفية بدون إخراج إلا إذا كان هناك خطأ:

    كيف تقوم بمنع إخراج أحد الأوامر ، ولكن يمكنك إظهاره إذا كان رمز الأمر يخالف الخطأ?

    كيف يمكنك الحصول على أمر لتشغيل في الخلفية دون إخراج إلا إذا كان هناك خطأ?

    الاجابة

    مساعدي SuperUser يملك Bob و Maximillian Laumeister الجواب لنا. أولاً ، بوب:

    لسوء الحظ ، فإن الافتراض ذلك ستدير يستخدم فقط لإخراج الخطأ ليس صحيحًا دائمًا. بدلا, ستدير غالبًا ما يتم استخدامه لأي من المخرجات التفاعلية والتشخيصات (أي المخرجات المخصصة للمستخدم للقراءة في رسالة تفاعلية).(1) مجلد مشترك و دد هي أمثلة معروفة.

    توفر بعض الأوامر علامة (أي. -هادئ أو -صامت) لمنع الإخراج غير الخطأ. قراءة صفحات الرجل لمعرفة ما إذا كان موجودا.

    آخر الاتفاقية التي تعقد في كثير من الاحيان هي كود الخروج, يقوم البرنامج بإرجاع رمز إنهاء عند الخروج. عادة(2), رمز الخروج من 0 يشير إلى النجاح ، ويشير أي رمز خروج آخر إلى وجود خطأ.

    مع سحق, يمكنك الحصول على رمز الخروج من الأمر الأخير من $? متغير. في سمك, استخدم ال وضع $ متغير. يمكنك الأنابيب ستدير إلى ملف مؤقت وطباعته فقط في حالة حدوث خطأ. فمثلا (سمك):

    يمكنك أيضًا استخدام بعض الاختصارات إذا لم تكن تسلسل الأوامر:

    أو:

    يمكنك أيضا الأنابيب المعياري إلى نفس المخزن المؤقت باستخدام 2> & 1> / tmp / outputbuffer.

    (ملحوظة: أنا لا أعرف في الواقع سمك, لذلك أقوم بتكييف المفهوم مع ما أجده في وثائقه. قد يكون بناء الجملة خاطئًا بعض الشيء. أيضا ، يمكنك استخدام mktemp لتوليد ملف مؤقت فريد. تشغيله وتسجيل اسم الملف في متغير.)

    إذا كنت بحاجة إلى تشغيل كل شيء في خلفية قذيفة تستخدمها أيضًا بشكل تفاعلي في نفس الوقت ، فمن الأفضل لك كتابة نص برمجي للتعامل مع إخفاء المخرجات وتشغيل ذلك البرنامج النصي في الخلفية باستخدام الأساليب القياسية (سمك). هيك ، يمكنك وضع شيء مثل الوظيفة التالية في ~ / .config / الأسماك / config.fish:

    الاتصال مع تشغيل صامت somecommand & (حيث الزائدة و يتسبب في تشغيلها في الخلفية)

    لاحظ أن هذا سوف يبتلع رمز الخروج الأصلي ، وسوف تفريغ كليهما المعياري و ستدير في حال الفشل. يمكنك تخصيصها حسب الضرورة.

    (1) ليس هناك ما يضمن عدم ظهور مخرجات الخطأ المعياري, بعض البرامج سوف تفريغ كل الانتاج هناك!

    (2) للأسف ، هذا لا يزال غير دائمًا. يتم التحكم في رمز الإنهاء بالكامل بواسطة البرنامج وسيشير البعض إلى بعض شروط النجاح مع خروج غير صفري. مرة أخرى ، تحقق من الدليل.

    يتبعه الجواب من ماكسيميليان Laumeister:

    تقوم Unix Utilities بإرسال رسائل عامة إلى المعياري, ورسائل الخطأ ل ستدير, لذلك إذا أردنا فقط رؤية رسائل الخطأ ، فستكون كافية لقمعها المعياري بحيث فقط ستدير يحصل الإخراج إلى وحدة التحكم.

    الطريق للقيام بذلك (في كليهما سحق و سمك) هو إلحاق > / ديف / لاغية إلى الأمر. هذه الأنابيب المعياري في العدم ، ولكن ستدير (مع رسائل الخطأ الخاصة بك) لا يزال يأتي إلى وحدة التحكم.

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

    الامر ارتداد 1> / dev / null يطبع شيئا ، لأن الطبيعي المعياري يتم إخماد الإخراج ، ولم تتم كتابة أي شيء إليه ستدير.

    الامر رجل لا يشربه> / dev / null يطبع رسالة خطأ ، لأن رجل يكتب رسالة الخطأ الخاصة به ستدير.


    هل لديك شيء تضيفه إلى الشرح؟ الصوت قبالة في التعليقات. هل ترغب في قراءة المزيد من الإجابات من مستخدمي Stack Exchange الآخرين المحترفين بالتكنولوجيا؟ تحقق من موضوع المناقشة الكامل هنا.