关于virtualenv:在bash脚本中使用source时出现’source:not found’错误

Getting a 'source: not found' error when using source in a bash script

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

  • 运行virtualenv以$1创建新环境
  • 激活虚拟环境
  • 做更多的事情(安装django,将django-admin.py添加到virtualenv的路径等)
  • 步骤1工作得很好,但我似乎无法激活virtualenv。对于那些不熟悉virtualenv的人,它创建一个激活虚拟环境的activate文件。在cli中,您使用source运行它。

    1
    source $env_name/bin/activate

    其中$env_name显然是安装虚拟env的目录的名称。

    在我的脚本中,在创建虚拟环境之后,我将像这样存储到激活脚本的路径:

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

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

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

    我知道$activate包含到激活脚本的正确路径,事实上,我甚至在调用source之前测试文件是否存在。但江户十一〔一〕本身似乎找不到它。我还尝试在CLI中手动运行所有步骤,在这里一切正常。

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

    以下是完整的脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/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脚本fu很弱。我在cli上相当舒服,但这可能有一些非常愚蠢的原因不起作用。


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

    1
    #!/bin/bash

    /bin/sh不保证是bash。几年前,这在Ubuntu(iirc)造成了大量的脚本损坏。

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


    在应该尊重/bin/sh的posix标准中,命令是.(单点),而不是sourcesource命令是一个csh主义,已被拉入bash中。

    尝试

    1
    . $env_name/bin/activate

    或者,如果代码中必须有非posix bashisms,请使用#!/bin/bash


    在Ubuntu中,如果使用sh scriptname.sh执行脚本,就会出现这个问题。

    尝试用./scriptname.sh执行脚本。