كيف يمكنني حفظ إخراج أمر إلى ملف?
هل هناك طريقة دون استخدام أي برنامج? وأود أن أعرف كيف.
كيف يمكنني حفظ إخراج أمر إلى ملف?
هل هناك طريقة دون استخدام أي برنامج? وأود أن أعرف كيف.
نعم فمن الممكن ، مجرد إعادة توجيه الإخراج (ويعرف أيضا باسم 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