【问题标题】:Run bash script on `cd` command在 `cd` 命令上运行 bash 脚本
【发布时间】:2013-07-11 08:21:10
【问题描述】:

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

但是,有时我会使用 virtualenv,因为这种特殊情况的构建过于复杂。

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

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

所以逻辑很简单:

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

【问题讨论】:

  • @tripleee 抱歉,这是一个非常不同的问题。
  • @Pol:好吧,如果你的 shell 支持在 PS1 中计算任意表达式,你可以编写一个函数来检测你是否在上次提示后更改了目录,以及是否新目录是一个 venv 目录,如果是,则激活它。但这将是非常非常愚蠢的。 :)

标签: python ruby linux


【解决方案1】:

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
}

(注意:我不知道你识别项目目录的逻辑是什么,所以我把它留为...供你填写。如果你在评论中描述你的逻辑,我会相应地编辑。 )

【讨论】:

  • 谢谢。不过,这是非常明显的解决方案。我不认为这是红宝石人的方式。
  • @Pol:我不知道你提到的 Ruby 特性,但我看不出“明显的解决方案”有什么问题!
  • 不要误会我的意思。我没有说不合适。我会说它先进的方式。我只是觉得为这种东西重新编译 cd 命令有点过分。我相信应该有更简单的方法。
  • 顺便说一下我添加的逻辑。
  • @Pol:抱歉,我认为您完全误解了这个答案。这实际上是一种非常简单的方法,不需要任何形式的“编译”。我猜你不熟悉shell函数?我将编辑我的答案以添加更多信息。 . .
【解决方案2】:

我认为您正在寻找两件事之一。

autoenv 是一个相对简单的工具,可以为您创建相关的 bash 函数。它本质上是按照 ruakh 的建议做的,但是您可以使用它而不必知道 shell 是如何工作的。

virtualenvwrapper 充满了工具,可以更轻松地构建更智能的 bash 函数版本——例如,即使您将cd 切换到其子目录之一而不是基础目录,也可以切换到 venv,或者跟踪存储在githg,或……请参阅 Tips and Tricks 页面。

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

【讨论】:

    【解决方案3】:

    刚刚在virtualenvwraper的描述中找到this topic

    它准确地描述了我需要什么。

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2015-01-09
      • 2018-08-19
      • 1970-01-01
      相关资源
      最近更新 更多