[bash] في shell ، ماذا يعني "2> & 1"؟



Answers

echo test > afile.txt

..redirects stdout إلى afile.txt . هذا هو نفس ما تفعله ..

echo test 1> afile.txt

لإعادة توجيه stderr ، عليك ..

echo test 2> afile.txt

>& is the syntax to redirect a stream to another file واصف - 0 is stdin. 1 هو stdout. 2 هو stderr.

يمكنك إعادة توجيه stdout إلى stderr عن طريق القيام ..

echo test 1>&2 # or echo test >&2

..أو العكس:

echo test 2>&1

باختصار .. 2> يعيد توجيه stderr إلى ملف (غير محدد) ، إلحاقي &1 يعيد توجيه stderr إلى stdout

Question

في shell Unix ، إذا أردت دمج stderr و stdout في تدفق stdout لمزيد من المعالجة ، يمكنني إلحاق ما يلي في نهاية الأمر الخاص بي:

2>&1

لذلك ، إذا كنت تريد استخدام "الرأس" على الناتج من g ++ ، يمكنني القيام بشيء كالتالي:

g++ lots_of_errors 2>&1 | head

حتى أتمكن من رؤية الأخطاء القليلة الأولى فقط.

دائمًا ما أجد صعوبة في تذكر ذلك ، ويجب أن أذهب دائمًا للبحث عنه ، وذلك لأنني لا أفهم بشكل كامل تركيب هذه الخدعة. هل يمكن لأي شخص أن يكسر هذا الأمر ويشرح شخصية الحرف ما "2> & 1" تعني؟




إعادة توجيه الإدخال

إعادة توجيه الإدخال يؤدي الملف الذي ينتج اسمه عن توسيع الكلمة ليتم فتحه للقراءة على واصف الملف n ، أو الإدخال القياسي (واصف الملف 0) إذا لم يتم تحديد n.

التنسيق العام لإعادة توجيه الإدخال هو:

      [n]<word

إعادة توجيه الإخراج

إعادة توجيه الإخراج يؤدي الملف الذي ينتج اسمه من توسيع الكلمة المراد فتحها لكتابة على واصف الملف n أو الإخراج القياسي (واصف الملف 1) إذا لم يتم تحديد n. إذا لم يكن الملف موجودا، يتم إنشاؤه؛ إذا كان موجودًا يتم اقتطاعها إلى حجم صفر.

التنسيق العام لإعادة توجيه الإخراج هو:

      [n]>word

نقل واصفات الملف

نقل واصفات الملفات عامل إعادة التوجيه

      [n]<&digit-

نقل رقم واصف الملف إلى واصف الملف n ، أو الإدخال القياسي (واصف الملف 0) إذا لم يتم تحديد n. يتم إغلاق الرقم بعد التكرار إلى n.

وبالمثل ، فإن مشغل إعادة التوجيه

      [n]>&digit-

نقل رقم واصف الملف إلى واصف الملف n ، أو الإخراج القياسي (واصف الملف 1) إذا لم يتم تحديد n.

المرجع:

man bash
اكتب /^REDIRECT لتحديد موقع قسم redirection ، اعرف المزيد ..

نسخة على الانترنت هنا:
http://www.gnu.org/software/bash/manual/bashref.html#Redirections

ملاحظة:

الكثير من الوقت ، كان man أداة قوية لتعلم لينكس




تشير الأرقام إلى واصفات الملفات (fd).

  • الصفر هو stdin
  • واحد هو stdout
  • اثنان هو stderr

2>&1 يعيد التوجيهات من 2 إلى 1.

يعمل هذا لأي عدد من واصفات الملفات إذا كان البرنامج يستخدمها.

يمكنك إلقاء نظرة على /usr/include/unistd.h إذا نسيتها:

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

لقد قلت أني قمت بكتابة أدوات C التي تستخدم واصفات ملفات غير قياسية لتسجيل مخصص بحيث لا تراها إلا إذا قمت بإعادة توجيهها إلى ملف أو شيء ما.




هذا هو مثل paasing الخطأ إلى stdout أو الطرفية. أي. كمد ليس أمر $ كمد 2> اسم الملف القط اسم الملف غير موجود

الخطأ الذي تم إرساله إلى الملف مثل 2> & 1 خطأ تم إرساله إلى المحطة




