Pertanyaan Bagaimana cara menyimpan output terminal ke file?


Bagaimana cara menyimpan output dari sebuah perintah ke file?

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


394
2018-02-14 19:49


asal




Jawaban:


Ya itu mungkin, hanya mengarahkan output ke file:

someCommand > someFile.txt  

Atau jika Anda ingin menambahkan data:

someCommand >> someFile.txt

jika kamu mau stderr juga gunakan ini:

someCommand &> someFile.txt  

atau ini untuk menambahkan:

someCommand &>> someFile.txt  

388
2018-02-14 19:52



Perhatikan itu someCommand 2> someFile.txt dan someCommand 2>> someFile.txt juga pengalihan stterr ke someFile.txt - Slothworks
Saya mencoba melakukan ini dengan perintah gcc tetapi tidak berfungsi. Ia bekerja dengan perintah lain, tetapi tidak yang ini. Ini hanya menciptakan file output tanpa apa pun di dalamnya. - Nik-Lz
@ Nik-Lz Seringkali ini karena perintah mengirim semua outputnya ke stderr. Jika gcc menghasilkan pesan kesalahan, ini sepertinya mungkin. Lihat komentar Slothworks tentang cara menangkap stderr daripada stdout. - Jonathan Hartley
NB: untuk mendapatkan output dari make perintah ke file itu membutuhkan sintaks ini sebagai gantinya: make > someFile.txt 2>&1 (sumber: linuxquestions.org/questions/linux-newbie-8/…) - Gabriel Staples
@KyleBridenstine Lihat tee jawab di bawah ini (askubuntu.com/a/485762/44179) - Seth♦


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

Ringkasan:

Harap dicatat bahwa n.e. di kolom sintaks berarti "tidak ada".
  Ada jalan, tapi terlalu rumit untuk masuk ke kolom. Anda dapat menemukan tautan bermanfaat di bagian Daftar tentangnya.

          || 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 keluaran standar akan dialihkan ke file saja, tidak akan terlihat di terminal. Jika file sudah ada, itu akan ditimpa.

  • command >> output.txt

    Aliran keluaran standar akan dialihkan ke file saja, tidak akan terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke bagian akhir file.

  • command 2> output.txt

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

  • command 2>> output.txt

    Aliran kesalahan standar akan dialihkan ke file saja, tidak akan terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke bagian akhir file.

  • command &> output.txt

    Baik output standar dan stream kesalahan standar akan dialihkan ke file saja, tidak akan terlihat di terminal. Jika file sudah ada, itu akan ditimpa.

  • command &>> output.txt

    Baik output standar dan stream kesalahan standar akan dialihkan ke file saja, tidak akan terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke bagian akhir file.

  • command | tee output.txt

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

  • command | tee -a output.txt

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

  • (*)

    Bash tidak memiliki sintaks singkatan yang memungkinkan pemipaan hanya StdErr ke perintah kedua, yang akan diperlukan di sini dalam kombinasi dengan tee lagi untuk menyelesaikan meja. Jika Anda benar-benar membutuhkan sesuatu seperti itu, silakan lihat "Bagaimana cara memasang stderr, dan tidak stdout?" di Stack Overflow untuk beberapa cara bagaimana ini dapat dilakukan misalnya dengan menukar stream atau menggunakan substitusi proses.

  • command |& tee output.txt

    Kedua output standar dan stream kesalahan standar akan disalin ke file sementara masih terlihat di terminal. Jika file sudah ada, itu akan ditimpa.

  • command |& tee -a output.txt

    Kedua output standar dan stream kesalahan standar akan disalin ke file sementara masih terlihat di terminal. Jika file sudah ada, data baru akan ditambahkan ke bagian akhir file.


535
2018-02-08 14:52



