[bash] 키 / 값 쌍 파일에서 환경 변수 설정

TL; DR : 텍스트 파일에서 셸 환경으로 키 / 값 쌍 세트를 내보내려면 어떻게해야합니까?


기록을 위해 아래는 질문의 원래 버전과 예제입니다.

특정 폴더에 3 개의 변수가있는 파일을 구문 분석하는 스크립트를 bash로 작성 중입니다.이 중 하나입니다.

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

이 파일은 ./conf/prac1에 저장됩니다.

내 스크립트 minientrega.sh는 다음 코드를 사용하여 파일을 구문 분석합니다.

cat ./conf/$1 | while read line; do
    export $line
done

그러나 minientrega.sh prac1명령 줄에서 실행할 때 환경 변수를 설정하지 않습니다

나는 또한 사용하려고 source ./conf/$1했지만 동일한 문제가 여전히 적용됩니다.

어쩌면 이것을 수행하는 다른 방법이있을 수 있습니다. 스크립트의 인수로 전달하는 파일의 환경 변수를 사용해야합니다.



답변

접근 방식의 문제 exportwhile 루프가 서브 쉘에서 일어나고, 그 변수는 현재 쉘 (while 루프의 부모 쉘)에서 사용할 수 없습니다.

export파일 자체에 명령을 추가하십시오 .

export MINIENTREGA_FECHALIMITE="2011-03-31"
export MINIENTREGA_FICHEROS="informe.txt programa.c"
export MINIENTREGA_DESTINO="./destino/entrega-prac1"

그런 다음 다음을 사용하여 현재 셸에서 파일을 소싱해야합니다.

. ./conf/prac1

또는

source ./conf/prac1


답변

도움이 될 수 있습니다.

export $(cat .env | xargs) && rails c

내가 이것을 사용하는 이유는 .env레일 콘솔에서 물건 을 테스트하고 싶기 때문 입니다.

gabrielf 는 변수를 지역적으로 유지하는 좋은 방법을 찾았 습니다. 이것은 프로젝트에서 프로젝트로 갈 때 발생할 수있는 잠재적 인 문제를 해결합니다.

env $(cat .env | xargs) rails

나는 이것을 테스트했다. bash 3.2.51(1)-release


최신 정보:

로 시작하는 줄을 무시하려면 #이것을 사용하십시오 ( Pete ‘s comment 덕분에 ).

export $(grep -v '^#' .env | xargs)

당신이 원한다면 unset파일에 정의 된 모든 변수, 이것을 사용 :

unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)

최신 정보:

공백이있는 값을 처리하려면 다음을 사용하십시오.

export $(grep -v '^#' .env | xargs -d '\n')

GNU 시스템에서 또는

export $(grep -v '^#' .env | xargs -0)

BSD 시스템에서.


답변

-o allexport다음 변수 정의를 모두 내보낼 수 있습니다. +o allexport이 기능을 비활성화합니다.

set -o allexport
source conf-file
set +o allexport


답변

set -a
. ./env.txt
set +a

다음 env.txt과 같은 경우 :

VAR1=1
VAR2=2
VAR3=3
...

설명
하는 것과 같습니다 -a allexport . 다시 말해, 쉘의 모든 변수 할당은 환경으로 내보내집니다 (여러 하위 프로세스에서 사용됨). 자세한 내용은 Set 내장 문서 에서 찾을 수 있습니다 .

-a     작성 또는 수정 된 각 변수 또는 함수에는 내보내기 속성이 제공되고 후속 명령 환경으로 내보내기 위해 표시됩니다.

‘-‘대신 ‘+’를 사용하면 이러한 옵션이 해제됩니다. 쉘을 호출 할 때 옵션을 사용할 수도 있습니다. 현재 옵션 세트는 $-에 있습니다.


답변

allexport옵션은 몇 가지 다른 답변에 언급되어 set -a있으며 바로 가기입니다. 주석, 빈 줄 및 명령으로 생성 된 환경 변수를 허용하기 때문에 .env를 소싱하는 것은 실제로 줄을 반복하고 내보내는 것보다 낫습니다. 내 .bashrc에는 다음이 포함됩니다.

# .env loading in the shell
dotenv () {
  set -a
  [ -f .env ] && . .env
  set +a
}

# Run dotenv on login
dotenv

# Run dotenv on every new directory
cd () {
  builtin cd $@
  dotenv
}


답변

eval $(cat .env | sed 's/^/export /')


답변

가장 효율적인 방법은 다음과 같습니다.

export $(xargs < .env)

설명

다음 .env과 같은 파일이 있을 때 :

key=val
foo=bar

실행 xargs < .env얻을 것이다key=val foo=bar

그래서 우리는 얻을 것이다 export key=val foo=bar 것이고 그것은 우리가 정확히 필요한 것입니다!

한정

  1. 값에 공백이있는 경우는 처리하지 않습니다. env와 같은 명령이이 형식을 생성합니다. – @Shardj