web-dev-qa-db-ja.com

終了せずに履歴を保存する

linux ubuntu bashターミナルで。 exitを書かずにbashの履歴を保存する方法はありますか?設定を「HISTCONTROL = erasedups」に設定しました

私の意見では、ignoredupsよりもうまく機能します。

とにかく、何らかの理由で、「exit」と入力しない限り、bashターミナルに最後のいくつかのコマンドを保存しません。ターミナルウィンドウの[×]をクリックするのに慣れているので、最後にログインしたときに最後のコマンドが保存されなかったことにいつも悩まされています。

リマインダー: http://www.thegeekstuff.com/2008/08/15-examples-to-master-linux-command-line-history/#more-1

16
ColacX

バッシュ履歴

アクティブなターミナルで発行された新しいコマンドは、次のコマンドを使用して.bash_historyファイルに追加できます。

history -a

理解する唯一のトリッキーな概念は、各ターミナルに独自のbash履歴があることですlist(ターミナルを開いたときに.bash_historyファイルからロードされます)

このアクティブな端末の存続期間中に他の端末によって書き込まれた新しい履歴をプルしたい場合は、.bash_historyfileの内容をアクティブなbash履歴に追加できますリスト

history -c;history -r

これにより、現在の履歴リストがクリアされるため、繰り返しリストが取得されず、履歴ファイルが(現在は空の)リストに追加されます。

ソリューション

Bash変数Prompt_COMMANDを使用して、新しいプロンプトごとにコマンドを発行できます(ターミナルでEnterキーを押すたびに)

export Prompt_COMMAND='history -a'

これにより、各コマンドが発行されたときに履歴fileに記録されます。

結果

これで、新しい端末を開いたときに、他の端末の履歴を保持できます。他の端末をexitする必要はありません。これは私の好みのワークフローです。

より高い精度

(何らかの理由で)同時に使用している2つの端末があり、新しいコマンドごとに履歴を両方の間で反映させたいとします。

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

ここでの主な欠点は、反対の端末から最新の履歴を取得するために、Enterキーを押してPrompt_COMMANDを再実行する必要がある場合があることです。

このより正確なオプションがおそらくやり過ぎである理由がわかりますが、それはそのユースケースで機能します。

36
asyncopation

Bash履歴をファイルに保存するには:

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

履歴をhistory.txtというファイルにエクスポートします。その後、お気に入りのエディターを使用して表示できます。

http://tech.karbassi.com/2007/01/14/view-and-change-bash-history/ からコピーされた回答

3
umbersar

すべての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がインタラクティブモードでこれらの信号の1つを受け取ったときのデフォルトの動作はそれを無視することなので、おそらく違います。

  • SIGHUP:この信号は通常、Bashを正常に終了させ、クリーンアップを実行させますが、その「クリーンアップ」が履歴ファイルの保存を伴うかどうかはわかりません。おそらくそうではありません。

  • SIGKILL、SIGSTOP:ユーザー空間プロセスとしてのBashがこれらのシグナルを無視することは不可能です。カーネルは、これらのシグナルを使用していつでも強制的にプロセスを強制終了または停止できます。 VTエミュレーターがこれらのいずれかを送信している場合、それをトラップして終了する前に何かを行うことができないため、あなたは運が悪いです。

いくつかの参照: ServerFaultの質問33712

nixの質問6332

GNU Bashマニュアル)でインタラクティブに履歴を使用する

1
allquixotic