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


688

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.

Yanıtlar:


735

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

SomeCommand > SomeFile.txt  

Veya veri eklemek istiyorsanız:

SomeCommand >> SomeFile.txt

Bunu stderrda kullanmak istersen :

SomeCommand &> SomeFile.txt  

veya bunu eklemek için:

SomeCommand &>> SomeFile.txt  

Konsolda ve bir dosyada hem stderrçıktısını hem de çıktısını görüntülemek istiyorsanız, şunu kullanın:

SomeCommand 2>&1 | tee SomeFile.txt

(Yalnızca çıktıyı istiyorsanız, 2yukarıdakileri bırakın )


15
Bunu unutmayın someCommand 2> someFile.txtve someCommand 2>> someFile.txtayrıca stterrsomeFile.txt dosyasına yönlendirir
Slothworks 29:15

Bunu gcc komutuyla yapmaya çalışıyorum ama işe yaramıyor. Diğer komutlarla çalışır, ancak bu değil. Sadece çıktı dosyasını içinde hiçbir şey olmadan oluşturur.
Nikos

@ Nik-Lz Genelde bu, komutun stderr'deki tüm çıktılarını göndermesidir. Eğer gcc hata mesajları veriyorsa, bu muhtemelen gözüküyor. Stdout yerine stderr'i nasıl yakalayacağınızla ilgili Slothworks yorumuna bakın.
Jonathan Hartley

