在bash脚本中使用source时出现'source:not found'错误

时间:2009-03-21 23:14:12

标签: bash virtualenv

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

  1. 运行virtualenv以$ 1
  2. 创建新环境
  3. 激活虚拟环境
  4. 做更多的事情(安装django,将django-admin.py添加到virtualenv的路径等)。
  5. 第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中手动运行所有步骤,一切正常。

    在我的研究中,我发现this script,它与我想要的类似,但也做了很多其他我不需要的事情,比如将所有虚拟环境存储在〜/ .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很满意,但可能有一些非常愚蠢的原因,这是不起作用的。

3 个答案:

答案 0 :(得分:211)

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

#!/bin/bash

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

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

答案 1 :(得分:165)

/bin/sh应该尊重的POSIX标准中,命令是.(单个点),而不是sourcesource命令是csh - ism已被提取到bash

尝试

. $env_name/bin/activate

或者如果您的代码中必须包含非POSIX bash - isms,请使用#!/bin/bash

答案 2 :(得分:26)

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

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