每个目录的 bash/zsh 历史日志文件

Sim*_*mon 17 bash zsh shell history

我发现我在一个集合目录中的一个项目上做了很多工作。有时——几个月后——我需要在那个项目上重做一些事情,但我不记得我做了什么。我使用 mercurial 或 git 来跟踪对文件的更改,但我希望能够记住我在该目录中发出的命令。

搜索我的 shell 历史记录并不是很有用。我已经将所有内容记录到我的 .*_history 文件中,但我想要一个我在 ~/foo/bar 中所做的事情的列表,而不是我那周所做的所有其他(百万)事情。我可能甚至不记得我上次在那个特定项目上工作的月份。

有没有人知道我使用过的所有 shell 命令的项目目录日志文件?我正在设想一个类似的命令:

在我的项目上工作

...这会将 shell 日志文件设置为 ~/myproject/.history.log,从该日志文件加载以前的历史记录,并可能更新我的提示以告诉我我正在处理的目录(例如 vcprompt 以提供版本控制信息)。

有没有这样的东西?

小智 5

如果您还没有弄清楚这一点:您正在寻找的是优秀的virtualenvwrapper包。它是 python 的virtualenv (go figure)的包装器,虽然在处理 python 环境时通常会提到它,但它实际上是一个非常通用的工具,可以满足您的用例。

安装

pip install virtualenvwrapper
Run Code Online (Sandbox Code Playgroud)

或者

easy_install virtualenvwrapper
Run Code Online (Sandbox Code Playgroud)

并将初始化内容添加到您的 shell 配置 ( ~/.zshrc, ~/.bashrc)

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$WORKON_HOME/projects
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
source /usr/local/bin/virtualenvwrapper.sh
Run Code Online (Sandbox Code Playgroud)

用法

# create your env
mkvirtualenv my_project

# edit per project hooks
vim ~/.virtualenvs/my_project/bin/{postactivate,preactivate,predeactivate,etc}

# work in this env
workon my_project
Run Code Online (Sandbox Code Playgroud)

你也有通用的钩子,~/.virtualenvs/{postactivate,postdeactivate,etc}每次你调用它workon any_project

因此,例如,export HISTFILE="$VIRTUAL_ENV/bash_history"~/virtualenvs/postactivate钩子中有一行意味着$HISTFILE每次都会将变量扩展到不同的项目。


Ric*_*lka 0

至少在 bash 中,仅在 shell 实例启动时才查阅 HISTFILE。每个目录的想法在这里不起作用,除非上面的“workon”示例创建了一个 shell 实例。

也许你可以看看类似的东西

alias workon='script ./.history.log'
Run Code Online (Sandbox Code Playgroud)

但脚本也会创建一个子shell。

简而言之,您可能需要混乱级别的子 shell 才能使其正常工作。