bash geçmişi kaydetmeden kaydet


16

linux ubuntu bash terminalinde. çıkış yazmadan bash geçmişini kaydetmenin bir yolu var mı? Ben yapılandırmayı "HISTCONTROL = silindi" olarak ayarladım

Bence yok sayılanlardan daha iyi çalışıyor.

neyse nedense ben "exit" yazmazsanız son birkaç komut bash terminali kaydetmek alışkanlık. Ben sadece terminal penceresindeki haç tıklayın alışkınım, bu yüzden her zaman ben yeniden giriş yaparken son komutlar kaydedilmedi rahatsız oldu.

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


terminale macundan uzaktan erişildiğinde, çıkışta her zaman pencereyi kapat seçeneğini seçme seçeneği vardır. bu da benim için tarihi kurtarıyor.
ColacX

Yanıtlar:


35

Bash Geçmişi

Etkin terminalde verilen tüm yeni komutlar .bash_history, aşağıdaki komutla dosyaya eklenebilir :

history -a

Anlaşılması gereken tek zor kavram, her terminalin kendi bash geçmiş listesine sahip olmasıdır ( .bash_historyterminali açtığınızda dosyadan yüklenir )

Bu aktif terminalin ömrü boyunca diğer terminaller tarafından yazılan herhangi bir yeni geçmişi çekmek istiyorsanız, .bash_history dosyanın içeriğini aktif bash geçmişi listesine ekleyebilirsiniz.

history -c;history -r

Bu, geçerli geçmiş listesini temizler, böylece tekrarlanan bir liste almaz ve geçmiş dosyasını (şimdi boş) listeye ekleriz.

Çözüm

PROMPT_COMMANDHer yeni istemle bir komut vermek için bash değişkenini kullanabilirsiniz (terminalde enter tuşuna her bastığınızda)

export PROMPT_COMMAND='history -a'

Bu, her komutu verildikçe geçmiş dosyasına kaydeder .

Sonuç

Şimdi açtığınız yeni terminaller, diğer terminallere gerek kalmadan diğer terminallerin geçmişine sahip olacak exit. Bu benim tercih ettiğim iş akışı.

Daha Hassas

Diyelim ki (bazı nedenlerden dolayı) aynı anda kullandığınız iki terminaliniz var ve geçmişin her yeni komut için her ikisini de yansıtmasını istiyorsunuz.

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

Buradaki ana dezavantaj, karşı terminalden en son geçmişi almak için PROMPT_COMMAND'ı yeniden çalıştırmak için enter tuşuna basmanız gerekebilir.

Bu daha kesin seçeneğin neden aşırıya kaçmış olduğunu görebilirsiniz, ancak bu kullanım durumunda işe yarar.


Bu uygun iş akışları için çok harika ....
matt


1

Orada olan tüm bash geçmişini kaydetmek için bir yol , ayrı bir dosyaya , ancak geçmiş mekanizmasını kullanmaya çalıştığınız ve nedense tüm geçmişiniz tasarrufu değilse, bu farklı bir konudur.

Terminale ne olursa olsun, tüm geçmişinizi ayrı bir dosyaya kaydetmek için

Burada sağlanan bir komut dosyası hile yapar.

# 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"

Geçmiş komutuna "Şimdi kaydet!" sanal terminal penceresindeki X işaretini tıklatırken

Öncelikle anlamanız gereken şey, sanal terminal öykünücünüz, bashçıkarken süreci öldürmek için hangi mekanizmayı kullanıyor ? - Bu, tam olarak kullandığınız terminal emülatörüne bağlı olacaktır.

Birkaç seçenek vardır ve hepsi UNIX sinyallerini içerir .

  • SIGTERM, SIGINT, SIGQUIT: Bash etkileşimli modda bu sinyallerden birini aldığında varsayılan davranış onu yok saymaktır, bu yüzden muhtemelen bu değildir.

  • SIGHUP: Bu sinyal normalde Bash'ın zarif bir şekilde sonlandırılmasına ve temizleme yapmasına neden olur, ancak bu "temizlemenin" geçmiş dosyasını kaydetmeyi içerip içermediğinden emin değilim. Muhtemelen hayır.

  • SIGKILL, SIGSTOP: Bash'in bir kullanıcı alanı süreci olarak bu sinyalleri görmezden gelmesi imkansız. Çekirdek, bu sinyalleri kullanarak herhangi bir zamanda süreci zorla öldürebilir veya durdurabilir. VT emülatörünüz bunlardan birini gönderiyorsa, onu yakalayamaz ve çıkmadan bir şey yapamayız, bu yüzden şansınız kalmaz.

Birkaç referans: ServerFault soru 337123

Unix soru 6332

GNU Bash kılavuzunda Geçmişi Etkileşimli Kullanma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.