複数のターミナルウィンドウでbashの履歴を保存する

644
2010.08.26

私は常に複数の端末を開いています。 2から10までのどこでも、さまざまなビットとボブを実行します。ここで、再起動して別の端末セットを開いたとしましょう。特定のことを覚えている人もいれば、忘れている人もいます。

私は次のような歴史が欲しいです:

  • すべての端末からすべてを覚えています
  • すべてのターミナルから即座にアクセス可能である(例えば1におけるI ls場合は、別のスイッチは、端末すでに実行しているし、その後まで押し、lsショーアップ)
  • コマンドの前にスペースがある場合は、コマンドを忘れないでください。

bashをそのように機能させるために私にできることはありますか?

回答
1
2021.12.28

私はsqliteデータベースを開始することにしました。私にとっては、長いコマンドを再作成する必要があることにうんざりしています。これは単なる概要ですが、あなたの正確な質問に簡単に応えることができると思います。

 #!/usr/bin/env bash
# drop in bashrc
# bash history in sqlite, i hate losing commands
# run bh to see recent history
#
function create_db() (
    sqlite3 ~/.bash_db  ";" || return

    sqlite3 ~/.bash_db "CREATE TABLE commands( \
        id INTEGER PRIMARY KEY AUTOINCREMENT, \
        last_used INTEGER, \
        command TEXT NOT NULL UNIQUE );" 2>/dev/null || true

    sqlite3 ~/.bash_db "CREATE UNIQUE INDEX index_command ON commands(command);" 2>/dev/null || true
    sqlite3 ~/.bash_db "CREATE UNIQUE INDEX index_last_used ON commands(last_used);" 2>/dev/null || true
)

function update_history() {
    LAST=`builtin history 1|awk -F' ' '{for (i=2; i<=NF; i++) printf "%s ",$i}'`
    DATE=$(date +%s)
    sqlite3 ~/.bash_db "UPDATE commands SET last_used='$DATE' WHERE command='$LAST';"
    sqlite3 ~/.bash_db "INSERT OR IGNORE INTO commands (last_used, command) VALUES ('$DATE', '$LAST' );"
}

function bh(){
    sqlite3 ~/.bash_db "SELECT * FROM commands ORDER BY last_used DESC LIMIT 50;"
}

create_db
PROMPT_COMMAND="update_history; $PROMPT_COMMAND"