환경 변수를 내보내는 스크립트는 내보낼 수 없습니다.

환경 변수를 내보내는 스크립트는 내보낼 수 없습니다.

이름이 다음과 같은 스크립트가 있습니다 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가치 val1SOMEVAR2귀중한 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

관련 정보