작동하지 않는 환경 변수를 설정하는 BASH 스크립트


137

필요한 경우 일부 환경 변수를 설정하기 위해 다음 스크립트를 작성했습니다.

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

명령과 결과 아래에서 터미널에서 볼 수 있습니다. 스크립트는 실행되지만 변수는 마지막에 설정되지 않습니다.

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

뭐가 문제 야? 미리 감사드립니다. 미르코

답변:


193

export변수 할당을 export명령이 실행 된 쉘의 하위 프로세스로 내 보냅니다 . 명령 줄 환경은 스크립트 셸 의 부모 이므로 변수 할당이 표시되지 않습니다.

당신은 사용할 수 있습니다 .(또는 source, 예를 스크립트가 현재 쉘 환경에서 명령을 실행하고 당신이 원하는 것을 달성하기 위해) bash는 명령을

source ./script.sh
echo "$BASE"

생산할 것이다

/home/develop/trees

source종종 스크립트에서 볼 명령, 대한 bash는 동의어입니다 .POSIX 표준의 일부이며, (그래서 .예를 들어, 대시에서 사용할 수 있지만 source하지 않습니다).

. ./script.sh     # identical to "source ./script.sh"

( . script.sh그리고 source script.sh첫번째를 찾습니다 script.sh에서 PATH, 그래서 경로를 지정하는 안전합니다 script.sh.)


29
export서브 쉘에 변수를 전달할 필요는 없습니다 . 서브 쉘은 변수 및 함수 등을 포함하여 현재 쉘의 사본입니다. 내 보낸 변수는 프로세스가 다른 쉘인지 여부에 관계없이 쉘에서 생성 된 새 프로세스로 복사됩니다. 둘째, .소싱을위한 POSIX 명령입니다. Bash는 source더 읽기 쉬운 동의어로 추가 되지만 sh에서 사용할 수는 없습니다. 당신이 놀라움을 피하고 싶다면 마지막 . ./script대신 . script. mywiki.wooledge.org/BashFAQ/060
geirha

스크립트를 소싱하고 파이프를 사용하는 경우 소스 환경을 상위 환경에서 사용할 수 없습니다. 예를 들어 'source setit.sh'는 괜찮습니다. 'source setit.sh | tee setit.log'는 올바르지 않습니다. 놀라운. 직관적이지 않습니다.
gaoithe

10

스크립트를 실행하면 서브 쉘에서 실행됩니다. 변수는 해당 서브 쉘의 컨텍스트 내에서만 유효합니다. 변수를 설정 .bashrc하거나 변수와 서브 쉘을.profile 읽으십시오 . 문이 아닌 예에서와 같이 최대 hierachy (현재 쉘 모든 그것의 서브 쉘)을 아래로 작동합니다.export

또는 (스크립트가 현재 쉘의 환경에 영향을 미치도록하려면) 다음과 같이 실행하십시오.

. ./script.sh

그러면 현재 쉘에서 실행되지만 변수를 계층 구조로 전달하지 않습니다.


5

종종 번거롭지 않은 환경 변수를 설정하고 싶습니다.

이 편의를 구현하기 위해 .bashrc에 추가 한 내용은 다음과 같습니다.

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}

-1

이런 식으로 시도해 볼 수 있습니다

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.