〜/ .bash_historyから履歴を削除する


8

に保存されている端末またはコマンドラインの履歴についていくつか質問があり~/.bash_historyます。

  1. historyコマンドでターミナルにファイルを表示できますが、ファイルで開こうとするgedit bash_historyと完全に空です。どうして?

  2. 次のコード行を使用して、ターミナルからファイル内の特定の数の行を削除する方法を見つけました。

    for i in {1..N}; do history -d N; done

    ここで、Nは削除する行(またはコマンド)の数ですが、履歴ファイルにはこの最後のコマンドが表示されるため、対象をカバーしようとする場合はそれほど賢くありません。だから問題は:最後のコード行をどのように与え、これが記録されないようにすることができるか?



今後の注意として、スペースでコマンドを開始すると、そのコマンドは履歴に保存されません。
Paddy Landau

回答:


18
  1. 前のドットを忘れただけで、(bash)端末履歴ファイルを開くコマンドは

    gedit ~/.bash_history

    このファイルは、ターミナルを閉じたときにのみ更新されます。

  2. このファイルから最後の10行を削除し、このコマンド自体を記録しないようにするには、新しいターミナルを開いて、次の一連のコマンドを実行します。

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    または

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    または

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedまたはheadそれぞれから選択した行を削除し~/.bash_historyhistory -c端末の歴史をクリアし、exitそれを閉じます。


for+に代わる短くてうまくいけばより速い代替案sedhead -n -N大文字Nは削除される行の数です。stackoverflow.com/a/13380679/711006
Melebius

2
@Melebiusは有望に見えますが、どのように出力を入力ファイルにリダイレクトして上書きしますか?head -n -N testfile > testfileファイルをクリアするだけです!回避策を追加しましたが、それは確かに短くはありません。
デザート

あなたが正しい、私はのようにそのhead場で動作できないことを忘れましたsed。私は主にループをsed置き換える単一のコマンドを探していましたfor。リンクしたページにはいくつかのオプションがありますが、それらはコードほど理解できません。
Melebius

@Melebius参照はsed1line.txtそのために-私は上記のこれを追加し、それは本当に短いではありませんが、より高速にする必要があります。
デザート

4

bash_historyファイルは、ドットで始まる隠しファイルです。あなたがする必要があります

gedit ~/.bash_history

これにより、geditでファイルが開きます。


1

コマンドログの特定の部分のみを削除する場合は、上記の方法で問題ありません。特定のbashセッションのコマンドロギングを停止する場合は、次のコマンドを発行します

unset HISTFILE

より徹底的に言うと、ログに記録したいコマンドがない場合は、

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

最初の方法は単一のセッションに対してのみ有効になることに注意してください。一方、2番目の方法は、今後のすべてのセッションのコマンドロギングを停止します。


1

私はこれがすでに受け入れられた答えを持っていることを理解していますが、これは私が80年代以来それをしている方法です。これは、トラックを非表示にする優れた方法であり、マルチフェーズアプローチです。ほとんどの場合、実際に注意を払っていないと気付かないものです。これがその方法です。

ターミナル/シェル/セッションを開いて、次のようにします。

 chmod 444 ~/.bash_history

シェルを終了し、ターミナル/シェル/セッションを開いて実行します。これは、履歴を完全に消去するクリエイティブな方法です。

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2(偽の履歴を作成する)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

次に、適切な対策として:

 chmod 444 ~/.bash_history

シェルを終了する

新しいシェルを開いて入力

 history

目立たないのは、ls -ratlを実行すると、〜/ .bash_historyが最終的にディレクトリリストのガタガタに消えてしまうことです。不必要な注意を引くリンクとしては表示されません。ほとんどの人はルートで-aを実行しません。これはエミュレーションが必要な場合に便利です。

このアプローチの欠点は、戻って履歴を取得する能力を失うことです。実際の〜/ .bash_historyファイルも、時間の経過とともに非常に古い変更日になる可能性があるため、ディレクトリリストの一番上に来る可能性があり、それ自体が何かが間違っているという発見につながる可能性があります。


を使用9999999 ddしてファイル内のすべての行を削除するか:%d、はるかに:1,$ddG
効率的に

0

1)を実行しますsh。これにより、履歴がまったく記録されない灰のサブシェルが生成されます。そこから編集

2)に行HISTCONTROL=ignorebothを追加し、現在のシェルを再初期化されたシェルに恒久的に置き換えてから.bashrcexec bashログに記録したくないすべてのコマンドを先頭のスペースで実行します。


0

私はまだコメントできないので、私のコメントを回答として追加します:

man history すべてに答えます。

#1の答えは、歴史は記憶にあるということです。history -aすぐにファイルに保存します。history -wまた、保存されますが、他のセッションを台無しにする可能性があります。

回答#2:history -a、gedit、必要な行を削除、history -r


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.