سؤال كيف يمكنني حفظ الإخراج النهائي لملف؟


كيف أقوم بحفظ إخراج أمر إلى ملف؟

هل هناك طريقة دون استخدام أي برنامج؟ أود أن أعرف كيف.


397
2018-02-14 19:49


الأصل




الأجوبة:


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

someCommand > someFile.txt  

أو إذا كنت تريد إلحاق البيانات:

someCommand >> someFile.txt

إن أردت stderr أيضا استخدام هذا:

someCommand &> someFile.txt  

أو هذا لإلحاق:

someCommand &>> someFile.txt  

390
2018-02-14 19:52



لاحظ أن someCommand 2> someFile.txt و someCommand 2>> someFile.txt يعيد أيضا توجيه stterr إلى someFile.txt - Slothworks
أحاول القيام بذلك باستخدام الأمر gcc ولكنه لا يعمل. إنه يعمل مع الأوامر الأخرى ، ولكن ليس هذا. انها ببساطة يخلق ملف الإخراج مع أي شيء داخله. - Nik-Lz
@ Nik-Lz في كثير من الأحيان هذا لأن الأمر يرسل كل مخرجاته على stderr. إذا كان GCC يولد رسائل خطأ ، فمن المحتمل أن يبدو ذلك. انظر تعليق Slothworks لكيفية التقاط stderr بدلا من stdout. - Jonathan Hartley
ملاحظة: للحصول على خرج من make أمر في ملف يتطلب هذا النحو بدلا من ذلك: make > someFile.txt 2>&1 (مصدر: linuxquestions.org/questions/linux-newbie-8/...) - Gabriel Staples
تضمين التغريدة tee الإجابة أدناه (askubuntu.com/a/485762/44179) - Seth♦


لكتابة إخراج أمر إلى ملف ، هناك 10 طرق شائعة الاستخدام.

نظرة عامة:

يرجى ملاحظة أن n.e. في عمود بناء الجملة يعني "غير موجود".
  هناك طريقة ، لكنها معقدة للغاية بحيث لا يمكن دمجها في العمود. يمكنك العثور على رابط مفيد في قسم القائمة حوله.

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

قائمة:

  • command > output.txt

    سيتم إعادة توجيه تدفق الإخراج القياسي إلى الملف فقط ، ولن يكون مرئيًا في الجهاز. إذا كان الملف موجودًا بالفعل ، فسيتم الكتابة فوقه.

  • command >> output.txt

    سيتم إعادة توجيه تدفق الإخراج القياسي إلى الملف فقط ، ولن يكون مرئيًا في الجهاز. إذا كان الملف موجودًا بالفعل ، فسيتم إلحاق البيانات الجديدة بنهاية الملف.

  • command 2> output.txt

    سيتم إعادة توجيه مسار الخطأ القياسي إلى الملف فقط ، ولن يكون مرئيًا في الجهاز. إذا كان الملف موجودًا بالفعل ، فسيتم الكتابة فوقه.

  • command 2>> output.txt

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

  • command &> output.txt

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

  • command &>> output.txt

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

  • command | tee output.txt

    سيتم نسخ تيار الإخراج القياسي إلى الملف ، سيظل مرئيًا في الجهاز. إذا كان الملف موجودًا بالفعل ، فسيتم الكتابة فوقه.

  • command | tee -a output.txt

    سيتم نسخ تيار الإخراج القياسي إلى الملف ، سيظل مرئيًا في الجهاز. إذا كان الملف موجودًا بالفعل ، فسيتم إلحاق البيانات الجديدة بنهاية الملف.

  • (*)

    ليس لدى Bash بنية مختصرة تسمح بتوصيل StdErr إلى أمر ثانٍ فقط ، والتي ستكون مطلوبة هنا مع tee مرة أخرى لاستكمال الجدول. إذا كنت حقا بحاجة إلى شيء من هذا القبيل ، يرجى النظر "كيف الأنابيب stderr ، وليس stdout؟" على Stack Overflow لبعض الطرق كيف يمكن القيام بذلك على سبيل المثال ، عن طريق تبديل التدفقات أو استخدام عملية الاستبدال.

  • command |& tee output.txt

    سيتم نسخ كل من الإخراج القياسي وتدفق الأخطاء القياسية إلى الملف بينما لا تزال مرئية في الجهاز. إذا كان الملف موجودًا بالفعل ، فسيتم الكتابة فوقه.

  • command |& tee -a output.txt

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


539
2018-02-08 14:52



شكرا للجدول ، انها ممتازة! هذا يجب أن يكون الجواب الأعلى - DevShark
@ karthick87 هذا ليس مرتبطًا فعلاً بالسؤال حول إعادة توجيه الإخراج إلى ملف ، لأنه فقط يعيد توجيه دفق واحد إلى آخر. 2>&1 يعيد توجيه STDERR إلى STDOUT ، 1>&2 يعيد توجيه STDOUT إلى STDERR و 3>&1 سيعيد توجيه التدفق 3 إلى STDERR. - Byte Commander
مجرد ملاحظة أن "| &" لم تكن تعمل لي على نظام macOS. هذا بسبب وجود نسخة قديمة من باش (على ما أظن). أقل "2> & 1 |" يعمل بشكل جيد على الرغم من - Danny Parker
ماذا عن n، y، y، y؟ - user1133275
Jas لإعادة توجيه كل من stderr (2) و stdout (1) دفق. - Byte Commander


