我正在尝试编写(我认为会是)一个简单的bash脚本:
第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很满意,但可能有一些非常愚蠢的原因,这是不起作用的。
答案 0 :(得分:211)
如果您正在编写bash脚本,请按名称调用它:
#!/bin/bash
/ bin / sh不保证是bash。几年前,这导致了Ubuntu中大量破碎的脚本(IIRC)。
源内置在bash中运行得很好;但你也可以像诺曼建议的那样使用点。
答案 1 :(得分:165)
在/bin/sh
应该尊重的POSIX标准中,命令是.
(单个点),而不是source
。 source
命令是csh
- ism已被提取到bash
。
尝试
. $env_name/bin/activate
或者如果您的代码中必须包含非POSIX bash
- isms,请使用#!/bin/bash
。
答案 2 :(得分:26)
在Ubuntu中,如果使用sh scriptname.sh
执行脚本,则会出现此问题。
尝试使用./scriptname.sh
执行脚本。