이름이 다음과 같은 스크립트가 있습니다 export.sh
.
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
SOURCE=$(dirname ${SOURCE})
export $(cat "${SOURCE}/../params.env" | xargs)
즉, params.env
관례적으로 기본 폴더에 있는 이라는 파일에서 환경 변수를 내보내고 해당 내용을 환경 변수로 내보내는 것입니다.
파일 내용의 예는 다음 params.env
과 같습니다.
SOMEVAR="val1"
SOMEVAR2="val2"
성공적인 실행은 나에게 SOMEVAR
가치 val1
와 SOMEVAR2
귀중한 val2
환경 변수를 제공할 것입니다.
하지만 내가 실행하면 :
./export.sh
그러고 나서
printenv | grep SOMEVAR
환경 변수가 설정되었음을 나타내지는 않습니다.
답변1
모든 생각은 옳았지만 결국 당신은구현하다대신 쉘 스크립트구입현재 쉘의 환경이 변경됩니다.
스크립트를 실행하면 하위 쉘이 실행되고 내보낸 모든 시스템 환경 변수는잃어버린서브쉘이 종료된 후.
디버그 모드가 설정된 스크립트를 실행하면 어떤 일이 발생하는지 확인하세요 -x
(참고로 저는 params.env
현재 폴더에서 사용 중입니다).
$ bash -x script.sh
+ SOURCE=script.sh
+ '[' -h script.sh ']'
++ dirname script.sh
+ SOURCE=.
++ cat ./params.env
++ xargs
+ export SOMEVAR=val1 SOMEVAR2=val2
+ SOMEVAR=val1
+ SOMEVAR2=val2
변수가 설정된 것을 볼 수 있지만 서브셸은 내보낸 변수를 삭제합니다. 이제 스크립트를 찾을 때,
source script.sh
printenv | grep SOMEVAR
SOMEVAR=val1
SOMEVAR2=val2
bash
귀하의 버전이 명시적 명령을 지원하지 않는 경우 호환되는 방법을 source
사용하십시오.POSIX
. ./script.sh