bashは終了せずに履歴を保存します


16

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-130


パテから端末にリモートアクセスする場合、終了時にウィンドウを閉じる:alwaysを選択するオプションがあります。履歴を保存してくれます。
ColacX 14

回答:


34

バッシュの歴史

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

history -a

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

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

history -c;history -r

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

解決

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

export PROMPT_COMMAND='history -a'

これにより、発行された各コマンドが履歴ファイルに記録されます。

結果

これで、新しいターミナルを開くと、他のターミナルを使用しなくても、他のターミナルの履歴が保持されexitます。これは私の好みのワークフローです。

より高い精度

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

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

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

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


これは適切なワークフローにとってとても素晴らしいことです....
マット


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シグナルが関係します

  • SIGTERM、SIGINT、SIGQUIT:Bashが対話モードでこれらの信号の1つを受信したときのデフォルトの動作は、それを無視することです。したがって、おそらくそうではありません。

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

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

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

Unixの質問6332

GNU Bashマニュアルで対話式に履歴を使用する

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.