bash сохранить историю без выхода

В Linux Ubuntu Баш терминала. Есть ли способ сохранить историю Bash без записи выхода? я установил конфигурацию "HISTCONTROL=erasedups"

который на мой взгляд работает лучше, чем ignoredups.

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

напоминание: http://www.thegeekstuff.com/2008/08/15-examples-to-master-linux-command-line-history/

4 ответа

История Баш

Любые новые команды, которые были введены в активном терминале, могут быть добавлены к .bash_history файл с помощью следующей команды:

history -a

Единственная сложная для понимания концепция - каждый терминал имеет свой собственный список истории bash (загруженный из .bash_history файл при открытии терминала)

Если вы хотите извлечь любую новую историю, которая была написана другими терминалами во время жизни этого активного терминала, вы можете добавить содержимое .bash_history файл в список активной истории bash

history -c;history -r

Это очистит текущий список истории, поэтому мы не получим повторный список и добавим файл истории в (теперь пустой) список.

Решение

Вы можете использовать переменную bash PROMPT_COMMAND подавать команду с каждым новым приглашением (каждый раз, когда вы нажимаете ввод в терминале)

export PROMPT_COMMAND='history -a'

Это запишет каждую команду в файл истории по мере ее поступления.

Результат

Теперь любой новый терминал, который вы открываете, будет иметь историю других терминалов без необходимости exit эти другие терминалы. Это мой любимый рабочий процесс.

Больше точности

Допустим (по какой-то причине) у вас есть два терминала, которые вы используете одновременно, и вы хотите, чтобы история отражалась между ними для каждой новой команды.

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

Основным недостатком здесь является то, что вам может потребоваться нажать Enter, чтобы повторно запустить PROMPT_COMMAND, чтобы получить последнюю историю из противоположного терминала.

Вы можете понять, почему этот более точный вариант, вероятно, излишний, но он подходит для этого варианта использования.

Чтобы сохранить историю Bash в файл:

history -w ~/history.txt
vim ~/history.txt

Он экспортирует историю в файл с именем history.txt. Затем вы можете просмотреть его в своем любимом редакторе.

Ответ скопирован с http://tech.karbassi.com/2007/01/14/view-and-change-bash-history/

Существует способ сохранить всю историю Bash в отдельном файле, но если вы пытаетесь использовать механизм истории, и по какой-то причине он не сохраняет всю историю, это другая проблема.

Сохранять всю свою историю в отдельный файл всегда, независимо от того, что происходит с терминалом

Сценарий, представленный здесь, делает свое дело.

# 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

У меня естьtmuxсеансы, которые длятся несколько дней, и мне бы хотелось, чтобы их истории сохранялись, но простойhistory -aбудет смешивать разные истории при одновременном использовании нескольких терминалов.

Альтернативой использованию разных файлов является их периодическое сохранение, чтобы, по крайней мере, их история была в некоторой степени организована в непрерывные блоки N+ минут. Приведенная ниже функция будет добавляться в историю каждые 15 минут использования, поэтому история становится более последовательной при частом переключении терминалов.

      # Append to bash history every few minutes - called from PROMPT_COMMAND
function append_history_periodically() {

    # update history every 15 minutes
    _BASH_UPDATE_PERIOD_SEC=$((15 * 60))

    if [ -z "${_BASH_HIST_LAST_UPDATE}" ]; then
        # time tracking not set - save current timestamp and return
        _BASH_HIST_LAST_UPDATE="$(date +%s)"
        return
    fi

    _BASH_NOW="$(date +%s)"
    _BASH_TIME_DIFF="$((_BASH_NOW - _BASH_HIST_LAST_UPDATE))"

    # append history and reset _BASH_HIST_LAST_UPDATE
    if [ "${_BASH_TIME_DIFF}" -gt "${_BASH_UPDATE_PERIOD_SEC}" ]; then
        history -a
        _BASH_HIST_LAST_UPDATE="${_BASH_NOW}"
    fi

    unset _BASH_TIME_DIFF
    unset _BASH_NOW

}
      PROMPT_COMMAND='append_history_periodically'
Другие вопросы по тегам