Obtendo um erro 'source: not found' ao usar o source em um script bash


159

Estou tentando escrever (o que pensei que seria) um script bash simples que:

  1. execute o virtualenv para criar um novo ambiente a US $ 1
  2. ativar o ambiente virtual
  3. faça mais algumas coisas (instale o django, adicione django-admin.py ao caminho do virtualenv, etc.)

O passo 1 funciona muito bem, mas não consigo ativar o virtualenv. Para quem não conhece o virtualenv, ele cria um activatearquivo que ativa o ambiente virtual. Na CLI, você a executa usandosource

source $env_name/bin/activate

Onde $ env_name, obviamente, é o nome do diretório em que o ambiente virtual está instalado.

No meu script, depois de criar o ambiente virtual, armazeno o caminho para o script de ativação como este:

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

Mas quando ligo source "$activate", recebo o seguinte:

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

Eu sei que $activatecontém o caminho correto para o script de ativação, na verdade eu até testei que um arquivo existe antes de ligar source. Mas sourceele próprio parece não conseguir encontrá-lo. Eu também tentei executar todas as etapas manualmente na CLI, onde tudo funciona bem.

Na minha pesquisa, encontrei esse script , que é semelhante ao que eu quero, mas também está fazendo muitas outras coisas que não preciso, como armazenar todos os ambientes virtuais em um diretório ~ / .virtualenv (ou o que estiver em $ WORKON_HOME). Mas parece-me que ele está criando o caminho activatee chamando source "$activate"basicamente da mesma maneira que eu.

Aqui está o script em sua totalidade:

#!/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

AVISO LEGAL: Meu script de bash-fu é bem fraco. Estou bastante confortável com a CLI, mas pode haver alguma razão extremamente estúpida para isso não estar funcionando.

Respostas:


230

Se você estiver escrevendo um script bash, chame-o pelo nome:

#!/bin/bash

/ bin / sh não garante que o bash seja. Isso causou muitos scripts quebrados no Ubuntu há alguns anos (IIRC).

A fonte embutida funciona muito bem no bash; mas você também pode usar pontos como sugeriu Norman.


Esta solução foi originalmente um comentário na resposta de Norman Ramsey. Já que isso é o que realmente solucionou o problema, eu mudei para a 'resposta aceita' #
Chris Lawlor

185

No padrão POSIX, que /bin/shdeve respeitar, o comando é .(um único ponto), não source. O sourcecomando é um cshismo que foi puxado bash.

Experimentar

. $env_name/bin/activate

Ou se você deve ter bashisismos não POSIX no seu código, use #!/bin/bash.


1
Isso conserta. (alterando / bin / sh para / bin / bash). Por alguma razão, o ambiente não é ativado na CLI quando o script termina, mas esse é um problema menor.
22909 Chris Lawlor

8
De acordo com o manual do Bash,source é sinônimo de ..
Richard Hansen

1
Me deparei com isso ao usar um docker container com um ponto de entrada como esse /bin/sh -c '/path/to/script.sh',. Mesmo que meu script fosse um script bash, a fonte falhou ao originar as exportações. Mas "." trabalhou!
Nikhil Owalekar

31

No Ubuntu, se você executar o script, sh scriptname.shobtém esse problema.

Tente executar o script em ./scriptname.shvez disso.


Eu tenho uma falha de segmentação ao fazer isso.
pleaner máximo

1
O arquivo deve ser executável:chmod +x filename.sh
Randy

2
Alguma ideia de por que é assim?
Yuval Adam 9/04

A única coisa que funcionou para o meu Ubuntu
20.04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.