Bashの各作業ディレクトリの履歴ログの生成

Bashの各作業ディレクトリの履歴ログの生成

各現在の作業ディレクトリの履歴を含むファイルを保持することが可能かどうか疑問に思います。たとえば、操作中に/user/temp/1/いくつかのコマンドを入力すると、/user/temp/1/.hisそのコマンドはどこに保存されますか?バッシュを使っています。

答え1

重要:指摘したとおりザイルズ「じゃあ邪悪なことはやめろ」。次の方法では、シェルが攻撃にさらされ、誤って情報が漏洩する可能性があります。気をつけて進めてください。


提供された回答に基づいて構築グロゲル、〜/.bash_profileから代替CD(ch)を作成できます。

function ch () {
    cd "$@"
    export HISTFILE="$(pwd)/.bash_history"
}

chが呼び出されるたびに、新しいHISTFILE値が自動的に派生します。

Bashのデフォルトの動作はターミナルセッションを終了したときにのみ履歴を更新するため、これだけでセッションを終了したフォルダの.bash_historyファイルに履歴が保存されます。解決策が言及されています。この投稿そして詳しく紹介されたこのページ、HISTFILEをリアルタイムで更新できます。

完全な解決策は、~/.bash_profileにさらに2行を追加することで構成されています。

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

最初の行を追加するように履歴モードを変更し、すべてのプロンプトで実行するように履歴コマンドを設定します。

答え2

ディレクトリを変更するときに実行するコードを設定できます。 zsh では、chpwd_functions関数を定義してそれを配列に追加するのと同じくらい簡単です。 Bashではもっと作業が必要ですが、そうすることができます。ディレクトリに入るときにbashスクリプトを実行するchpwdディレクトリが変更されるたびに実行される関数を定義する方法を学びます。

実行したい操作を実行するには、そのchpwd機能が必要です。現在の歴史を書く古いファイルに。 Bashを終了したときに正しい場所に履歴を保存するには、次のように設定します。HISTFILE新しいディレクトリの履歴ファイルの変数を指定し、新しい履歴レコードを読み込みます。

chpwd () {
  history -a
  mkdir -p "$HOME/.bash_history.d/${PWD%/*}"
  HISTFILE=~/.bash_history.d/$PWD
  history -r
}

現在のディレクトリではなく、ホームディレクトリの下の階層にレコードを書き込んでいることに注意してください。現在のディレクトリにシェル履歴を書き込むことは非常に危険で破壊的です。:どこからでも個人情報が漏洩し、意図しないファイルを修正する危険があります(記録ファイル名が他の場所を指す既存のシンボリックリンクであればどうなりますか?)。

各コマンドの後に履歴を記録する方が良いかもしれません。 Bashでは、以下を使用してこの機能を有効にできます。histappendオプション。このオプションを使用すると、history -a明示的に実行する必要はありません。

shopt -s histappend
chpwd () {
  mkdir -p "$HOME/.bash_history.d/${PWD%/*}"
  HISTFILE=~/.bash_history.d/$PWD
  history -r
}

答え3

ディレクトリをどれだけ頻繁に変更するかに応じて、私のソリューションが機能しない場合があります。 Bash履歴が保存される場所を設定するHISTFILEをエクスポートできるため、作業中のディレクトリに別々の構成ファイルを作成し、direnvなどを使用して自動的にロードできます。

HISTFILE="$(pwd).bash_history"

デレンフ https://github.com/direnv/direnv

関連情報