在 bash 中为每个工作目录创建历史日志

在 bash 中为每个工作目录创建历史日志

我想知道是否可以保留包含每个当前工作目录历史记录的文件。例如,如果我正在工作/user/temp/1/并输入了一些命令,这些命令将被保存在/user/temp/1/.his什么地方。我正在使用 bash。

答案1

重要的: 正如所指出的吉尔斯“所以——别再作恶了”。下面的方法可能会使您的 shell 遭受攻击并意外泄漏信息。小心行事。


建立在提供的答案之上格罗格尔,您可以在 ~/.bash_profile 中创建替代 cd (ch)。

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

每次调用 ch 时自动导出新的 HISTFILE 值。

bash 中的默认行为仅在结束终端会话时更新您的历史记录,因此仅此一项就可以将历史记录简单地保存到您碰巧结束会话的文件夹中的 .bash_history 文件中。中提到了一个解决方案这个帖子并详细介绍了这一页,允许您实时更新 HISTFILE。

完整的解决方案包括在 ~/.bash_profile 中添加另外两行,

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
}

请注意,我将历史记录写入主目录下的层次结构,而不是当前目录。将 shell 历史记录写入当前目录将是极其危险且具有破坏性的:您最终会到处泄露隐私,您可能会冒着修改意外文件的风险(如果历史文件名是指向其他地方的现有符号链接怎么办?)等等。

在每个命令之后写出历史记录可能会更好。在 bash 中,您可以使用以下命令启用此功能histappend选项。使用此选项,您不需要history -a显式运行。

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

答案3

根据您更改目录的频率,我的解决方案可能不起作用。您可以导出 HISTFILE,它设置 bash 历史记录的存储位置,因此您可以在您正在工作的目录中创建单独的配置文件,然后使用 direnv 之类的东西自动加载它们。

HISTFILE="$(pwd).bash_history"

迪仁夫 https://github.com/direnv/direnv

相关内容