كيف يمكنني حفظ الإخراج الطرفي إلى ملف?

كيف يمكنني حفظ إخراج أمر إلى ملف?

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

نعم فمن الممكن ، مجرد إعادة توجيه الإخراج (ويعرف أيضا باسم stdout) إلى ملف:

SomeCommand > SomeFile.txt  

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

SomeCommand >> SomeFile.txt

إذا كنت تريد stderr وكذلك استخدام هذا:

SomeCommand &> SomeFile.txt  

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

SomeCommand &>> SomeFile.txt  

إذا كنت تريد أن يكون على حد سواء stderr والإخراج عرض على وحدة التحكم و في ملف استخدم هذا:

SomeCommand 2>&1 | tee SomeFile.txt

(إذا كنت تريد الإخراج فقط ، فقم بإسقاط 2 أعلاه)

لكتابة إخراج أمر إلى ملف ، هناك أساسا 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

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

  • (*)

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

  • command |& tee output.txt

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

  • command |& tee -a output.txt

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

يمكنك أيضا استخدام tee لإرسال الإخراج إلى ملف:

command | tee ~/outputfile.txt

وهناك تعديل طفيف قبض ستدير كذلك:

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

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

command |& tee ~/outputfile.txt

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

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

your_command >/path/to/file

لإلحاق إخراج الأمر بملف بدلا من الكتابة فوقه ، استخدم:

your_command >>/path/to/file

تعزيز للنظر -

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

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

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

هناك سؤالان مختلفان هنا. الأول في العنوان:

كيف يمكنني حفظ الإخراج الطرفي إلى ملف?

السؤال الثاني في الجسم:

كيف يمكنني حفظ إخراج أمر إلى ملف?

جميع الإجابات المنشورة هنا تتناول السؤال الثاني ولكن لا شيء يعالج السؤال الأول الذي له إجابة رائعة في يونكس ولينكس:

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

العملية بسيطة. استخدام:

$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt

ثم ننظر في الإخراج المسجل الخاص بك من الأوامر 1 و 2 و 3 مع:

cat ~/outputfile.txt

هذا مشابه ل الإجابة السابقة من:

command |& tee ~/outputfile.txt
  • ولكن لم يكن لديك لاستخدام |& tee ~/outputfile.txt بعد كل commnd.
  • ال script أضاف الأمر فائدة (أو عيبا) لإعادة التحميل ~/.bashrc عندما يبدأ.
  • ال script يظهر الأمر موجه الأوامر ($PS1) متبوعا بالأوامر (الأوامر) التي أدخلتها.
  • ال script يسجل الأمر كل التفاصيل بالألوان الكاملة.

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

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

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

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

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


مثال:

sudo apt-get install expectunbuffer some_command | tee command.logunbuffer some_command > command.log

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

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

يمكنك تشغيل unbuffer python log.py | tee command.log أو unbuffer python log.py > command.log

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

إذا كنت تريد الإخراج إلى الملف أثناء تشغيل الأمر:

script -c ./path/to/executable.bash -f log.txt