من وجهة نظر المبرمج ، هذا يعني بالضبط هذا:

dup2(1, 2);

انظر صفحة الرجل .

فهم أن 2>&1 هو نسخة تشرح أيضا لماذا ...

command >file 2>&1

... ليس هو نفسه ...

command 2>&1 >file

الأول سوف يرسل كل من التدفقات إلى file ، في حين أن الثانية سوف ترسل أخطاء إلى stdout ، والمخرجات العادية إلى file .




2 هو الخطأ القياسي في Console.

1 هو الإخراج القياسي وحدة التحكم.

هذا هو معيار يونيكس ، ويندوز أيضا يتبع POSIX. على سبيل المثال عند تشغيل

perl test.pl 2>&1

يتم إعادة توجيه الخطأ القياسي إلى الإخراج القياسي ، بحيث يمكنك رؤية كلا المخرجات معًا.

perl test.pl > debug.log 2>&1

بعد التنفيذ ، يمكنك مشاهدة كل المخرجات ، بما في ذلك الأخطاء ، في debug.log.

perl test.pl 1>out.log 2>err.log

ثم ينتقل الإخراج القياسي إلى out.log ، والخطأ القياسي إلى err.log.

أقترح عليك محاولة فهم هذه.




لقد وجدت هذه المشاركة الرائعة في إعادة التوجيه: كل شيء عن عمليات إعادة التوجيه

إعادة توجيه الإخراج القياسي والخطأ القياسي إلى ملف

أمر $ &> ملف

يستخدم هذا الكبل الواحد عامل التشغيل &> لإعادة توجيه كل من دفق الإخراج - stdout و stderr - من الأمر إلى الملف. هذا هو اختصار bash لسرعة إعادة توجيه كلتا التدفقات إلى نفس الوجهة.

إليك كيفية ظهور جدول واصفات الملفات بعد إعادة توجيه كل من الدفقات:

كما ترون كل من stdout و stderr الآن أشر إلى ملف. لذلك مكتوبة أي شيء مكتوب على stdout وستدرر إلى ملف.

هناك عدة طرق لإعادة توجيه كل من الدفقات إلى نفس الوجهة. يمكنك إعادة توجيه كل مجموعة بث واحد تلو الآخر:

$ command> file 2> & 1

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

عندما ترى bash عدة عمليات إعادة توجيه ، فإنها تعالجها من اليسار إلى اليمين. دعونا نخطو الخطوات ونرى كيف يحدث ذلك. قبل تشغيل أي جدول واصف ملف أوامر باش يبدو مثل هذا:

الآن bash يعالج ملف إعادة التوجيه الأول> الملف. لقد رأينا ذلك من قبل ونجعل نقطة stdout ملف:

الباش التالي يرى عملية إعادة التوجيه الثانية 2 & 1. لم نشهد إعادة التوجيه هذه من قبل. هذا واحد يكرر واصف الملف 2 ليكون نسخة من واصف الملف 1 ونحصل على:

تم إعادة توجيه كل من التدفقات إلى الملف.

لكن كن حذرا هنا! جاري الكتابة:

الأمر> ملف 2> & 1

ليست هي نفس الكتابة:

$ command 2> & 1> file

ترتيب عمليات إعادة التوجيه مهم في bash! يعيد هذا الأمر توجيه الإخراج القياسي إلى الملف فقط. ستظل stderr الطباعة إلى المحطة. لفهم سبب حدوث ذلك ، فلنبدأ في الخطوات من جديد. لذا ، قبل تشغيل الأمر ، يبدو جدول واصفات الملفات على النحو التالي:

الآن bash يعيد عمليات إعادة التوجيه إلى اليمين. يرى لأول مرة 2 & 1 حتى يكرر stderr إلى stdout. يصبح جدول واصف الملف:

الآن سيشاهد bash ملف إعادة التوجيه الثاني> ويعيد توجيه المعيار إلى الملف:

هل ترى ماذا يحدث هنا؟ يشير Stdout الآن إلى الملف ولكن stderr لا يزال يشير إلى المحطة! كل شيء مكتوب على stderr لا يزال يطبع على الشاشة! لذا كن حذرا للغاية مع ترتيب عمليات إعادة التوجيه!

لاحظ أيضًا أنه في bash ، اكتب هذا:

أمر $ &> ملف

هو بالضبط نفس:

$ command> & file






Links