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

392

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.

    
sordu led-Zepp 14.02.2014 20:49

7 cevap

387

Evet, mümkün, çıktıyı bir dosyaya yönlendir:

someCommand > someFile.txt  

Veya veri eklemek isterseniz:

someCommand >> someFile.txt

İsterseniz stderr bunu da kullanın:

someCommand &> someFile.txt  

veya eklemek için bu:

someCommand &>> someFile.txt  
    
verilen cevap Seth 14.02.2014 20:52
529

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

Genel Bakış:

  

Sözdizimi sütunundaki n.e. değerinin "mevcut değil" anlamına geldiğini lütfen unutmayın.
  Bir yol var, ama sütün içine sığması çok karmaşık. Liste bölümünde bunun hakkında faydalı bir link 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 çıktı akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecektir. Dosya zaten varsa, üzerine yazılır.

  • command >> output.txt

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

  • command 2> output.txt

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

  • command 2>> output.txt

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

  • command &> output.txt

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

  • command &>> output.txt

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

  • command | tee output.txt

    Standart çıktı akışı dosyaya kopyalanacak, terminalde hala görünecektir. Dosya zaten varsa, üzerine yazılır.

  • command | tee -a output.txt

    Standart çıktı akışı dosyaya kopyalanacak, terminalde hala görünecektir. Dosya zaten mevcutsa, yeni veriler dosyanın sonuna eklenir.

  • (*)

    Bash, StdErr'yi ikinci bir komuta sokmaya izin veren kısa bir sözdizimine sahip değildir; bu, tabloyu tamamlamak için yine tee ile birlikte gerekli olacaktır. Gerçekten böyle bir şeye ihtiyacınız varsa, lütfen "Stderr nasıl yazılır, stdout değil?" Bunun nasıl yapılabileceği hakkında bazı yollar için Yığın Taşması 'nda örn. akışları değiştirerek veya işlem değiştirmeyi kullanarak.

  • command |& tee output.txt

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

  • command |& tee -a output.txt

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

verilen cevap Byte Commander 08.02.2016 15:52
80

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

command | tee ~/outputfile.txt

Hafif bir değişiklik stderr'i de yakalayacaktır:

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

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

command |& tee ~/outputfile.txt

Canlı olarak görüntülerken komut çıktısını yakalayabilmek için

tee yararlıdır.

    
verilen cevap Aaron 20.06.2014 06:45
17

Komut çıktısını bir dosyaya yönlendirebilirsiniz:

your_command >/path/to/file

Komut çıktısını üzerine yazmak yerine bir dosyaya eklemek için şunu kullanın:

your_command >>/path/to/file
    
verilen cevap chaos 14.02.2014 20:52
11

Göz önünde bulundurulması gereken bir geliştirme -

Çeşitli komut dosyaları, günlük dosyasına dağılmasını istemeyeceğiniz çıktıya renk kodları ekleyecektir.

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

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

cron işleri vb. için Bash uzantılarından kaçınmak istiyorsunuz. 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 özelliğinin bir anlamda daha basit ve daha basit olduğunu fark edeceksiniz. % Co_de% sözdizimi, &> adresinden ödünç alındı. Bu, size bunun kötü bir fikir olduğuna inandı.

    
verilen cevap tripleee 11.04.2018 14:25
0

some_command | tee command.log ve some_command > command.log , komut çıktısını command.log dosyasına gerçek zamanlı olarak kaydetmedikleri sorunu var.

Bu sorunu önlemek ve komut çıktısını gerçek zamanlı olarak kaydetmek için unbuffer paketiyle birlikte gelen expect değerini ekleyebilirsiniz.

Örnek:

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

log.py değerini 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

dosyasını çalıştırabilirsiniz

Daha fazla bilgi: Bir komut çıktısını gerçek zamanlı olarak bir dosyaya nasıl kaydedebilirim?

    
verilen cevap Franck Dernoncourt 04.07.2018 22:54

Etiketlerdeki diğer soruları oku