GNU/Linux >> Belajar Linux >  >> Linux

Bash History:"ignoredups" Dan "erasedups" Mengatur Konflik Dengan Sejarah Umum Di Seluruh Sesi?

Pertama-tama, ini bukan duplikat dari utas yang ada di SE. Saya telah membaca dua utas ini (1, 2) tentang riwayat bash yang lebih baik, tetapi tidak ada jawaban yang berhasil – – ngomong-ngomong, saya menggunakan Fedora 15.

Saya menambahkan yang berikut ini ke .bashrc file di direktori pengguna (/home/aahan/), dan tidak berfungsi. Ada yang punya petunjuk?

HISTCONTROL=ignoredups:erasedups  # no duplicate entries
HISTSIZE=1000                     # custom history size
HISTFILESIZE=100000                 # custom history file size
shopt -s histappend                      # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"  # Save and reload the history after each command finishes

Oke ini yang saya inginkan dengan riwayat bash (prioritas):

  • jangan simpan duplikat, hapus yang sudah ada
  • segera bagikan riwayat dengan semua terminal yang terbuka
  • selalu tambahkan riwayat, jangan ditimpa
  • menyimpan perintah multi-baris sebagai satu perintah (yang dinonaktifkan secara default)
  • berapa ukuran default History dan ukuran file history?

Jawaban yang Diterima:

Ini sebenarnya perilaku yang sangat menarik dan saya akui saya sangat meremehkan pertanyaan di awal. Tapi pertama-tama faktanya:

1. Apa yang berhasil

Fungsionalitas dapat dicapai dengan beberapa cara, meskipun masing-masing bekerja sedikit berbeda. Perhatikan bahwa, dalam setiap kasus, agar riwayat “ditransfer” ke terminal lain (diperbarui), seseorang harus menekan Enter di terminal, tempat dia ingin mengambil riwayat.

  • opsi 1:

     shopt -s histappend
     HISTCONTROL=ignoredups
     PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"
    

Ini memiliki dua kelemahan:

  1. Saat login (membuka terminal), perintah terakhir dari file histori dibaca dua kali ke buffer histori terminal saat ini;
  2. Buffer dari terminal yang berbeda tidak tetap sinkron dengan file riwayat.
  • opsi 2:

     HISTCONTROL=ignoredups
     PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
    

(Ya, tidak perlu shopt -s histappend dan ya, itu harus history -c di tengah PROMPT_COMMAND )
Versi ini juga memiliki dua kelemahan penting:

  1. Berkas riwayat harus diinisialisasi. Itu harus berisi setidaknya satu baris tidak kosong (bisa apa saja).
  2. history perintah dapat memberikan keluaran yang salah – lihat di bawah.

[Sunting] “Dan pemenangnya adalah…”

  • opsi 3:

     HISTCONTROL=ignoredups:erasedups
     shopt -s histappend
     PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"
    

Ini sejauh yang didapat. Ini adalah satu-satunya opsi untuk memiliki erasedups dan sejarah umum bekerja secara bersamaan. Ini mungkin adalah solusi akhir untuk semua masalahmu, Aahan.

2. Mengapa opsi 2 sepertinya tidak berhasil (atau:apa yang sebenarnya tidak bekerja seperti yang diharapkan)?

Seperti yang saya sebutkan, masing-masing solusi di atas bekerja secara berbeda. Namun interpretasi yang paling menyesatkan tentang cara kerja setelan berasal dari analisis keluaran history perintah . Dalam banyak kasus, perintah dapat memberikan false keluaran. Mengapa? Karena dieksekusi sebelum urutan history lainnya perintah yang terdapat dalam PROMPT_COMMAND ! Namun, saat menggunakan opsi kedua atau ketiga, seseorang dapat memantau perubahan .bash_history konten (menggunakan watch -n1 "tail -n20 .bash_history" misalnya) dan lihat apa sejarah sebenarnya.

Terkait:Mengapa output tegangan generator sinyal berubah dengan pengaturan frekuensinya?

3. Mengapa opsi 3 sangat rumit?

Semuanya terletak pada cara erasedups bekerja. Seperti yang dinyatakan oleh bash manual, “(…) erasedups menyebabkan semua baris sebelumnya yang cocok dengan baris saat ini dihapus dari daftar riwayat sebelum baris tersebut disimpan” . Jadi inilah yang benar-benar diinginkan OP (dan bukan hanya, seperti yang saya duga sebelumnya, tidak ada duplikat yang muncul secara berurutan ) . Inilah mengapa masing-masing history -. perintah harus atau tidak boleh ada di PROMPT_COMMAND :

  • history -n memiliki berada di sana sebelum history -w untuk membaca dari .bash_history perintah yang disimpan dari terminal lain,

  • history -w memiliki berada di sana untuk menyimpan riwayat baru ke file setelah bash memeriksa apakah perintahnya adalah duplikat,

  • history -a tidak boleh ditempatkan di sana alih-alih history -w , karena itu akan menambahkan ke file perintah baru, terlepas dari apakah itu dicentang sebagai duplikat.

  • history -c juga dibutuhkan karena mencegah pengrusakan buffer riwayat setelah setiap perintah,

  • dan terakhir, history -r dibutuhkan untuk memulihkan buffer histori dari file, sehingga akhirnya membuat histori dibagikan di seluruh sesi terminal.

Ketahuilah bahwa solusi ini akan mengacaukan urutan riwayat dengan meletakkan semua riwayat dari terminal lain di depan perintah terbaru yang dimasukkan di terminal saat ini. Itu juga tidak menghapus baris duplikat yang sudah ada di file riwayat kecuali Anda memasukkan perintah itu lagi.


Linux
  1. Menggunakan pengubah kata dengan riwayat Bash di Linux

  2. Cara menangkap sesi terminal dan output dengan perintah skrip Linux

  3. temukan dan salin file menggunakan Bash

  1. Menambahkan stempel waktu ke nama file dengan mv di BASH

  2. gema teks dengan baris baru di bash

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

  1. Jadikan riwayat Bash lebih bermanfaat dengan kiat-kiat ini

  2. Cara memprogram dengan Bash:Sintaks dan alat

  3. Apa sebenarnya <() di bash (dan =() di zsh)?