168

我正在尝试编写(我认为会是)一个简单的 bash 脚本,它将:

  1. 以 $1 运行 virtualenv 创建一个新环境
  2. 激活虚拟环境
  3. 做更多的事情(安装 django,将 django-admin.py 添加到 virtualenv 的路径等)

第 1 步效果很好,但我似乎无法激活 virtualenv。对于那些不熟悉 virtualenv 的人,它会创建一个activate激活虚拟环境的文件。在 CLI 中,您可以使用source

source $env_name/bin/activate

$env_name 显然是安装虚拟环境的目录的名称。

在我的脚本中,创建虚拟环境后,我存储激活脚本的路径,如下所示:

activate="`pwd`/$ENV_NAME/bin/activate"

但是当我打电话时source "$activate",我得到了这个:

/home/clawlor/bin/scripts/djangoenv: 20: source: not found

我知道它$activate包含激活脚本的正确路径,实际上我什至在调用source. 但source它自己似乎找不到它。我还尝试在 CLI 中手动运行所有步骤,一切正常。

在我的研究中,我发现了这个脚本,它与我想要的类似,但也做了很多我不需要的其他事情,比如将所有虚拟环境存储在 ~/.virtualenv 目录中(或任何在$WORKON_HOME)。但在我看来,他正在创造通往 的道路,并以与我基本相同的方式activate调用。source "$activate"

这是整个脚本:

#!/bin/sh

PYTHON_PATH=~/bin/python-2.6.1/bin/python

if [ $# = 1 ]
then
    ENV_NAME="$1"
    virtualenv -p $PYTHON_PATH --no-site-packages $ENV_NAME
    activate="`pwd`/$ENV_NAME/bin/activate"

    if [ ! -f "$activate" ]
    then
        echo "ERROR: activate not found at $activate"
        return 1
    fi

    source "$activate"
else
    echo 'Usage: djangoenv ENV_NAME'
fi

免责声明:我的 bash script-fu 很弱。我对 CLI 相当满意,但很可能有一些非常愚蠢的原因,这不起作用。

4

3 回答 3

244

如果您正在编写 bash 脚本,请按名称调用它:

#!/bin/bash

/bin/sh 不保证是 bash。几年前,这在 Ubuntu (IIRC) 中导致了大量损坏的脚本。

内置的源代码在 bash 中工作得很好;但你也可以像诺曼建议的那样使用点。

于 2009-03-21T23:30:46.553 回答
201

在应该尊重的 POSIX 标准中,/bin/sh命令是.(一个点),而不是source. 该source命令是一个csh已被拉入的 -ism bash

尝试

. $env_name/bin/activate

或者,如果您的代码中必须包含非 POSIXbash主义,请使用#!/bin/bash.

于 2009-03-21T23:25:03.773 回答
36

在 Ubuntu 中,如果您执行脚本,sh scriptname.sh则会出现此问题。

尝试./scriptname.sh改为执行脚本。

于 2010-09-21T05:20:22.757 回答