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

我正在尝试编写一个简单的 bash 脚本,它可以:

  1. 运行 viralenv 以 $1创建一个新环境
  2. 激活虚拟环境
  3. 做一些更多的事情(安装 django,将 django-admin.py 添加到 viralenv 的路径,等等)

步骤1工作得很好,但是我似乎无法激活 Virtual alenv。对于那些不熟悉 viralenv 的用户,它创建一个 activate文件来激活虚拟环境。在 CLI 中,使用 source运行它

source $env_name/bin/activate

其中 $env _ name 显然是安装虚拟 env 的 dir 的名称。

在我的脚本中,在创建了虚拟环境之后,我存储了激活脚本的路径,如下所示:

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

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

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

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

在我的研究中,我发现了 这个剧本,它与我想要的类似,但是也做了很多其他我不需要的事情,比如将所有的虚拟环境存储在一个 ~/中。Viralenv 目录(或 $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 脚本-fu 非常弱。我在 CLI 相当舒服,但是可能有一些非常愚蠢的原因,这不工作。

174785 次浏览

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

试试看

. $env_name/bin/activate

或者,如果您的代码中必须有非 POSIX bash主义,则使用 #!/bin/bash

如果您正在编写 bash 脚本,可以直接称呼它的名称:

#!/bin/bash

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

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

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

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