新しいシステムを設定するときに古いシステムのbash履歴ファイルを使用しますか?

新しいシステムを設定するときに古いシステムのbash履歴ファイルを使用しますか?

私は私のbashの記録が大好きです。時には非常に長いコマンドを発行することがあり、コマンドをすばやく再開するためにbashの履歴に依存します。次のように記録サイズを増やしました。

HISTSIZE=100000
HISTFILESIZE=200000

私の.bashrcに

私にも次のエイリアスがあります。

alias h='history | tail'
alias hg='history | grep'

これにより、次のことができますhhg some_text本物便利

私の質問は:この履歴ファイルを新しいコンピュータに移動できますか?たとえば、最近私のコンピュータがクラッシュして再構築する必要がありました。他の.historyファイルを入れるのに問題があります(既存のファイルを置き換えることもできます)。これを置き換える必要がありますか、実際には問題なく2つの履歴ファイルを一緒に追加できますか?

答え1

はい。古い履歴ファイルを新しいインストールにコピーできます。古い/新しいアイテムとマージすることもできます。

  • 履歴ファイルが設定されていない場合は、HISTTIMEFORMATコマンドのみが保存されます。
  • 設定されている場合、各コマンドにはハッシュの前にタイムスタンプがあります。

    #1122334455
    command1
    #1122334459
    command2
    

ただし、たとえば発行する場合は、次の点に注意してください。

$ echo 'foo
> bar
> baz' >> some_file

次のように保存されます。

#1122334459
echo 'foo
bar
baz' >> some_file

ただし、history次のように表示されます。

4 CMD_TIME echo 'foo
5 CUR_TIME bar
6 CUR_TIME baz' >> some_file

コマンドは次のとおりです。

$ foo | \
bar | \
baz

設定すると1つのままになりますshopt -s cmdhist


私は次のようにさまざまですが、よく使用されるものを使用します。

HISTSIZE=500000
HISTFILESIZE=500000
# Ignore dupes and space commands
HISTCONTROL=ignoreboth
# Save and show timestamps
HISTTIMEFORMAT='%F %T '
# append to the history file, don't overwrite it
shopt -s histappend
# Save and reload the history after each command finishes
# This one I have a function to turn on/off. Effect is that commands are
# accessible in all terminals after execution.
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

また、定期的に履歴ファイルをバックアップし、いくつかのスクリプトとエイリアスを使用して履歴を取得します。数年前の記録も同様です。たまに1年半前に今やっていることと似たようなことをした記憶が出てすぐにその履歴を探すことができる。

タイムスタンプには2つのバリエーションを使用します。一時的に「」に設定してhistoryタイムスタンプのあるコンテンツを表示し、タイムスタンプのない他のディスプレイを表示します。HISTTIMEFORMAT


タイムスタンプがない場合は、現在の時間(およそ)が使用されます。タイムスタンプがあると、履歴は時間でソートされます。

したがって:

.bash_history(単純化されたタイムスタンプ)

#timestamp 000012
some command
#timestamp 000002
some other command

$ history
1 13 aug 2013 10:44 some other command
2 13 aug 2013 12:13 some command

しかし、ソートされた履歴ファイルがより効率的であると信じる理由があります(bashは混在する必要はありません)。


検索はCtrl-Rしばしば便利です。その他については、以下をご覧ください。記録を操作するコマンドイベントインジケータいくつかのその他のコマンドなど。

答え2

私の考えでは問題なくファイルを移動したり追加したりできます。

追加:

cd ~
mv .bash_history .bash_history_new
cp /mnt/oldfs/home/olduser/.bash_history ~/
cat .bash_history_new >> .bash_history

問題が発生した場合は、以下をキャンセルできます。

mv .bash_history_new .bash_history

答え3

Myは.bash_history通常シンボリックリンクです/dev/null(つまり、私の履歴はディスクに保存されません)。したがって、シェルを起動すると、アクセスする履歴はありません。 しかし、、記録は蓄積されます。つまり、bashは履歴ファイルではなくメモリでこれを行います。実際man bash(下)歴史):

起動時の履歴は、HISTFILE変数(デフォルトは〜/ .bash_history)という名前のファイルで初期化されます。 [...]履歴ファイルを読み取ると、記録コメント文字で始まり、後に数字が続く行は、以前の履歴行のタイムスタンプとして解釈されます。これらのタイムスタンプは、HISTTIMEFORMAT変数の値に応じてオプションで表示できます。対話型シェルが終了すると、最後の $HISTSIZE 行が履歴リストから $HISTFILE にコピーされます。

タイムスタンプに関する部分は、見たら履歴ファイルの形式(通常のテキストリストです)を説明するのに役立つので残しました。ここで重要なのは、履歴ファイルがシェルの最初の起動時にのみ使用され、次に終了するときに再利用されることです(最も最近の履歴を追加するため)。

形式はタイムスタンプが散在するコマンドのリストにすぎず、ファイルに何も含まれていなくても(たとえば/ dev / nullリンク)、bashはうまく機能するため、ファイルのインポートによる否定的な結果は想像できません。タイムスタンプを省略してコンテンツを手動で追加することもできます。少なくとも試してみることはできます。シェルに問題がある場合は終了し、以前の履歴を復元してください。

$HISTFILE必要に応じて、シェルを起動する前にファイルを交換またはエクスポートして、さまざまな目的で複数の履歴を使用することもできます。読み取り専用に設定されている場合(または$HISTFILE後でリセットできますか?シェルが最後に変数をチェックするか初期値を使用するかによって異なります)、シェルが終了したときに追加されません。

関連情報