【问题标题】:Getting a 'source: not found' error when using source in a bash script在 bash 脚本中使用源时出现“源:未找到”错误
【发布时间】:2009-03-21 23:14:11
【问题描述】:

我正在尝试编写(我认为会是)一个简单的 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 中手动运行所有步骤,一切正常。

在我的研究中,我发现了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 相当满意,但很可能有一些非常愚蠢的原因,这不起作用。

【问题讨论】:

    标签: bash virtualenv


    【解决方案1】:

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

    #!/bin/bash
    

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

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

    【讨论】:

    • 这个解决方案最初是 Norman Ramsey 的回答中的一个评论。由于这是实际解决问题的方法,因此我已将其更改为“已接受的答案”
    • 那么,如果你之前只是输入source ~/.bashrc,你怎么称呼bash?你会bash ~/.bashrc吗?
    【解决方案2】:

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

    试试

    . $env_name/bin/activate
    

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

    【讨论】:

    • 修复它。 (将 /bin/sh 更改为 /bin/bash)。由于某种原因,当脚本完成时,环境没有在 CLI 中激活,但这是一个小问题。
    • 根据Bash manualsource.的同义词。
    • 我在使用带有类似入口点的 docker 容器时遇到了这个问题,/bin/sh -c '/path/to/script.sh'。即使我的脚本是 bash 脚本,source 也无法获取导出。但 ”。”工作!
    【解决方案3】:

    在 Ubuntu 中,如果您使用 sh scriptname.sh 执行脚本,则会遇到此问题。

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

    【讨论】:

    • 执行此操作时出现分段错误。
    • 文件必须是可执行的:chmod +x filename.sh
    • 知道这是为什么吗?
    猜你喜欢
    • 2021-09-11
    • 2018-03-17
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多