在bash脚本中使用源代码时获取“source:not found”错误
我试图写(我以为会是)一个简单的bash脚本,将:
- 运行virtualenv以$ 1创build一个新的环境
- 激活虚拟环境
- 做更多的东西(安装django,将django-admin.py添加到virtualenv的path等)
第1步工作得很好,但我似乎无法激活virtualenv。 对于那些不熟悉virtualenv的人来说,它会创build一个activate
文件来激活虚拟环境。 从CLI中,您使用source
运行它
source $env_name/bin/activate
其中$ env_name显然是虚拟环境安装目录的名称。
在我的脚本中,在创build虚拟环境之后,我将path存储到激活脚本中,如下所示:
activate="`pwd`/$ENV_NAME/bin/activate"
但是当我打电话source "$activate"
,我得到这个:
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
我知道$activate
包含激活脚本的正确path,实际上我甚至在调用source
之前testing了一个文件。 但是, source
自身似乎无法find它。 我也尝试在CLI中手动运行所有步骤,在那里一切工作正常。
在我的研究中,我发现这个脚本与我想要的类似,但也做了很多其他我不需要的东西,比如将所有的虚拟环境存储在〜/ .virtualenv目录中$ WORKON_HOME)。 但是在我看来,他正在创buildactivate
的path,并且以与我基本相同的方式调用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脚本fu很弱。 在CLI中我相当舒服,但可能有一些非常愚蠢的原因,这是行不通的。
如果您正在编写一个bash脚本,请按名称来调用它:
#!/bin/bash
/ bin / sh不保证是bash。 几年前,这在Ubuntu中导致了大量破坏的脚本(IIRC)。
内置源代码在bash中运行得很好; 但你也可以像诺曼build议的那样使用点。
在/bin/sh
应该遵守的POSIX标准中,命令是.
(一个点),而不是source
。 source
命令是一个已被拉入bash
的csh
-ism。
尝试
. $env_name/bin/activate
或者,如果您的代码中必须有非POSIX bash
主体,请使用#!/bin/bash
。
在Ubuntu中,如果使用sh scriptname.sh
执行脚本,则会出现此问题。
尝试使用./scriptname.sh
执行脚本。