bash 스크립트에서 소스를 사용할 때 '소스 : 찾을 수 없음'오류 표시


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은 가상 env가 설치된 디렉토리의 이름입니다.

내 스크립트에서 가상 환경을 만든 후 다음과 같이 활성화 스크립트의 경로를 저장합니다.

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에 상당히 익숙하지만 이것이 작동하지 않는 매우 어리석은 이유가있을 수 있습니다.

답변:


230

bash 스크립트를 작성하는 경우 이름으로 호출하십시오.

#!/bin/bash

/ bin / sh는 bash임을 보증하지 않습니다. 이로 인해 몇 년 전 우분투 (IIRC)에서 스크립트가 깨졌습니다.

소스 내장은 bash에서 잘 작동합니다. 그러나 Norman이 제안한 것처럼 점을 사용할 수도 있습니다.


이 솔루션은 원래 Norman Ramsey의 답변에 대한 주석이었습니다. 이것이 실제로 문제를 해결 한 것이기 때문에 나는 이것을 '허용되는 대답'으로 변경했습니다
Chris Lawlor

185

고려해야 할 POSIX 표준 /bin/sh에서 명령은 .(단일 점)이 아닙니다 source. 이 source명령은 csh안으로 들어간 -ism입니다 bash.

시험

. $env_name/bin/activate

또는 bash코드에 비 POSIX가 있어야하는 경우을 사용하십시오 #!/bin/bash.


1
문제가 해결되었습니다. (/ bin / sh를 / bin / bash로 변경). 어떤 이유로 스크립트가 완료되면 CLI에서 환경이 활성화되지 않지만 사소한 문제입니다.
Chris Lawlor

8
Bash 매뉴얼 에 따르면 source의 동의어입니다 ..
Richard Hansen

1
이와 같은 진입 점이있는 도커 컨테이너를 사용할 때이 문제가 발생했습니다 /bin/sh -c '/path/to/script.sh'. 내 스크립트는 bash 스크립트이지만 소스가 내보내기를 소스하지 못했습니다. 그러나 "." 일했다!
Nikhil Owalekar

31

우분투에서 스크립트를 실행하면 sh scriptname.sh이 문제가 발생합니다.

./scriptname.sh대신 스크립트를 실행하십시오 .


이 작업을 할 때 세그먼테이션 오류가 발생했습니다.
max pleaner 2

1
파일은 실행 가능해야합니다.chmod +x filename.sh
Randy

2
이것이 왜 그런지 아십니까?
유발 아담

내 우분투 20.04에서 작동 한 유일한 것
Kirill_Zaitsev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.