web-dev-qa-db-ja.com

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

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

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

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

30
BЈовић

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

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

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

18
B.R.

私は同じ問題に苦しんでいました-しかし、私の.bashrcファイルにはすでにshopt -s histappendおよびHISTFILEHISTSIZEHISTFILESIZEを修正します。

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

10
icc97

環境変数HISTFILE、HISTSIZE、HISTFILESIZEを調べます。

3

セッションまたはタスクごとに履歴ファイルを設定するためのスクリプトを記述しました。

    # 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

3
simotek

.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
1
mxmlnkn

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

touch ~/.bash_history
0
Chankey Pathak

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

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

touch ~/.bash_history

これは、ホームディレクトリに空の.bash_historyファイルを作成するだけで、コマンドでいっぱいになり、セッション間で持続するはずです。

0
Ray Shah