تستطيع ايضا استخذام tee لإرسال الإخراج إلى ملف:

command | tee ~/outputfile.txt

تعديل بسيط سوف يمسك stderr كذلك:

command 2>&1 | tee ~/outputfile.txt

أو أقصر قليلا وأقل تعقيدا:

command |& tee ~/outputfile.txt

tee مفيد إذا كنت تريد أن تكون قادرًا على ذلك التقاط إخراج الأوامر أثناء مشاهدته مباشرة.


81
2018-06-20 04:45



tee يكون مفيدًا إذا كنت تريد أن تكون قادرًا على التقاط إخراج الأوامر أثناء مشاهدته مباشرةً. جعل هذا الخط بالخط العريض هارون. سوف تفعل وظيفتين في وقت واحد. شكرا لإجابتك. - learner
تقول أن & غير متوقع ، ولا يكتب السجل في نفس وقت تشغيل الأمر. أنا أستخدم هذا في ملف bash ومع ذلك ، هل هذا يحدث أي فرق؟ - tim687
@ tim687 لقد أزلت هذا التعديل. عذرا عن ذلك ... لم يكن جزءا من جوابي الأصلي. - Aaron
ردًا علىAaron سوف قم بإلحاق الملف في الوقت الحقيقي ، أليس كذلك؟ لدي برنامج نصي احتياطي يمكنني استخدامه ، لول ، النسخ الاحتياطي جهاز الكمبيوتر الخاص بي ، ولكن تسجيل الدخول ليس في الوقت الحقيقي. ينتقل جهاز الكمبيوتر إلى وضع السكون بعد انتهاء النسخ الاحتياطي ، ويكون ملف السجل فارغًا. هل يجب استخدام أمر آخر لتسجيل الأوامر؟ - tim687
مليار شكرا إخوانه - Mahesha999


يمكنك إعادة توجيه إخراج الأمر إلى ملف:

your_command >/path/to/file

لإلحاق إخراج الأمر إلى ملف بدلاً من استبداله ، استخدم:

your_command >>/path/to/file

17
2018-02-14 19:52



شكرا جزيلا ! هل هناك حدود؟ مثل الحد الأقصى لحجم الملف؟ - led-Zepp
الحد الأقصى لحجم الملف محدود فقط من خلال نظام الملفات - chaos
هذه الإجابة لن توفر ستدر. استخدم &> ، انظر stackoverflow.com/questions/637827/... و tldp.org/LDP/abs/html/io-redirection.html - Panther
لم يطلب برنامج OP مطلقًا حفظ stderr - chaos


تعزيز للنظر -

البرامج النصية المختلفة ستحقن رموز الألوان في المخرجات التي قد لا ترغب في ازدحام ملف السجل الخاص بك.

لإصلاح هذا ، يمكنك استخدام البرنامج ااا لتجريد تلك الرموز. مثال:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

11
2017-07-08 20:57



كيفية حفظ الإخراج بطريقة يتم حفظ الألوان؟ أود استيراد نتيجة أمر في libreoffice والحفاظ على الألوان. - madrang
madrang: قرأت تعليقك الآن فقط ولكنك قد تجد هذا إجابة مفيد. - Sylvain Pineau
أوه ، تقريبا بالضبط ما أبحث عنه. كيفية الطباعة أيضا على الشاشة الإخراج؟ - Sigur
لاحظ أن العديد من الأوامر التي تنتج مخرجات ملونة ، مثل ls و grep، الدعم --color=auto، والتي تخرج رموز الألوان فقط إذا كان الإخراج القياسي هو محطة طرفية. - Eliah Kagan


إلى عن على cron الوظائف الخ تريد تجنب ملحقات باش. ما يعادل POSIX sh مشغلي إعادة التوجيه هي

Bash            POSIX
--------------  --------------
foo &> bar      foo >bar 2&>1
foo &>> bar     foo >>bar 2>&1
foo |& bar      foo 2>&1 | bar

ستلاحظ أن مرفق POSIX هو بطريقة أو بأخرى أبسط وأكثر وضوحًا. ال &> تم استدلال بناء الجملة من csh التي يجب أن تقنعك بالفعل بأنها فكرة سيئة


1
2018-04-11 12:25





some_command | tee command.log و some_command > command.log لديك مشكلة أنهم لا يحفظون إخراج الأمر إلى command.log الملف في الوقت الحقيقي.

لتجنب هذه المشكلة وحفظ إخراج الأمر في الوقت الفعلي ، يمكنك إلحاقها unbufferوالتي تأتي مع expect صفقة.


مثال:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

على افتراض log.py يحتوي على:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

يمكنك الجري unbuffer python log.py | tee command.log أو unbuffer python log.py > command.log

معلومات اكثر: كيف يمكنني حفظ إخراج أمر إلى ملف في الوقت الحقيقي؟


0
2017-07-04 20:54



إنهم يقومون بحفظ المخرجات عند تلقيها ، والمشكلة هي أن python يقوم بتشغيل التخزين المؤقت عندما لا يكون الإخراج إلى TTY. خيارات أخرى لتعطيل هذا في Python: stackoverflow.com/q/107705/2072269 - muru