Bagaimana cara menyimpan output terminal ke file?

690

Bagaimana cara menyimpan output dari perintah ke file?

Apakah ada cara tanpa menggunakan perangkat lunak apa pun? Saya ingin tahu caranya.

led-Zepp
sumber

Jawaban:

737

Ya itu mungkin, arahkan saja output ke file:

SomeCommand > SomeFile.txt  

Atau jika Anda ingin menambahkan data:

SomeCommand >> SomeFile.txt

Jika Anda ingin stderrjuga gunakan ini:

SomeCommand &> SomeFile.txt  

atau ini untuk ditambahkan:

SomeCommand &>> SomeFile.txt  

jika Anda ingin memiliki keduanya stderrdan output ditampilkan di konsol dan dalam file gunakan ini:

SomeCommand 2>&1 | tee SomeFile.txt

(Jika Anda ingin output saja, letakkan di 2atas)

Seth
sumber
15
Perhatikan itu someCommand 2> someFile.txtdan someCommand 2>> someFile.txtjuga pengalihan stterrke someFile.txt
Slothworks
Saya mencoba melakukan ini dengan perintah gcc tetapi tidak berhasil. Ini bekerja dengan perintah lain, tetapi tidak yang ini. Itu hanya menciptakan file output tanpa ada di dalamnya.
Nikos
@ Nik-Lz Seringkali ini karena perintah mengirim semua outputnya pada stderr. Jika gcc menghasilkan pesan kesalahan, ini sepertinya. Lihat komentar Slothworks untuk cara menangkap stderr alih-alih stdout.
Jonathan Hartley
1
NB: untuk mendapatkan output dari makeperintah ke dalam file itu membutuhkan sintaks ini sebagai gantinya: make > someFile.txt 2>&1(sumber: linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples
Saya memiliki masalah sehingga berhenti menulis saat file mencapai sekitar 8MB. Apakah ini batas yang diketahui?
RelG
865

Untuk menulis output dari suatu perintah ke file, pada dasarnya ada 10 cara yang umum digunakan.

Gambaran:

Harap perhatikan bahwa n.e.dalam kolom sintaks berarti "tidak ada".
Ada caranya, tapi terlalu rumit untuk masuk ke dalam kolom. Anda dapat menemukan tautan bermanfaat di bagian Daftar tentang hal itu.

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

Daftar:

  • command > output.txt

    Aliran output standar akan diarahkan ke file saja, itu tidak akan terlihat di terminal. Jika file sudah ada, akan ditimpa.

  • command >> output.txt

    Aliran output standar akan diarahkan ke file saja, itu tidak akan terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke akhir file.

  • command 2> output.txt

    Aliran kesalahan standar hanya akan diarahkan ke file, itu tidak akan terlihat di terminal. Jika file sudah ada, akan ditimpa.

  • command 2>> output.txt

    Aliran kesalahan standar hanya akan diarahkan ke file, itu tidak akan terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke akhir file.

  • command &> output.txt

    Output standar dan stream kesalahan standar hanya akan diarahkan ke file, tidak ada yang akan terlihat di terminal. Jika file sudah ada, akan ditimpa.

  • command &>> output.txt

    Output standar dan stream kesalahan standar hanya akan diarahkan ke file, tidak ada yang akan terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke akhir file ..

  • command | tee output.txt

    Aliran keluaran standar akan disalin ke file, itu masih akan terlihat di terminal. Jika file sudah ada, akan ditimpa.

  • command | tee -a output.txt

    Aliran keluaran standar akan disalin ke file, itu masih akan terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke akhir file.

  • (*)

    Bash tidak memiliki sintaks steno yang memungkinkan pemipaan hanya StdErr ke perintah kedua, yang akan diperlukan di sini dalam kombinasi dengan teelagi untuk menyelesaikan tabel. Jika Anda benar-benar membutuhkan sesuatu seperti itu, silakan lihat "Cara memasang pipa stderr, dan tidak stdout?" pada Stack Overflow untuk beberapa cara bagaimana hal ini dapat dilakukan misalnya dengan menukar stream atau menggunakan subtitusi proses.

  • command |& tee output.txt

    Output standar dan stream kesalahan standar akan disalin ke file saat masih terlihat di terminal. Jika file sudah ada, akan ditimpa.

  • command |& tee -a output.txt

    Output standar dan stream kesalahan standar akan disalin ke file saat masih terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke akhir file.

Komandan Byte
sumber
66
Terima kasih untuk meja, ini luar biasa! Ini harus menjadi jawaban teratas
DevShark
3
@ karthick87 Ini tidak benar-benar terkait dengan pertanyaan tentang pengalihan output ke file, karena hanya mengalihkan satu aliran ke yang lain. 2>&1pengalihan STDERR ke STDOUT, 1>&2pengalihan STDOUT ke STDERR dan 3>&1akan mengarahkan aliran 3 ke STDERR.
Byte Commander
18
Hanya sebuah catatan bahwa '| &' tidak berfungsi untuk saya di macOS. Ini karena memiliki versi bash yang lebih lama (saya pikir). Yang kurang elegan '2> & 1 |' berfungsi dengan baik
Danny Parker
2
@ByteCommander Saya mendapatkan kesalahan: sh: 1: Syntax error: "&" unexpectedketika saya gunakan |& teedari skrip Python di server c9.io. Tampaknya shell yang berbeda sedang digunakan. echo $SHELLmenunjukkan /bin/bashdan $SHELL --versionmenunjukkan versi 4.3.11 (1) -release. Saya mencoba #!/bin/bashskrip python saya tetapi saya masih dapat sh: 1: Syntax error. Saya mendapatkan apa yang saya butuhkan jadi saya menyerah untuk menyortir keanehan antara shdan bashdi server saya. Terima kasih.
samkhan13
1
@ samkhan13 sepertinya Anda sedang menjalankan shdan tidak bash(atau mungkin bashdalam shmode ...). Anda dapat memeriksa apa sebenarnya proses shell Anda saat ini digunakan ps -p $$ -o cmd=, karena echo $SHELLtidak dapat diandalkan dan akan menunjukkan Anda shell login Anda, mengabaikan apakah Anda mungkin telah memulai subkulit yang berbeda.
Byte Commander
108

Anda juga dapat menggunakan teeuntuk mengirim output ke file:

command | tee ~/outputfile.txt

Sedikit modifikasi akan menangkap stderr juga:

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

atau sedikit lebih pendek dan tidak terlalu rumit:

command |& tee ~/outputfile.txt

teeberguna jika Anda ingin dapat menangkap keluaran perintah sambil juga melihatnya langsung .

Harun
sumber
Dikatakan bahwa & tidak terduga, dan tidak menulis log pada saat yang sama ketika perintah dijalankan. Saya menggunakan ini dalam file bash, apakah itu ada bedanya?
tim687
@ tim687 Saya telah menghapus suntingan itu. Maaf tentang itu ... bukan bagian dari jawaban asli saya.
Aaron
@ Harun, terima kasih! tee akan menambahkan file secara real time, kan? Saya memiliki skrip cadangan yang saya gunakan untuk, lol, mencadangkan pc saya, tetapi logging tidak secara real time. PC saya akan tidur setelah cadangan selesai, dan file log kosong. Haruskah saya menggunakan perintah lain untuk mencatat perintah?
tim687
bagaimana cara menafsirkan makna 2>&1?
Mahesha999
@ Mahesha999 2 adalah deskriptor file untuk STDERR, dan 1 untuk STDOUT. Sehingga 2> & 1 mengirim STDERR ke STDOUT. Pertanyaan SO ini menjelaskannya dengan cukup baik: stackoverflow.com/questions/818255/…
Aaron
20

Anda dapat mengarahkan output perintah ke file:

your_command >/path/to/file

Untuk menambahkan output perintah ke file alih-alih menimpanya, gunakan:

your_command >>/path/to/file
kekacauan
sumber
Terima kasih banyak ! apakah ada batasan? suka ukuran maksimal file?
led-Zepp
3
Ukuran file maks hanya dibatasi melalui sistem file
chaos
Jawaban ini tidak akan menghemat stderr. Gunakan &>, lihat stackoverflow.com/questions/637827/… dan tldp.org/LDP/abs/html/io-redirection.html
Panther
3
OP tidak pernah meminta untuk menyelamatkan stderr
chaos
Dikatakan "Tidak ada file atau direktori". Apakah mungkin juga membuat direktori secara otomatis?
Qwerty
14

Peningkatan untuk dipertimbangkan -

Berbagai skrip akan menyuntikkan kode warna ke dalam output yang Anda mungkin tidak ingin mengacaukan file log Anda.

Untuk mengatasinya, Anda dapat menggunakan program sed untuk menghapus kode-kode. Contoh:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
Sean Huber
sumber
1
Bagaimana cara menyimpan output dengan cara warna dilestarikan? Saya ingin mengimpor hasil dari perintah di libreoffice dan menjaga warnanya.
madrang
@madrang: Saya hanya membaca komentar Anda sekarang tetapi Anda mungkin menemukan jawaban ini berguna.
Sylvain Pineau
Oh, hampir persis apa yang saya cari. Bagaimana cara mencetak juga di layar output?
Sigur
1
Perhatikan bahwa banyak perintah yang menghasilkan keluaran berwarna, seperti lsdan grep, dukungan --color=auto, yang hanya mengeluarkan kode warna jika keluaran standar adalah terminal.
Eliah Kagan
5

Untuk cronpekerjaan, dll, Anda ingin menghindari ekstensi Bash. shOperator pengalihan POSIX setara adalah

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

Anda akan melihat bahwa fasilitas POSIX dalam beberapa hal lebih sederhana dan lebih mudah. The &>sintaks dipinjam dari cshyang seharusnya sudah meyakinkan Anda bahwa itu adalah ide yang buruk.

tripleee
sumber
1

some_command | tee command.logdan some_command > command.logmemiliki masalah bahwa mereka tidak menyimpan output perintah ke command.logfile secara real-time.

Untuk menghindari masalah itu dan menyimpan output perintah secara real-time, Anda dapat menambahkan unbuffer, yang datang dengan expectpaket.


Contoh:

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

Dengan asumsi log.pymengandung:

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

Anda dapat menjalankan unbuffer python log.py | tee command.logatauunbuffer python log.py > command.log

Informasi lebih lanjut: Bagaimana saya bisa menyimpan output perintah ke file secara real-time?

Franck Dernoncourt
sumber
Mereka memang menyimpan output saat mereka menerimanya, masalahnya adalah bahwa python mengaktifkan buffering ketika output tidak ke TTY. Opsi lain untuk menonaktifkan ini dengan Python: stackoverflow.com/q/107705/2072269
muru