1
Not: makekomutun çıktısını bir dosyaya almak için bunun yerine bu sözdizimini gerektirir: make > someFile.txt 2>&1(kaynak: linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples

Dosya 8 MB'a ulaştığında yazmayı durdurmasıyla ilgili bir sorunum var. Bu bilinen bir sınır mı?
relG

863

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 n.e.sözdizimi sütununda "mevcut değil" 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 sadece StdErr'yi ikinci bir komutla borulamayı sağlayan kısa bir sözdizimi yoktur, burada teetabloyu tamamlamak için tekrar burada bir arada kullanılması gerekir . Eğer böyle bir şeye gerçekten ihtiyacınız varsa, lütfen "stderr nasıl kullanılır, stdout değil mi?" Konusuna bakın. Yığın Taşması üzerine , örneğin akışları değiştirerek veya işlem değiştirme kullanarak bunun nasıl yapılabileceği hakkında bilgi edinin.

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


66
Masa için teşekkürler, mükemmel! Bu en iyi cevap olmalıdır
DevShark

3
@ karthick87 Bu, çıktıyı bir dosyaya yeniden yönlendirmekle ilgili bir soru ile ilgili değil, çünkü yalnızca bir akımı diğerine yönlendirir. 2>&1STDERR'yi STDOUT'a yönlendirir, STDOUT'u STDERR'ye 1>&2yönlendirir ve 3>&1akış 3'ü STDERR'ye yönlendirir.
Byte Komutanı

18
'| &' Nin benim için macOS'ta çalışmadığını not edin. Bu, bash'ın daha eski bir sürümüne sahip olması nedeniyle (sanırım). Daha az zarif olan '2> & 1 |' yine de iyi çalışıyor
Danny Parker

2
@ByteCommander Hata alıyorum: c9.io sunucusundaki bir Python komut dosyasından sh: 1: Syntax error: "&" unexpectedkullandığımda |& tee. Farklı bir kabuk kullanılıyor gibi görünüyor. 4.3.11 (1) sürümünü echo $SHELLgösterir /bin/bashve $SHELL --versiongösterir. #!/bin/bashPython senaryomda denedim ama hala alıyorum sh: 1: Syntax error. İhtiyacım olanı aldım, bu yüzden sunucumdaki shve bashsunucudaki garipliği sıraya koymaktan vazgeçiyorum . Teşekkürler.
samkhan13

1
@ samkhan13 Çalıştırdığınız benziyor shdeğil bash(ya da belki bashde sh... mod). Şu anki kabuk işleminizin tam olarak ne kullandığını kontrol edebilirsiniz ps -p $$ -o cmd=, çünkü echo $SHELLgüvenilir değildir ve farklı bir alt kabuk başlatıp başlatmayacağınızı göz ardı ederek size giriş kabuğunuzu gösterir.
Byte Commander

108

teeÇıktıyı bir dosyaya göndermek için 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

teeAyrıca canlı görüntülerken komut çıktısını yakalayabilmek istiyorsanız kullanışlıdır .


& Beklenmedik olduğunu ve komut çalıştığı sırada günlüğü yazmadığını söylüyor. Bunu bir bash dosyasında kullanıyorum, ancak bu herhangi bir fark yaratıyor mu?
tim687

@ tim687 Bu düzenlemeyi kaldırdım. Bunun için üzgünüm ... cevabımın bir parçası değildi.
Aaron,

@Aaron Teşekkürler! tee, dosyayı gerçek zamanlı olarak ekleyecektir, değil mi? Kullandığım bir yedekleme betiği var, lol, bilgisayarımı yedekle, ancak günlüğe kaydetme gerçek zamanlı değil. Yedekleme bittikten sonra bilgisayarım uyku moduna giriyor ve günlük dosyası boş. Komutları kaydetmek için başka bir komut kullanmalı mıyım?
tim687

anlamını nasıl yorumlayabilirim 2>&1?
Mahesha999

@ Mahesha999 2, STDERR için dosya tanıtıcısı ve 1 tanesi STDOUT içindir. Böylece 2> & 1, STDERR'yi STDOUT'a gönderir. Bu SO sorusu oldukça iyi açıklıyor: stackoverflow.com/questions/818255/…
Aaron

20

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

your_command >/path/to/file

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

your_command >>/path/to/file

Çok teşekkürler ! Sınır var mı? dosyanın maksimum boyutu gibi?
Zepp'in

3
Maksimum dosya boyutu sadece dosya sistemiyle sınırlıdır
kaos

Bu cevap stderr'i kurtarmayacak. &> Kullanın, bkz. Stackoverflow.com/questions/637827/… ve tldp.org/LDP/abs/html/io-redirection.html
Panter

3
OP stderr kurtarmaya sormadın
kaos

"Böyle bir dosya veya dizin yok" yazıyor. Dizinleri otomatik olarak oluşturmak da mümkün mü?
Qwerty

14

Dikkate alınması gereken bir geliştirme -

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

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

1
Çıktıyı renkleri koruyacak şekilde nasıl saklayabilirim? Bir komutun sonucunu libreoffice 'de almak ve renkleri korumak istiyorum.
madrang

@madrang: Yorumunuzu şimdi okudum ama bu cevabı faydalı bulabilirsiniz .
Sylvain Pineau

Oh, neredeyse tam olarak aradığım şey. Çıkış da ekrana nasıl yazdırılır?
Sigur

1
Gibi renklendirilmiş çıkışı üretmek birçok komutları Not lsve grepdestek --color=autostandart çıkış terminali yalnızca renk kodları üretir.
Eliah Kagan

5

İçin cronişler vb Eğer Bash uzantıları kaçınmak istiyorum. Eşdeğer POSIX shyö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 ödünç oldu cshzaten kötü bir fikir olduğuna sizi ikna gereken.


1

some_command | tee command.logve some_command > command.logkomut çıkışını command.loggerçek zamanlı olarak dosyaya kaydetmemeleri sorununu yaşayın.

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


Örnek:

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

Varsayalım ki log.py:

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

koşabilirsin unbuffer python log.py | tee command.logya daunbuffer python log.py > command.log

Ek bilgi: Komut çıktısını bir dosyaya gerçek zamanlı olarak nasıl kaydederim?


Çıktıyı aldıklarında kaydederler; sorun, çıktı bir TTY'ye gelmediğinde python'un arabelleğe almasıdır. Bunu Python'da devre dışı bırakmak için diğer seçenekler: stackoverflow.com/q/107705/2072269
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.