Terima kasih atas meja, ini luar biasa! Ini harus menjadi jawaban atas - DevShark
@ karthick87 Ini tidak benar-benar terkait dengan pertanyaan tentang mengarahkan output ke file, karena hanya mengarahkan satu aliran ke yang lain. 2>&1 mengalihkan STDERR ke STDOUT, 1>&2 mengalihkan STDOUT ke STDERR dan 3>&1 akan mengalihkan aliran 3 ke STDERR. - Byte Commander
Hanya catatan bahwa '| &' tidak berfungsi untuk saya di macOS. Ini karena ia memiliki versi bash yang lebih lama (menurut saya). Yang kurang elegan '2> & 1 |' berfungsi dengan baik - Danny Parker
bagaimana dengan n, y, y, y? - user1133275
@Jas untuk mengalihkan aliran stderr (2) dan stdout (1). - Byte Commander


Anda juga bisa menggunakan tee untuk 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 rumit:

command |& tee ~/outputfile.txt

tee berguna jika Anda ingin bisa ambil output perintah sambil juga melihatnya secara langsung.


81
2018-06-20 04:45



tee berguna jika Anda ingin dapat menangkap output perintah sekaligus melihatnya secara langsung. Buat garis ini berani Aaron. Ini akan melakukan dua pekerjaan sekaligus. Terima kasih atas jawabannya. - learner
Ia mengatakan 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 pengeditan itu. Maaf tentang itu ... bukan bagian dari jawaban asli saya. - Aaron
@Aaron, terima kasih! tee akan menambahkan file secara real time, kan? Saya memiliki skrip cadangan yang saya gunakan untuk, lol, backup pc saya, tetapi penebangan tidak dalam waktu nyata. Pc saya tertidur setelah cadangan selesai, dan file log kosong. Haruskah saya menggunakan perintah lain untuk mencatat perintah? - tim687
miliar terima kasih, bro - Mahesha999


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

17
2018-02-14 19:52



Terima kasih banyak ! apakah ada batasan? seperti ukuran maksimal file? - led-Zepp
Ukuran file maksimal hanya dibatasi melalui sistem file - chaos
Jawaban ini tidak akan menyimpan stderr. Gunakan &>, lihat stackoverflow.com/questions/637827/… dan tldp.org/LDP/abs/html/io-redirection.html - Panther
OP tidak pernah diminta untuk menyimpan stderr - chaos


Peningkatan yang perlu dipertimbangkan -

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

Untuk memperbaikinya, Anda bisa menggunakan program ini sed untuk menghapus kode-kode itu. Contoh:

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

11
2017-07-08 20:57



Bagaimana cara menyimpan output dengan cara yang warna dilestarikan? Saya ingin mengimpor hasil perintah dalam libreoffice dan menyimpan warnanya. - madrang
@madrang: Saya hanya membaca komentar Anda sekarang tetapi Anda mungkin menemukan ini menjawab berguna. - Sylvain Pineau
Oh, hampir persis apa yang saya cari. Bagaimana cara mencetak juga di layar output? - Sigur
Perhatikan bahwa banyak perintah yang menghasilkan keluaran berwarna, seperti ls dan grep, dukungan --color=auto, yang menghasilkan kode warna hanya jika output standar adalah terminal. - Eliah Kagan


Untuk cron pekerjaan dll Anda ingin menghindari ekstensi Bash. POSIX setara sh operator redirection 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. Itu &> sintaks dipinjam dari csh yang seharusnya sudah meyakinkanmu bahwa itu ide yang buruk.


1
2018-04-11 12:25





some_command | tee command.log dan some_command > command.log memiliki masalah bahwa mereka tidak menyimpan output perintah ke command.log file secara real-time.

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


Contoh:

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

Asumsi log.py mengandung:

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

kamu bisa berlari unbuffer python log.py | tee command.log atau unbuffer python log.py > command.log

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


0
2017-07-04 20:54



Mereka menyimpan output saat mereka menerimanya, masalahnya adalah python yang mengaktifkan buffering ketika outputnya bukan ke TTY. Pilihan lain untuk menonaktifkan ini dengan Python: stackoverflow.com/q/107705/2072269 - muru