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


159

我正在尝试编写(我想会是)一个简单的bash脚本,该脚本将:

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

第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脚本功能非常薄弱。我对CLI相当满意,但是很可能有一些非常愚蠢的原因,使它无法正常工作。

Answers:


230

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

#!/bin/bash

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

内置源代码可以在bash中正常工作;但您也可以像Norman建议的那样使用点。


该解决方案最初是Norman Ramsey回答中的一种评论。由于这实际上是解决问题的方法,因此我将其更改为“可接受的答案”
Chris Lawlor

185

/bin/sh应该遵守的POSIX标准中,命令是.(单个点),而不是source。该source命令是csh已被引入的-ism bash

尝试

. $env_name/bin/activate

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


1
那就解决了。(将/ bin / sh更改为/ bin / bash)。出于某种原因,脚本完成后未在CLI中激活环境,但这是一个小问题。
克里斯·劳洛

8
根据Bash手册,它 source是的同义词.
理查德·汉森

1
我在使用带有这样的入口点的Docker容器时遇到了这个问题/bin/sh -c '/path/to/script.sh'。即使我的脚本是bash脚本,source仍无法导出导出。但是“。” 工作了!
Nikhil Owalekar '18

30

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

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


执行此操作时出现细分错误。
最大清除器

1
文件必须是可执行文件:chmod +x filename.sh
Randy

2
知道为什么会这样吗?
Yuval Adam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.