我是python开发人员,最常使用buildout来管理我的项目。在这种情况下,我不需要运行任何命令来激活我的依赖项环境。
然而,有时我使用virtualenv当buildout对于这个特殊情况来说是复杂的。
最近我开始玩ruby。并注意到非常有用的功能。当我cd
进入项目文件夹时,环境会自动更改。它与rvm
nad .rvmrc
文件有某种关联。
我只是想知道是否有办法在不同的bash命令上挂钩一些脚本。当workon environment_name
进入项目文件夹时,我可以自动cd
。
所以逻辑很简单:
当您cd
项目中的folder_name
时,脚本应该运行workon folder_name
答案 0 :(得分:12)
Unix shell的一个特性是它们允许你创建 shell函数,这与其他语言中的函数非常相似;它们基本上是命名的命令组。例如,您可以编写一个名为mycd
的函数,该函数首先运行cd
,然后运行其他命令:
function mycd () {
cd "$@"
if ... ; then
workon environment
fi
}
("$@"
扩展为您传递给mycd
的参数;因此mycd /path/to/dir
将调用cd /path/to/dir
。)
作为一种特殊情况,shell函数实际上取代了一个类似命名的内置命令;因此,如果您为函数cd
命名,则只要您运行cd
,它就会运行而不是cd
内置函数。在这种情况下,为了让函数调用内置cd
来执行实际的目录更改(而不是调用自身,导致无限递归),它可以使用Bash的builtin
内置来调用指定的内置命令。所以:
function cd () {
builtin cd "$@" # perform the actual cd
if ... ; then
workon environment
fi
}
(注意:我不知道你识别项目目录的逻辑是什么,所以我把它留作...
让你填写。如果你在评论中描述你的逻辑,我会编辑相应地。)
答案 1 :(得分:2)
我认为你正在寻找两件事之一。
autoenv
是一个相对简单的工具,可以为您创建相关的bash函数。它基本上是在做ruakh建议的,但你可以使用它而不必了解shell是如何工作的。
virtualenvwrapper
充满了工具,可以更轻松地构建更智能的bash函数版本 - 例如,即使你cd
进入其子目录而不是基础,也可以切换到venv,或者跟踪存储在git
或hg
中的静脉,或...查看Tips and Tricks页面。
Cookbook for autoenv
,显示了将两者结合使用的一些方法。
答案 2 :(得分:0)
刚刚在virtualenvwraper this topic
的描述中找到它准确描述了我的需求。