GNU/Linux >> Belajar Linux >  >> Linux

Perilaku riwayat bash yang aneh saat menjalankan beberapa sesi

Solusi 1:

Untuk memahami perilaku riwayat bash terlebih dahulu, Anda harus mengetahui hal berikut:

  1. Ada riwayat di file riwayat.
  2. Ada riwayat dalam memori proses bash.
  3. Riwayat dalam memori satu proses bash tidak disinkronkan dengan riwayat dalam memori proses bash lainnya.
  4. Riwayat dalam memori proses bash tidak disinkronkan dengan riwayat dalam file, kecuali diminta secara eksplisit ke atau selama peristiwa tertentu (lihat di bawah).

Menggunakan pengaturan default, siklus hidup sesi bash sehubungan dengan riwayatnya adalah sebagai berikut:

  1. Selama startup, bash akan membaca file histori. Konten file histori sekarang ada di memori proses bash.
  2. Selama penggunaan normal, hanya histori dalam memori yang dimanipulasi.
  3. Selama penonaktifan, riwayat dalam memori ditulis ke file riwayat, menimpa konten sebelumnya dari file riwayat.

Perilaku yang tampaknya nondeterministik yang Anda amati sebagian besar karena konten file riwayat selalu merupakan riwayat sesi bash terakhir yang ditutup, dan bash hanya membaca file riwayat selama startup.

Baca manual bash untuk penjelasan lebih detail tentang proses startup dan shutdown.

Perhatikan bahwa dengan pengaturan default yang saya maksud adalah pengaturan default dari bash. Distribusi Anda mungkin menyediakan .bashrc (atau /etc/bash.bashrc ) yang mengubah perilaku ini.

Dengan mengaktifkan opsi shell histappend Anda dapat memberi tahu bash untuk menambahkan alih-alih menimpa file riwayat. Anda dapat mengaktifkan histappend menggunakan perintah shopt -s histappend . Agar opsi ini selalu diaktifkan, Anda harus meletakkan perintah di .bashrc Anda (atau file inisialisasi lainnya). Baca selengkapnya tentang shopt perintah dalam bash manual

Perhatikan bahwa mengaktifkan histappend tidak akan banyak mengurangi perilaku yang tampaknya tidak deterministik. Ini karena setiap sesi bash masih memiliki riwayatnya sendiri di memori. Dimungkinkan untuk memiliki riwayat bash yang sebagian besar tersinkronisasi. Ada panduan cara membuat setiap proses bash memiliki sebagian besar riwayat yang disinkronkan di utas pada stack overflow.

menggunakan perintah bawaan history Anda dapat secara eksplisit memberi tahu bash untuk membaca riwayat dari file ke memori, atau menulis dari memori ke file. Misalnya:history -r akan membaca konten file dan menambahkannya ke riwayat di memori. history -w akan menulis riwayat saat ini dari memori ke file, menimpa konten sebelumnya. Ini pada dasarnya adalah apa yang terjadi selama shutdown. Baca selengkapnya tentang history perintah dalam bash manual

Untuk kelengkapan, berikut adalah daftar variabel internal yang mengubah perilaku histori:

  • HISTFILE :file untuk membaca dan menulis sejarah.
  • HISTFILESIZE :jumlah baris maksimum untuk file riwayat.
  • HISTSIZE :jumlah baris maksimum untuk riwayat di memori.
  • HISTCONTROL , HISTIGNORE , HISTTIMEFORMAT :tidak relevan untuk diskusi ini. Baca manual bash untuk detailnya.

Solusi 2:

http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively

Anda mungkin dapat memanipulasi bagaimana file riwayat ditulis dengan salah satu terminal, yaitu, jalankan "history -a" atau "history -w" di terminal yang ingin Anda simpan riwayatnya, lalu "history -r" di terminal lainnya. Tergantung pada apa yang ingin Anda lakukan.


Linux
  1. Cara Menghapus Riwayat Bash di Linux

  2. Mencegah skrip bash berjalan secara bersamaan

  3. Mengapa Bash Prompt Disadap Saat Saya Menelusuri Riwayat??

  1. .bash_profile Tidak Bersumber Saat Menjalankan Su?

  2. Perbarui Riwayat Bash Di Terminal Lain Saat Keluar dari Satu Terminal?

  3. Konfirmasi Otomatis Saat Menjalankan Skrip Bash?

  1. Cara menggunakan perintah riwayat Bash

  2. Bagaimana cara menyimpan riwayat bash saya di seluruh sesi?

  3. Memeriksa Banyak Port Saat Menjalankan NetCat (nc)