lokasi file histori keluaran bash shell

13

Di mana bash shell menyimpan sesi terminal yang sebenarnya? Saya ingin membaca output dari perintah yang saya gunakan sebelumnya. Yang bisa saya temukan di googling adalah bagaimana cara menyimpan output dari sebuah perintah.

Karena output ditampilkan di layar, toh harus disimpan di suatu tempat. Jadi pertanyaan saya adalah: di mana?

Daniel Böckenhoff
sumber

Jawaban:

11

Bash hanya menyimpan histori dari perintah yang Anda jalankan (yang dapat Anda ambil dengan mengetik history). Kecuali Anda telah mengatur scroll-back ke angka yang sangat tinggi, tidak ada cara untuk melihat output yang lebih tua dari nilai yang ditetapkan scroll-back. Menetapkan nilai ini ke angka yang sangat tinggi akan membuat gulungan Anda lamban karena garis disimpan dalam memori .

Untuk menyimpan perintah masa depan Anda dan hasilnya, ada beberapa opsi:

Menggunakan screen

Mulai sesi layar dengan memasukkan screen. Setelah Anda berada di dalam layar, tekan Ctrl- a, lalu :, lalu masukkan log. Semua I / O akan ditangkap dalam screenlogfile di direktori tempat Anda memulai screenperintah.

Menggunakan script

Anda bisa mulai dengan mengetik script. Sebuah naskah sesi akan mulai yang akan menangkap semua I / O untuk sebuah file bernama typescript. Anda dapat keluar dari scriptsesi dengan Ctrl- d dan melihat log dalam typescriptfile.

Menggunakan tee

tee adalah alat yang berguna. Anda dapat melakukan sesuatu seperti ini:

$ bash | tee log.txt

Ini akan membuka bash shell baru di dalam yang sudah Anda jalankan. Ketika Anda exitkeluar dari ini, Anda dapat melihat output dalam file yang disebutlog.txt

Cara lain

Seperti yang disarankan Dustin Kirkland di pos ini , Anda juga dapat menggunakan byobu . Meskipun, saya belum pernah menggunakan, alat screencasting terminal seperti Shelr juga terdengar seperti opsi.

Ron
sumber
6

Ada banyak pertanyaan yang terkait dengan ini, tetapi semuanya dimulai dengan asumsi (kanan) bahwa output tidak dicatat.

Jadi pertanyaan saya adalah: di mana?

Tidak ada tempat: keluaran Bash (dan semua shell lain yang saya ketahui) tidak masuk.

Karena output ditampilkan di layar, toh harus disimpan di suatu tempat.

Memang, tetapi kemungkinan besar tidak dalam teks biasa dan bahkan tidak pada disk (meskipun ini benar-benar sampai ke emulator terminal): kemungkinan besar, dan setidaknya dalam kebanyakan kasus, dalam segmen memori yang dialokasikan oleh emulator terminal.

Namun yang pasti itu tidak masuk ke file, setidaknya tidak oleh shell, dan saya tidak tahu terminal emulator yang mencatat output ke file secara default.

Memang ini tidak berarti tidak mungkin untuk mencatat keluaran terminal: pertama saya akan menyebutkan sesuatu yang saya pikir tidak banyak yang tahu, karena saya belum pernah melihat ada yang menyebutkan ini setidaknya di sini di Ask Ubuntu: Konsole memungkinkan untuk menyimpan scrollback ke file (mungkin ada emulator terminal lain yang menyediakan fungsi seperti itu, Konsole adalah satu-satunya yang saya tahu), meskipun ini dibatasi oleh batas ukuran scrollback Konsole.

Ini sering kali tidak terlalu berguna, dan kemungkinan besar Anda ingin melihat solusi yang "tepat" untuk mencatat seluruh output sesi ke file ( Bagaimana cara mencatat semua input dan output dalam sesi terminal? Dan jawaban Ron ).

kos
sumber
1

Ada perintah bernama script, jika tidak diinstal maka apt-get install scriptakan melakukannya.

Kemudian di terminal ketikkan saja skrip.

dan lakukan apa yang Anda inginkan, setelah Anda selesai ketik saja keluar dan kemudian akan ada file yang dibuat di direktori Anda saat ini dengan semua informasi stdout dan stdin.

semoga membantu anda.

rɑːdʒɑ
sumber
Paket adalah NA di ubuntu 18.04
markroxor
1

Ini tidak ada hubungannya dengan shell Anda ( bash), ini bukan fitur emulator terminal yang Anda gunakan. Itu disimpan di "buffer scrollback" terminal Anda. Saya belum dapat menemukan penjelasan yang jelas tentang di mana tepatnya ini disimpan, tetapi pengalaman pribadi telah menunjukkan kepada saya bahwa itu disimpan di suatu tempat di /tmp.

Seperti yang disarankan oleh jawaban pertanyaan di atas, kemungkinan besar disimpan dalam file tanpa nama. Untuk melihat apa yang saya maksud, buka file baru dengan editor teks:

gedit newfile

Tulis satu baris teks ke file dan simpan. Sekarang, ketika file itu masih terbuka, buka terminal dan hapus itu:

rm newfile

Karena file tersebut masih terbuka gedit, Anda dapat terus menulisnya. Anda bahkan dapat menulis beberapa gigabytes data ke dalamnya, terlepas dari kenyataan bahwa file tersebut telah dihapus. Itu karena menghapus file cukup menghilangkan tautan yang menunjuk ke inode -nya . Jika deskriptor file -nya dipegang terbuka oleh program lain, data dapat ditulis untuknya, terlepas dari kenyataan bahwa tidak ada lagi tautan (file) aktual yang sesuai dengan deskriptor file pada sistem file.

Semua ini untuk mengatakan bahwa riwayat terminal Anda mungkin disimpan menggunakan trik seperti itu, di suatu tempat di file yang dihapus /tmp. Apa yang sebenarnya Anda inginkan adalah meningkatkan ukuran buffer scrollback terminal emulator Anda sehingga Anda dapat menggulir ke atas dan melihatnya. Rincian cara melakukan ini bergantung pada emulator terminal yang Anda gunakan. Sebagian besar memiliki saklar baris perintah yang memungkinkan Anda dan ini banyak juga yang memiliki cara GUI untuk mengaturnya. Misalnya, dalam gnome-terminal(default pada Ubuntu) itu Edit -> Preferences -> Profil --- klik pada profil Anda -> Edit -> Scrolling -> Batasi scrollback ke NNN:

Layar opsi gnome-terminal

terdon
sumber
Wawasan yang menarik. Memeriksa sejarah yang lebih panjang di terminal bukan yang saya inginkan: Saya ingin memiliki akses ke cout ke terminal yaitu semua yang telah ditulis di sana DARI EG PYTHON
Daniel Böckenhoff
@ DanielBöckenhoff maka Anda mungkin ingin scriptseperti yang dijelaskan dalam jawaban yang diterima.
terdon
Tentu. Saya menerimanya :)
Daniel Böckenhoff
-2

Sesi terminal disimpan dalam .bash_historyfile. Masukkan ini di terminal Anda echo $HISTFILE, ini akan memberi Anda path .bash_historyfile.

pengguna532036
sumber
2
Ini hanya memberikan perintah yang dijalankan sebelumnya , bukan output dari perintah.
Ron