bash保存历史而不退出


16

在linux ubuntu bash终端中。有什么方法可以保存bash历史记录而无需写出口?我已将配置设置为“ HISTCONTROL = erasedups”

我认为这比被忽略的效果更好。

无论如何,由于某种原因,除非我输入“ exit”,否则它不会在bash终端中保存最后几个命令。我习惯于仅单击终端窗口上的叉号,所以我总是很烦恼,当我重新登录时,最后的命令没有保存。

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


从腻子远程访问终端时,可以选择退出时关闭窗口:始终。为我保存了历史。
ColacX

Answers:


35

重击历史

可以.bash_history使用以下命令将在活动终端中发出的所有新命令附加到文件中:

history -a

唯一需要理解的棘手概念是每个终端都有自己的bash历史记录列表.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,以便从对端终端获取最新历史记录。

您会看到为什么这个更精确的选项可能过大,但它适用于该用例。


这对于正确的工作流程来说真是太棒了....
matt


1

一种方法,所有的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 signal

  • SIGTERM,SIGINT,SIGQUIT:当Bash在交互模式下接收到这些信号之一时,默认行为是忽略它,所以可能不是这样。

  • SIGHUP:该信号通常会导致Bash正常终止并进行清理,但是我不确定该“清理”是否涉及保存历史文件。可能没有。

  • SIGKILL,SIGSTOP:作为用户空间进程的Bash不可能忽略这些信号。内核可以使用这些信号随时强制终止或停止该进程。如果您的VT仿真器正在发送其中之一,那么我们将无法捕获它并在退出之前执行某些操作,因此您很不走运。

一些参考: ServerFault问题337123

Unix问题6332

GNU Bash手册中的交互式使用历史记录

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.