我正在尝试编写(我认为的)一个简单的 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 中手动运行所有步骤,一切正常。
在我的研究中,我发现这个脚本,它与我想要的类似,但也做了很多我不需要的其他事情,比如将所有虚拟环境存储在 ~/.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 相当熟悉,但很可能有一些极其愚蠢的原因导致它不起作用。
如果您正在编写 bash 脚本,请按名称调用它:
#!/bin/bash
/bin/sh 不保证是 bash。几年前,这导致 Ubuntu 中出现大量损坏的脚本(IIRC)。
内置的源代码在 bash 中工作得很好;但你也可以像诺曼建议的那样使用点。
在
/bin/sh
应该遵守的 POSIX 标准中,命令是 .
(单个点),而不是 source
。 source
命令是一个 csh
主义,已被纳入 bash
。
尝试
. $env_name/bin/activate
或者,如果您的代码中必须包含非 POSIX
bash
主义,请使用 #!/bin/bash
。
在 Ubuntu 中,如果您使用
sh scriptname.sh
执行脚本,则会出现此问题。
尝试使用
./scriptname.sh
执行脚本。
最好添加您想要获取的文件的完整路径。
例如
source ./.env
而不是source .env
或
source /var/www/html/site1/.env
经过多次尝试,我发现如下。简单地做
$
./env_name/bin/activate