Terminal çıktısını bir dosyaya nasıl kaydederim?

Nasıl bir dosya için bir komut çıktısını kaydedebilirim?

Herhangi bir yazılım kullanmadan bir yolu var mı? Nasıl yapılacağını bilmek istiyorum.

Evet, bu mümkün, sadece çıktıyı yönlendirin (AKA stdout bir dosya için :

SomeCommand > SomeFile.txt  

Veya veri eklemek istiyorsanız:

SomeCommand >> SomeFile.txt

Eğer isterseniz stderr bunu da kullan:

SomeCommand &> SomeFile.txt  

ya da bunu eklemek için:

SomeCommand &>> SomeFile.txt  

eğer ikisine de sahip olmak istiyorsan stderr ve çıktı konsolda görüntülenir ve bir dosyada bunu kullan:

SomeCommand 2>&1 | tee SomeFile.txt

(Yalnızca çıktıyı istiyorsanız, bırakın 2 üzerinde)

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

Genel bakış:

Lütfen unutmayın n.e. sözdizimi sütununda "mevcut değil" anlamına gelir.
Bir yolu var, ama sütuna sığmayacak kadar karmaşık. Bununla ilgili 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 çıktı akışı yalnızca dosyaya yönlendirilecek, terminalde görünmeyecektir. Dosya zaten varsa, üzerine yazılır.

  • command >> output.txt

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

  • command 2> output.txt

    Standart hata akışı yalnızca dosyaya yönlendirilir, terminalde görünmez. Dosya zaten varsa, üzerine yazılır.

  • command 2>> output.txt

    Standart hata akışı yalnızca dosyaya yönlendirilir, terminalde görünmez. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.

  • command &> output.txt

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

  • command &>> output.txt

    Hem standart çıktı hem de standart hata akışı yalnızca dosyaya yönlendirilir, terminalde hiçbir şey görünmez. 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 , yalnızca stderr'yi ikinci bir komuta yönlendirmeye izin veren bir steno sözdizimine sahip değildir; bu, burada aşağıdakilerle birlikte gerekli olacaktır tee yine masayı tamamlamak için. Gerçekten böyle bir şeye ihtiyacınız varsa, lütfen bakın "Nasıl stderr boru ve stdout değil?" yığın Taşması üzerine bunun nasıl yapılabileceğinin bazı yolları için, örneğin 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 görünmeye devam ederken dosyaya kopyalanır. Dosya zaten varsa, üzerine yazılır.

  • command |& tee -a output.txt

    Hem standart çıktı hem de standart hata akışları, terminalde görünmeye devam ederken dosyaya kopyalanır. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.

Ayrıca şunları da kullanabilirsiniz tee çıktıyı bir dosyaya göndermek için:

command | tee ~/outputfile.txt

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

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

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

command |& tee ~/outputfile.txt

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

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:

your_command >>/path/to/file

Bir donanım dikkate -

Çeşitli komut dosyaları, günlük dosyanızı karıştırmak istemeyebileceğiniz çıktıya renk kodları enjekte eder.

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

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

Burada iki farklı soru var. Birincisi başlıkta:

Terminal çıktısını bir dosyaya nasıl kaydederim?

İkinci soru bedende:

Nasıl bir dosya için bir komut çıktısını kaydedebilirim?

Burada yayınlanan tüm cevaplar ikinci soruyu ele alıyor, ancak hiçbiri harika bir cevabı olan ilk soruyu ele almıyor. Unix ve Linux:

Bu cevap, az bilinen bir komut kullanır script siz yazana kadar tüm kabuğunuzun çıktısını bir metin dosyasına kaydeder exit. Komut çıktısı hala ekranınızda görünür, ancak metin dosyasında da görünür.

İşlem basittir. Kullanmak:

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

Ardından, 1, 2 ve 3 komutlarının kaydedilmiş çıktısına bakın:

cat ~/outputfile.txt

Bu şuna benzer önceki cevap -den:

command |& tee ~/outputfile.txt
  • Ama kullanmak zorunda değilsiniz |& tee ~/outputfile.txt her birinden sonra commnd.
  • Bu script komut, yeniden yüklemenin avantajını (veya dezavantajını) ekledi ~/.bashrc ne zaman başlıyor.
  • Bu script komut, komut istemini gösterir ($PS1) girdiğiniz komut (lar) ı takip eder.
  • Bu script komut tüm ayrıntıları tam renkli olarak kaydeder.

İçin cron işler vb. Bash uzantılarından kaçınmak istersiniz. Eşdeğer POSIX sh yönlendirme operatörleri şunlardır

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

POSIX tesisinin bir anlamda daha basit ve anlaşılır olduğunu fark edeceksiniz. Bu &> sözdizimi ödünç alındı csh bu da seni zaten bunun kötü bir fikir olduğuna ikna etmeli.

some_command | tee command.log ve some_command > command.log komut çıktısını kaydetmemeleri sorunu var command.log gerçek zamanlı olarak dosyalayın.

Bu sorunu önlemek ve komut çıktısını gerçek zamanlı olarak kaydetmek için şunları ekleyebilirsiniz unbuffer bu gelir expect paket.


Örnek:

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

Varsayarak log.py içeriyor:

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

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

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

Komut çalıştırılırken dosyaya çıktı almak istiyorsanız:

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