چگونه می توان خروجی ترمینال را در یک پرونده ذخیره کرد؟


به جواب پذیرفته شده بروید




چگونه می توان خروجی یک دستور را در یک پرونده ذخیره کرد؟

آیا راهی بدون استفاده از هیچ نرم افزاری وجود دارد؟ من می خواهم بدانم چگونه.


746









7 :تعداد پاسخها


بله ممکن است ، فقط خروجی را به یک پرونده تغییر دهید:

 SomeCommand > SomeFile.txt  
 

یا اگر می خواهید داده ها را پیوست کنید:

 SomeCommand >> SomeFile.txt
 

اگر می خواهید stderr از این نیز استفاده کنید:

 SomeCommand &> SomeFile.txt  
 

یا این برای پیوست کردن:

 SomeCommand &>> SomeFile.txt  
 

اگر می خواهید هر دو stderr و خروجی روی کنسول و در یک فایل نمایش داده شوند از این موارد استفاده کنید:

 SomeCommand 2>&1 | tee SomeFile.txt
 

(اگر فقط خروجی را می خواهید ، موارد 2 بالا را رها کنید )


823



برای نوشتن خروجی یک دستور به یک فایل ، اساساً 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 دوباره برای تکمیل جدول مورد نیاز است. اگر واقعاً به چیزی شبیه به آن نیاز دارید ، لطفاً به "چگونه لوله استندر را نصب کنید ، و نه استیج را" جستجو کنید. در Stack Overflow برای برخی از روش های انجام این کار به عنوان مثال با تعویض جریان و یا استفاده از جایگزینی فرآیند.

  • command |& tee output.txt

    جریان خروجی و خطاهای استاندارد هر دو در این ترمینال قابل مشاهده در پرونده کپی می شوند. اگر پرونده قبلاً وجود داشته باشد ، آن را رونویسی می کنید.

  • command |& tee -a output.txt

    جریان خروجی و خطاهای استاندارد هر دو در این ترمینال قابل مشاهده در پرونده کپی می شوند. اگر پرونده از قبل موجود باشد ، داده های جدید به انتهای فایل پیوست می شوند.


920



همچنین می توانید tee برای ارسال خروجی به یک پرونده استفاده کنید:

 command | tee ~/outputfile.txt
 

اصلاح جزئی باعث ایجاد stderr نیز می شود:

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

یا کمی کوتاه تر و کمتر پیچیده:

 command |& tee ~/outputfile.txt
 

tee اگر می خواهید خروجی فرمان را ضبط کنید در حالی که آن را بصورت زنده مشاهده می کنید مفید است .


111



می توانید خروجی فرمان را به یک فایل تغییر مسیر دهید:

 your_command >/path/to/file
 

به جای اضافه کردن آن ، خروجی فرمان را به پرونده اضافه کنید ، از:

 your_command >>/path/to/file
 

20



پیشرفتی که باید در نظر بگیرید -

اسکریپت های متنوع ، کدهای رنگی را به خروجی تزریق می کنند که ممکن است بخواهید پرونده ورود به سیستم را به هم نزنید.

برای رفع این مشکل ، می توانید از برنامه sed برای حذف این کدها استفاده کنید. مثال:

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

15



برای cron مشاغل و غیره شما می خواهید از الحاقات Bash جلوگیری کنید. sh عملگرهای تغییر مسیر POSIX معادل هستند

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

توجه خواهید کرد که امکانات POSIX به نوعی ساده تر و ساده تر است. &> نحو از قرض گرفته بود csh که در حال حاضر باید شما را متقاعد کند که این یک ایده بد است.


6



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

اطلاعات بیشتر: چگونه می توان خروجی فرمان را در یک زمان واقعی در یک فایل ذخیره کرد؟


1



انتشارات مرتبط


چگونه می توانم یک فایل متنی را در ترمینال خود باز کنم؟

چگونه می توانم برای دستورات ترمینال یک فایل اسکریپت ایجاد کنم؟

چگونه می توانم مجوزهای لازم را برای ویرایش پرونده های پیکربندی سیستم دریافت کنم؟

پیمایش برگشت ترمینال فعلی را برای پرونده ذخیره کنید؟

چگونه می توانم wget را مجبور کنم از سرور پروکسی بدون تغییر فایل های سیستم استفاده کنم؟

چگونه می توانم VIM را به خاطر بیاورم خطی را که در هنگام بازگشایی پرونده وجود داشت به خاطر بسپارم؟ [تکثیر]

چگونه می توانم یک پرونده .desktop برای یک فایل .jar ایجاد کنم؟

چگونه می توانم پیوند پیش فرض پرونده را در Ubuntu Nautilus بر روی چیزی تنظیم کنم که در برگه Open With ذکر نشده باشد؟

چگونه می توان خروجی htop را برای پرونده ذخیره کرد؟

چگونه می توان در ترمینال دستورات را به کلیدها اختصاص داد؟

[command-line] سوال برچسب


چگونه می توان ویندوز را به عنوان پیش فرض در boot loader تنظیم کرد؟

تاریخ و ساعت اپلت از پانل برتر وحدت موجود نیست

آیا امکان تنظیمات مختلف DPI برای دو صفحه مختلف وجود دارد؟

چگونه می توانم لیست شبکه های WiFi موجود را نمایش دهم؟

چگونه می توان نماد برنامه را در پرتاب Unity تغییر داد؟

تایمر که به طور خودکار صفحه را قفل می کند تا از کامپیوتر جدا شود؟

گزینه های اصلی برای OS X's Spotlight چیست؟ [بسته]

چگونه می توان نام رایانه را در یک LAN از آدرس IP پیدا کرد؟

چگونه اندازه آیکون دسک تاپ را تغییر دهیم؟

نحوه کپی / چسباندن یک جدول از LibreOffice Calc به LibreOffice Writer