linux - كيفية إعادة توجيه الإخراج إلى ملف و stdout




bash file-io io (9)

يمكنك استخدام solution أساسي ، ولكن إذا كنت لا ترغب في الكتابة فوق ملف الإخراج ، فيجب عليك كتابة نقطة الإنطلاق مع خيار -a كما يلي:

ls -lR / | tee -a output.file

في bash ، قد يعرض foo المتصل أي إخراج من هذا الأمر على stdout.

استدعاء foo > output سيعيد توجيه أي مخرجات من هذا الأمر إلى الملف المحدد (في هذه الحالة "الإخراج").

هل هناك طريقة لإعادة توجيه الإخراج إلى ملف وعرضه على stdout؟


يتم تسمية الأمر الذي تريده بـ tee :

foo | tee output.file

على سبيل المثال ، إذا كنت تهتم فقط بـ stdout:

ls -a | tee output.file

إذا كنت ترغب في تضمين stderr ، فقم بما يلي:

program [arguments...] 2>&1 | tee outfile

2>&1 يعيد توجيه القناة 2 (خطأ stderr / معياري) إلى القناة 1 (الإخراج القياسي / المعياري) ، بحيث تتم كتابة كل منهما كـ stdout. يتم توجيهه أيضًا إلى ملف الإخراج المعطى كما في أمر tee .

علاوة على ذلك ، إذا كنت تريد إلحاق ملف السجل ، استخدم tee -a النحو التالي:

program [arguments...] 2>&1 | tee -a outfile

هناك طريقة أخرى تعمل لي هي

<command> |& tee  <outputFile>

كما هو موضح في دليل gnu bash

مثال:

ls |& tee files.txt

إذا تم استخدام '| &' ، يتم توصيل الخطأ القياسي الخاص بالأمر ، بالإضافة إلى مخرجاتها القياسية ، بالمدخل القياسي للقناة 2 عبر الأنبوب ؛ اختزال لـ 2> & 1 |. يتم تنفيذ هذا إعادة التوجيه الضمني للخطأ القياسي إلى الإخراج القياسي بعد أي عمليات إعادة توجيه محددة بواسطة الأمر.

لمزيد من المعلومات ، راجع redirection


يجب استخدام tail -f output .


نقطة الإنطلاق مثالية لهذا ، ولكن هذا أيضًا سيؤدي المهمة

ls -lr / > output | cat output

شيء لإضافة ...

يدعم برنامج unbuffer الحزمة مشكلات مع بعض الحزم تحت fedora وإعادة redhat إصدارات unix.

وضع جانبا الاضطرابات

التالية عملت بالنسبة لي

bash myscript.sh 2>&1 | tee output.log

أشكركم المدخلات الخاصة بك أنقذ لي الكثير من الوقت ..


< command > |& tee filename # سيؤدي ذلك إلى إنشاء ملف "filename" بحالة الأمر كمحتوى ، إذا كان الملف موجودًا بالفعل ، فسوف يزيل المحتوى الموجود ويكتب حالة الأمر.

< command > | tee >> filename < command > | tee >> filename # سيؤدي ذلك إلى إلحاق الحالة بالملف لكنه لا يطبع حالة الأمر على standard_output (الشاشة).

أريد طباعة شيء ما باستخدام "echo" على الشاشة وإلحاق البيانات التي تم تكرارها إلى ملف

echo "hi there, Have to print this on screen and append to a file" 

$ program [arguments...] 2>&1 | tee outfile

2>&1 مقالب stderr و stdout تيارات. يأخذ tee outfile تيار يحصل عليه ويكتب على الشاشة وإلى ملف "outfile".

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

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

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

تحديث: سوف يحل برنامج unbuffer ، جزء من حزمة expect ، المشكلة التخزين المؤقت. سيؤدي ذلك إلى كتابة stdout و stderr إلى الشاشة والملف على الفور والاحتفاظ بها متزامنة عند دمجها وإعادة توجيهها إلى tee . على سبيل المثال:

$ unbuffer program [arguments...] 2>&1 | tee outfile

يرجى استخدام command 2>file هنا 2 لتقف على واصف الملف من stderr . يمكنك أيضًا استخدام 1 بدلاً من 2 بحيث يتم إعادة توجيه المعاير إلى "الملف"







linux bash file-io io stdout