セッション間でbash履歴を保持するにはどうすればよいですか?


27

fedora 9を実行しているx86ターゲットで作業しています。

再起動するたびに、履歴が何らかの状態に戻り、再起動前のセッションで行ったコマンドがありません。

再起動前に履歴を更新するには、何を変更する必要がありますか?


彼は、シェルプログラミングに関連する「セッション間でbash履歴を保持するにはどうすればよいですか」と尋ねています。再起動は、シェルを失う劇的な方法です。それだけです。トピックを閉じる必要はありません。
ジョナサンレフラー

良い点-これはおそらくスーパーユーザーに移動する必要があります。
BR

@ジョナサンはい、質問は正解です。私は正確に何を尋ねるべきか分かりませんでした。

セッションの最後ではなく、実行された直後に各コマンドを保存することも役立ちます。これは、2つのセッションを同時に実行している場合、下の行がないと、bashはセッション1(たとえば)が閉じられたときに履歴を保存するためです。セッション1が実行されていて、セッション2内のセッション1の履歴にすぐにアクセスしたい場合、.bashrcファイルに以下の行を追加しない限りアクセスできません。PROMPT_COMMAND = 'history -a'
Abhinav

回答:


16

どの歴史?bash-history?bash履歴を失い、一度に複数のセッションがある場合、各セッションが他のセッションの履歴を上書きしているためです。

おそらく、bashに毎回履歴を上書きするのではなく、履歴に追加するように指示したいでしょう。これを行うには、.bashrcを変更して実行しますshopt -s histappend

また、HISTSIZEを大きな数字にエクスポートすることで、履歴ファイルのサイズを増やすことができます(バイト単位であるため、100000で十分です)。


7
HISTSIZEバイト数ではなく、覚えておくコマンドの数です。
クリスダウン14年

10

私は同じ問題に苦しんでいましたが、私の.bashrcファイルにはすでにshopt -s histappend正しい修正HISTFILEHISTSIZEありましたHISTFILESIZE

私にとって問題は、.bash_historyファイルがユーザー名ではなくルートに所有されているため、ユーザーが終了時にそのファイルに保存できないことでした。


3
rootが所有する.bash_historyでもまったく同じ問題があることがわかりました。素敵な歴史をすべて失う前に気づいたことを願っていますが、気にしないでください:
サムスティーブンス

ここで同じ-さまよえるの数日間終了しました:)ありがとう!
ダヴカ

1
sudo chmod your_user_name .bash_historyそれをやった!ありがとう。
wij

sudo chown user_name:user_name ~.bash_historyそれを解決しました!
アルパース


2

セッションまたはタスクごとに履歴ファイルを設定するためのスクリプトを作成しましたが、これは以下に基づいています。

    # write existing history to the old file
    history -a

    # set new historyfile
    export HISTFILE="$1"
    export HISET=$1

    # touch the new file to make sure it exists
    touch $HISTFILE
    # load new history file
    history -r $HISTFILE

すべての履歴コマンドを保存する必要はありませんが、関心のあるコマンドを保存し、すべてのコマンドを実行するよりも簡単に取得できます。私のバージョンはすべての履歴ファイルもリストし、それらすべてを検索する機能を提供します。

完全なソース:https : //github.com/simotek/scripts-config/blob/master/hiset.sh


1

.bashrcに次のことを実現する行をいくつか書きました:各コマンドの後にすべてのセッションをファイルに保存します。端末を起動したのと同じ数の履歴ファイルがあります。最新の履歴ファイルから新しい端末を起動すると、行カウントのしきい値に達するまで、以前のセッションからのすべての履歴ファイルを履歴バッファにロードします。

HISTCONTROL=''
HISTFOLDER=~/.bash_histories
HISTFILEEXT=history      # only files in $HISTFOLDER with this extension will be read
shopt -s histappend   # append when closing session
mkdir -p $HISTFOLDER
HISTFILE=$HISTFOLDER/$(date +%Y-%m-%d_%H-%M-%S_%N).$HISTFILEEXT  # create unique file name for this session. Nanoseconds seems to be unique enough, try: for ((i=0; i<=10; i++)); do date +%Y-%m-%d_%H-%M-%S_%N; done
# if HISTFILE unset, history is not saved on exit -> not really necessary if we save after each command, but its a double net safety
HISTSIZE=-1       # maximum number of commands to hold inside bash history buffer
HISTFILESIZE=-1   # maximum number of lines in history file
# history -a $HISTFILE # bash saves the total history commands entered since startup or since the last save and saves that amount of commands to the file. This means reading a history file after typing commands will trip up bash, but this won't be a problem if the history file is only loaded in the beginning. This means that only new commands are saved not all the old loaded commands, thereby we can load as many history files into the buffer as we want and still only save newly thereafter typed commands
PROMPT_COMMAND="history -a $HISTFILE; $PROMPT_COMMAND"  # This command is executed after very typed command -> save history after each command instead after only closing the session

# Load old histories from last 5 files/sessions
HISTLINESTOLOAD=2000
# --reverse lists newest files at first
names=($(ls --reverse $HISTFOLDER/*.$HISTFILEEXT 2>/dev/null))
toload=()
linecount=0
# Check if is really file and count lines and only append to $toload if linecount under $HISTLINESTOLOAD
for fname in ${names[*]}; do
    if test -f $fname; then
        linecount=$((linecount+$(wc -l < $fname) ))
        if test $linecount -ge $HISTLINESTOLOAD; then
            break
        fi
        toload+=($fname)
    fi
done
# Beginning with the oldest load files in $toload into bash history buffer
for (( i=${#toload[*]}-1; i>=0; i-- )); do
    history -r ${toload[$i]}
done

0

.bash_historyが存在することを確認します。そうでない場合、bashがコマンド履歴を保存する場所がありません。

.bash_historyが存在しない場合、touchを実行して作成します:

touch ~/.bash_history

これにより、空の.bash_historyファイルがホームディレクトリに作成されます。これはコマンドでいっぱいになり、セッション間で保持されます。


0

Amazon EC2 Ubuntuインスタンスは履歴を保存していませんでした。.bashrc他の回答に記載されているように必要なコマンドがすべてありましたが、欠落していたのはファイルだけでした。動作させるために触らなければなりませんでした。

touch ~/.bash_history

-1

この質問に対する良い答えはこちらです:

http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html


3
SuperUserへようこそ!質問者が外部リンクをクリックする必要がないように、十分な情報を回答に含めてください。また、あなたの答えが単に既存の答えを複製していないことを確認してください(そのリンクを一目見ただけで、それはうまくいっているようです)。
インドレック

//、良い記事のように見えます。しかし、stackexchangeは、少なくとも少しリンク先から独立しようとしていると思います。少し説明を付けてください。
ネイサンバサニーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.