その間、HISTIGNORE
に関する皆さんのすばらしいヒントのおかげで、私の歴史をずっときれいに保つことができました。 .bashrc
のオプション 、これらの無意味なll
をすべて省略します またはdf -k
行。
ただし、HISTIGNORE
オプションは非常に制限的です 、も。
たとえば、このような行がある場合(簡略化)
HISTIGNORE='ll*:la*:cd*'
これらをリストから除外するだけではありません 、だけでなく、「ライブ履歴」からも カーソルを上にしてアクセスできる揮発性の履歴をダビングしたいので /カーソルを下に移動 。試してみてください。カーソルキーを使用してコマンド履歴をどれだけ循環しても、これらは完全に省略されます。
ただし、することもあります これらの行が必要です。特に、再入力したくない非常に長く複雑なパスの場合はそうです。一方で、これらの行を排他的にしたいのですが 私のライブ履歴に追加し、履歴リストに保存しないようにします 頻繁に変更されるため。
これを達成する方法はありますか?
別の補足として、何らかの理由で、「ライブ」履歴と履歴リストが異なる場合があることがわかりました。 多くの場合(同じユーザーと履歴コマンドで異なる結果が得られるのはなぜですか)
承認された回答:
HISTIGNORE
を使用できます 環境変数。
履歴リストに保存するコマンドラインを決定するために使用される、コロンで区切られたパターンのリスト。例:
export HISTIGNORE="cd*:ls*"
これにより、履歴からのすべてのcdおよびlsコマンドが無視されます。
編集:
申し訳ありませんが、最初の読書では、あなたの質問に十分な注意を払っていませんでした。ところで、あなたは正しいです:HISTIGNORE
は非常に難しい設定であり、bash_historyは、この変数にリストされている各コマンドを単に無視します(HISTFILE
にこれらのコマンドのエントリがすでにある場合は、実行時に無視します。 それらは履歴逆検索によって検出されます。
最後の質問に最初に答えるために、異なる端末を同時に使用すると、ライブ履歴と書き込み履歴が大きく異なる場合があります。ここで説明されている解決策を試すことができます:
複数のターミナルウィンドウでbashの履歴を保存する
想像できるのは、~/.bash_logout
で関数を使用するソリューションです。 ファイル。不要な履歴エントリが消去されます。
このようなものはあなたが望むことをするはずです:
function clear_history(){
# hist_ignore regex, this may be done in a more fancy way,
# such as using an env variable, but anyway
MYHISTIGNORE='^cd:^view:^cat'
# write down history to file
history -w
# create a new tmp file for history
tmpFile=$(mktemp)
cp ${HISTFILE} ${tmpFile}
# use it to filter history
for myRegex in $(echo $MYHISTIGNORE | awk 'BEGIN{FS=":"}{for (i=1;i<=NF;i++){print $i}}'); do
sed -i "/${myRegex}/d" ${tmpFile}
done
# and copy it back to history file
mv ${tmpFile} ${HISTFILE}
}