bash simpan riwayat tanpa keluar


16

di linux ubuntu bash terminal. apakah ada cara untuk menyimpan bash history tanpa menulis keluar? saya telah mengatur konfigurasi ke "HISTCONTROL = erasedups"

yang menurut saya bekerja lebih baik daripada yang diabaikan.

Bagaimanapun juga karena suatu alasan ia tidak akan menyimpan beberapa perintah terakhir di terminal bash kecuali jika saya mengetik "keluar". Saya terbiasa mengklik saja salib pada jendela terminal, jadi saya selalu kesal bahwa perintah terakhir tidak disimpan ketika saya login kembali.

pengingat: http://www.thegeekstuff.com/2008/08/15-examples-to-master-linux-command-line-history/#more-130


ketika remote mengakses terminal dari dempul ada opsi untuk memilih tutup jendela saat keluar: selalu. yang menyimpan sejarah untukku.
ColacX

Jawaban:


34

Bash History

Perintah baru apa pun yang telah dikeluarkan di terminal aktif dapat ditambahkan ke .bash_historyfile dengan perintah berikut:

history -a

Satu-satunya konsep rumit yang perlu dipahami adalah bahwa setiap terminal memiliki daftar riwayat bash sendiri (diambil dari .bash_historyfile ketika Anda membuka terminal)

Jika Anda ingin menarik riwayat baru apa pun yang telah ditulis oleh terminal lain selama masa aktif terminal aktif ini, Anda dapat menambahkan konten .bash_history file ke daftar riwayat bash aktif.

history -c;history -r

Ini akan menghapus daftar riwayat saat ini sehingga kami tidak mendapatkan daftar berulang, dan menambahkan file riwayat ke daftar (sekarang kosong).

Larutan

Anda dapat menggunakan variabel bash PROMPT_COMMANDuntuk mengeluarkan perintah dengan setiap prompt baru (setiap kali Anda menekan enter di terminal)

export PROMPT_COMMAND='history -a'

Ini akan mencatat setiap perintah ke file riwayat saat dikeluarkan.

Hasil

Sekarang setiap terminal baru yang Anda buka akan memiliki sejarah terminal lain tanpa harus ke exitterminal lain tersebut. Ini adalah alur kerja pilihan saya.

Lebih Presisi

Katakanlah (karena alasan tertentu) Anda memiliki dua terminal yang Anda gunakan secara bersamaan dan Anda ingin histori mencerminkan antara keduanya untuk setiap perintah baru.

export PROMPT_COMMAND='history -a;history -c;history -r'

Kelemahan utama di sini adalah Anda mungkin perlu menekan enter untuk menjalankan kembali PROMPT_COMMAND untuk mendapatkan sejarah terbaru dari terminal yang berlawanan.

Anda dapat melihat mengapa opsi yang lebih tepat ini mungkin berlebihan, tetapi berfungsi untuk kasus penggunaan itu.


ini sangat mengagumkan untuk alur kerja yang tepat ....
matt


1

Ada adalah cara untuk menyimpan semua bash sejarah Anda ke file terpisah , tetapi jika Anda mencoba untuk menggunakan mekanisme sejarah dan untuk beberapa alasan itu tidak menyimpan semua sejarah Anda, itu adalah masalah yang berbeda.

Untuk menyimpan semua riwayat Anda ke file terpisah, selalu, apa pun yang terjadi pada terminal

Sebuah skrip yang disediakan di sini berguna.

# don't put duplicate lines in the history. See bash(1) for more options
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth

# set the time format for the history file.
export HISTTIMEFORMAT="%Y.%m.%d %H:%M:%S "

# If this is an xterm set the title to user@host:dir
case "$TERM" in
  xterm*|rxvt*)
  # Show the currently running command in the terminal title:
  # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
  show_command_in_title_bar()
  {
    case "$BASH_COMMAND" in
      *\033]0*)
      # The command is trying to set the title bar as well;
      # this is most likely the execution of $PROMPT_COMMAND.
      # In any case nested escapes confuse the terminal, so don't
      # output them.
      ;;
      *)
      if test ! "$BASH_COMMAND" = "log_bash_eternal_history"
      then
        echo -ne "\033]0;$(history 1 | sed 's/^ *[0-9]* *//') :: ${PWD} :: ${USER}@${HOSTNAME}\007"
      fi
      ;;
    esac
  }
  trap show_command_in_title_bar DEBUG
  ;;
  *)
  ;;
esac

log_bash_eternal_history()
{
  local rc=$?
  [[ $(history 1) =~ ^\ *[0-9]+\ +([^\ ]+\ [^\ ]+)\ +(.*)$ ]]
  local date_part="${BASH_REMATCH[1]}"
  local command_part="${BASH_REMATCH[2]}"
  if [ "$command_part" != "$ETERNAL_HISTORY_LAST" -a "$command_part" != "ls" -a "$command_part" != "ll" ]
  then
    echo $date_part $HOSTNAME $rc "$command_part" >> ~/.bash_eternal_history
    export ETERNAL_HISTORY_LAST="$command_part"
  fi
}

PROMPT_COMMAND="log_bash_eternal_history"

Untuk memberi tahu perintah sejarah "Simpan sekarang!" ketika mengklik X pada jendela terminal virtual

Pertama yang harus Anda pahami adalah, mekanisme apa yang digunakan emulator terminal virtual Anda untuk mematikan bashproses ketika keluar? - Ini tergantung pada emulator terminal yang Anda gunakan.

Ada beberapa opsi, dan semuanya melibatkan sinyal UNIX .

  • SIGTERM, SIGINT, SIGQUIT: Perilaku default ketika Bash menerima salah satu sinyal ini dalam mode interaktif adalah mengabaikannya, jadi mungkin bukan itu.

  • SIGHUP: Sinyal ini biasanya menyebabkan Bash berhenti dengan anggun dan melakukan pembersihan, tapi saya tidak yakin apakah "pembersihan" itu melibatkan penyelamatan file sejarah. Mungkin tidak.

  • SIGKILL, SIGSTOP: Tidak mungkin bagi Bash sebagai proses userspace untuk mengabaikan sinyal-sinyal ini. Kernel dapat secara paksa membunuh atau menghentikan proses kapan saja menggunakan sinyal-sinyal ini. Jika emulator VT Anda mengirimkan salah satu dari ini, kami tidak dapat menjebaknya dan melakukan sesuatu sebelum keluar, sehingga Anda kurang beruntung.

Beberapa referensi: Pertanyaan ServerFault 337123

Unix pertanyaan 6332

Menggunakan History Interactively di manual GNU Bash

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.