在`cd`命令上运行bash脚本

时间:2013-07-12 17:41:03

标签: python ruby linux

我是python开发人员,最常使用buildout来管理我的项目。在这种情况下,我不需要运行任何命令来激活我的依赖项环境。

然而,有时我使用virtualenv当buildout对于这个特殊情况来说是复杂的。

最近我开始玩ruby。并注意到非常有用的功能。当我cd进入项目文件夹时,环境会自动更改。它与rvm nad .rvmrc文件有某种关联。

我只是想知道是否有办法在不同的bash命令上挂钩一些脚本。当workon environment_name进入项目文件夹时,我可以自动cd

所以逻辑很简单:

当您cd项目中的folder_name时,脚本应该运行workon folder_name

3 个答案:

答案 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,或者跟踪存储在githg中的静脉,或...查看Tips and Tricks页面。

Cookbook for autoenv,显示了将两者结合使用的一些方法。

答案 2 :(得分:0)

刚刚在virtualenvwraper this topic

的描述中找到

它准确描述了我的需求。