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



3 Answers

$ 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
Question

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

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

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




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

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

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

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

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

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




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

ls -lR / | tee -a output.file



< 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" 



Related