Баш зберегти історію без виходу


16

в bash-терміналі linux ubuntu. чи є спосіб зберегти історію баш без запису виходу? я встановив конфігурацію на "HISTCONTROL = стирання"

що, на мій погляд, працює краще, ніж ігнорування.

у будь-якому випадку чомусь не буде збережено останні кілька команд у терміналі bash, якщо я не введу "exit". Я звик просто натискати на хрестик у вікні терміналу, тому мене завжди дратує те, що останні команди не були збережені під час перегляду.

нагадування: http://www.thegeekstuff.com/2008/08/15-examples-to-master-linux-command-line-history/#more-130


при віддаленому доступі до терміналу з шпаклівкою є можливість вибору закритого вікна при виході: завжди. що зберігає історію для мене.
ColacX

Відповіді:


35

Історія башів

Будь-які нові команди, що були видані в активному терміналі, можуть бути додані до .bash_historyфайлу за допомогою наступної команди:

history -a

Єдина хитра концепція, яку потрібно зрозуміти, це те, що кожен термінал має свій список історії баш (завантажується з .bash_historyфайлу, коли ви відкриваєте термінал)

Якщо ви хочете витягнути будь-яку нову історію, записану іншими терміналами протягом життя цього активного терміналу, ви можете додати вміст .bash_history файлу до активного списку історії bash

history -c;history -r

Це очистить поточний список історії, щоб ми не отримали повторного списку, і додамо файл історії до (тепер порожнього) списку.

Рішення

Ви можете використовувати змінну bash PROMPT_COMMANDдля видачі команди з кожним новим запитом (кожного разу, коли натискаєте клавішу enter у терміналі)

export PROMPT_COMMAND='history -a'

Це запише кожну команду в файл історії по мірі її видачі.

Результат

Тепер будь-який новий термінал, який ви відкриєте, матиме історію інших терміналів, не маючи exitцих інших терміналів. Це мій уподобаний робочий процес.

Більш точність

Скажімо, (чомусь) у вас є два термінали, які ви використовуєте одночасно, і ви хочете, щоб історія відображалася між обома для кожної нової команди.

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

Основний недолік тут полягає в тому, що вам може знадобитися натиснути клавішу Enter, щоб повторно запустити PROMPT_COMMAND, щоб отримати останню історію з протилежного терміналу.

Ви можете зрозуміти, чому цей більш точний варіант, ймовірно, є надмірним, але він працює для цього випадку використання.


це так приголомшливо для правильних робочих процесів ....
мат


1

Там є спосіб зберегти всю історію вашої оргії в окремий файл , але якщо ви намагаєтеся використовувати механізм історії і за якою - то причини він не рятує все історії, що це інше питання.

Щоб зберегти всю свою історію в окремий файл, завжди, незалежно від того, що відбувається з терміналом

Сценарій, наданий тут, робить свою справу.

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

Скажіть команду історії "Збережіть зараз!" при натисканні на X у вікні віртуального терміналу

По-перше, ви повинні зрозуміти, який механізм використовує ваш віртуальний емулятор терміналу, щоб знищити bashпроцес, коли він закінчується? - Це залежатиме від того, який саме емулятор терміналу ви використовуєте.

Є кілька варіантів, і всі вони включають сигнали UNIX .

  • SIGTERM, SIGINT, SIGQUIT: поведінка за замовчуванням, коли Bash отримує один з цих сигналів в інтерактивному режимі, це ігнорувати його, тому, мабуть, це не так.

  • SIGHUP: Цей сигнал звичайно змушує Bash граціозно припинятись та робити очищення, але я не впевнений, що це "очищення" передбачає збереження файлу історії. Мабуть, ні.

  • SIGKILL, SIGSTOP: Неможливо Bash як процес простору користувачів ігнорувати ці сигнали. Ядро може насильно вбивати або зупиняти процес у будь-який час за допомогою цих сигналів. Якщо ваш емулятор VT надсилає одне із них, ми не можемо захопити його та зробити щось перед тим, як вийти, тож вам не пощастить.

Кілька посилань: Питання ServerFault 337123

Питання Unix 6332

Інтерактивне використання історії в посібнику GNU Bash

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.