it-swarm-tr.com

Terminal çıkışını bir dosyaya nasıl kaydederim?

Bir komutun çıktısını bir dosyaya nasıl kaydederim?

Herhangi bir yazılım kullanmadan bir yolu var mı? Nasıl olduğunu bilmek isterim.

662
led-Zepp

Evet mümkündür, çıktıyı bir dosyaya yönlendirin:

SomeCommand > SomeFile.txt  

Veya veri eklemek istiyorsanız:

SomeCommand >> SomeFile.txt

İsterseniz stderr bunu da kullanın:

SomeCommand &> SomeFile.txt  

veya bunu eklemek için:

SomeCommand &>> SomeFile.txt  

konsolda hem stderr ve çıktısının görüntülenmesini istiyorsanız ve bir dosyada kullanın:

SomeCommand 2>&1 | tee SomeFile.txt

(Yalnızca çıktıyı istiyorsanız, yukarıdaki 2 öğesini bırakın)

704
Seth

Bir komutun çıktısını bir dosyaya yazmak için, temel olarak 10 yaygın şekilde kullanılan yol vardır.

Genel bakış:

Lütfen sözdizimi sütunundaki n.e. öğesinin "yok" anlamına geldiğini unutmayın.
Bir yol var, ancak sütuna sığmayacak kadar karmaşık. Bu konuda Liste bölümünde yararlı bir bağlantı bulabilirsiniz.

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

Liste:

  • command > output.txt

    Standart çıkış akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, üzerine yazılır.

  • command >> output.txt

    Standart çıkış akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.

  • command 2> output.txt

    Standart hata akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, üzerine yazılır.

  • command 2>> output.txt

    Standart hata akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.

  • command &> output.txt

    Hem standart çıktı hem de standart hata akışı yalnızca dosyaya yönlendirilecek, terminalde hiçbir şey görünmeyecek. Dosya zaten varsa, üzerine yazılır.

  • command &>> output.txt

    Hem standart çıktı hem de standart hata akışı yalnızca dosyaya yönlendirilecek, terminalde hiçbir şey görünmeyecek. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.

  • command | tee output.txt

    Standart çıkış akışı dosyaya kopyalanacak, terminalde görünmeye devam edecektir. Dosya zaten varsa, üzerine yazılır.

  • command | tee -a output.txt

    Standart çıkış akışı dosyaya kopyalanacak, terminalde görünmeye devam edecektir. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.

  • (*)

    Bash'in tabloyu tamamlamak için tekrar tee ile birlikte kullanılması gereken ikinci bir komuta sadece StdErr borulaması sağlayan kısa bir sözdizimi yoktur. Gerçekten böyle bir şeye ihtiyacınız varsa, lütfen "Stderr'e nasıl boru yapılır, stdout'a değil?" E bakın. Yığın Taşması Üzerine bunun nasıl yapılabileceğinin bazı şekilleri için; akışları değiştirerek veya işlem değiştirme kullanarak.

  • command |& tee output.txt

    Hem standart çıktı hem de standart hata akışları, dosyada hala terminalde görünür durumdayken kopyalanacaktır. Dosya zaten varsa, üzerine yazılır.

  • command |& tee -a output.txt

    Hem standart çıktı hem de standart hata akışları, dosyada hala terminalde görünür durumdayken kopyalanacaktır. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.

833
Byte Commander

Çıktıyı bir dosyaya göndermek için tee öğesini de kullanabilirsiniz:

command | tee ~/outputfile.txt

Küçük bir değişiklik de stderr'i yakalayacaktır:

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

veya biraz daha kısa ve daha az karmaşık:

command |& tee ~/outputfile.txt

tee --- yapabilmek istiyorsanız kullanışlıdır canlı olarak görüntülerken komut çıktısını yakalayın.

105
Aaron

Komut çıkışını bir dosyaya yönlendirebilirsiniz:

your_command >/path/to/file

Komut çıkışını üzerine yazmak yerine bir dosyaya eklemek için aşağıdakileri kullanın:

your_command >>/path/to/file
20
chaos

Dikkate alınması gereken bir geliştirme -

Çeşitli komut dosyaları, log dosyanızı karıştırmak istemeyebileceğiniz çıktılara renk kodları ekler.

Bunu düzeltmek için, bu kodları çıkarmak için sed programını kullanabilirsiniz. Örnek:

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

cron işler vb. İçin, Bash eklentilerinden kaçınmak istersiniz. Eşdeğer POSIX sh yönlendirme operatörleri

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

POSIX tesisinin bir anlamda daha basit ve daha basit olduğunu fark edeceksiniz. &> sözdizimi, sizi zaten kötü bir fikir olduğuna ikna etmesi gereken csh'dan ödünç alındı.

5
tripleee

some_command | tee command.log ve some_command > command.log, komut çıktısını gerçek zamanlı olarak command.log dosyasına kaydetmeme sorununa sahiptir.

Bu sorunu önlemek ve komut çıkışını gerçek zamanlı olarak kaydetmek için, unbuffer paketi ile birlikte gelen expect ekleyebilirsiniz.


Örnek:

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

log.py içerdiğini varsayarsak:

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

unbuffer python log.py | tee command.log veya unbuffer python log.py > command.log komutunu çalıştırabilirsiniz

Daha fazla bilgi: Komut çıkışını bir dosyaya gerçek zamanlı olarak nasıl kaydederim?

1