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


511

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했지만 동일한 문제가 여전히 적용됩니다.

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




이것은 좋은 질문이지만 특정 변수 이름 ( "MINIENTREGA_FECHALIMITE"? 그 의미는 무엇입니까? ")과 숫자 (3)와 함께 너무 구체적으로 표현됩니다. 일반적인 질문은 "텍스트 파일에서 셸 환경으로 키 / 값 쌍 세트를 내보내는 방법"입니다.
Dan Dascalescu

또한, 이것은 이미 unix.SE 에서 답변되었으며 아마도 더 많은 주제입니다.
Dan Dascalescu

답변:


208

접근 방식의 문제 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

4
파일을 한 줄씩 읽고 각 줄을 전달하는 export것이 이상적이지는 않지만 루프에서 간단히 입력 리디렉션을 사용하여 문제를 해결할 수도 있습니다 while read line; do ... ; done < ./conf/$1.
chepner

4
파일이 아닌 파일 인 경우< <(commands that generate output)
o11c

5
깨끗한 솔루션을 선호합니다.set -o allexport
heralight

2
시스템 export간에이 .env 파일을 사용하는 경우, 삽입 하면 Java, SystemD 또는 기타 도구와 같은 파일에 삽입 될 수 있습니다.
FilBot3

1
awk '{print "export " $0}' envfile모든 줄의 시작 부분에 수출을하기위한 편의 명령
Shardj

887

도움이 될 수 있습니다.

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 시스템에서.


6
감사합니다. 파일 앞에 추가 할 필요가 없습니다. Foreman (Procfile) .env 형식과 호환됩니다.
natevw

29
나는 해결책을 생각해 냈습니다 : env $ (cat .env | xargs) rails
gabrielf

4
공백이있는 값을 지정하는 가장 좋은 방법은 무엇인지 확실하지 않지만 env 값에 공백이 있으면 작동하지 않는 것 같습니다. github.com/ddollar/foreman/issues/56에 따르면 제대로 작동해야 export $(cat .env)하지만 공백 처리 방법을 모르겠습니다.
Dan Benamy

6
@BenjaminWheeler GNU 리눅스는 -d구분 기호를 설정하기 때문에 노력 env $(cat .env | xargs -d '\n') rails하고 있지만 .env공백이 있으면 여전히 파일을 찾을 수 없다는 오류가 발생 합니다. 왜 이것이 작동하지 않는지 아십니까?
Bailey Parker

19
짧은 변형입니다eval $(cat .env) rails
manalang

412

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

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

9
매력처럼 작동합니다! .env파일에 주석이 있어도 감사!
슬라바 포민 II

9
그리고 한 줄에set -o allexport; source conf-file; set +o allexport
HarlemSquirrel

1
Jenkins EnvInject 플러그인이 작동하지 않을 때 특성 파일을 읽는 좋은 방법입니다. 감사!
Teresa Peters

21
POSIX의 경우 @CMCDragonkai set -a; . conf-file; set +a입니다.
Charles Duffy

3
이 방법은 환경 변수에 공백이 있으면 작동합니다. 다른 많은 사람들은 그렇지 않습니다. eval () 메쏘드가하는 동안, 나는 또한 eval을 사용함으로써 조금
이상해집니다

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

다음 env.txt과 같은 경우 :

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

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

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

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


-a와 + a를 설명 할 수 있습니까?
Otto

11
@Otto는와 -a같습니다 allexport. 다시 말해, 쉘의 모든 변수 할당은 export여러 하위 프로세스에서 사용되는 환경에 할당됩니다 . 이 기사 참조 gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
Dan Kowalczyk

33

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
}

3
이것은 멋지지만 디렉토리를 떠날 때 환경 변수를 언로드합니까?
Bastian Venthur

1
변수를 설정 해제하지 않았으며 결코 문제가되지 않았습니다. 내 앱은 고유 한 변수 이름을 사용하는 경향이 있으며 겹치는 부분이 있으면 .env에서 공백으로 설정합니다 VAR=.
gsf

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

1
를 사용 eval $(cat .env | sed 's/^[^$]/export /')하면 가독성을 높이기 위해 빈 줄을 가질 수 있습니다.
마리오 Uher

2
나는 그것이 cat .env | sed 's/^[^$]/export /'초기 문자 를 제거 한다는 것을 알았습니다 . 즉 A=foo\nB=bar\n내가 얻는 파일 export =foo\nexport =bar\n입니다. 빈 줄을 건너 뛸 때 더 좋습니다 cat .env | sed '/^$/! s/^/export /'.
Owen S.

(또한 유닉스 코드 골퍼를 위해서도 필요하지 않다는 점에 주목한다 cat: eval $(sed 's/^/export /' .env)잘 작동한다.)
Owen S.

21

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

export $(xargs < .env)

설명

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

key=val
foo=bar

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

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

한정

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

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

19

다음은 sedeval을 실행하지 않거나 루비가 필요한 다른 솔루션입니다.

source <(sed -E -n 's/[^#]+/export &/ p' ~/.env)

주석으로 시작하는 행에 주석을 유지하면서 내보내기를 추가합니다.

.env 내용

A=1
#B=2

샘플 런

$ sed -E -n 's/[^#]+/export &/ p' ~/.env
export A=1
#export B=2

나는 이것을 사용하여 시스템 단위 파일EnvironmentFile 에로드 할 파일을 만들 때 특히 유용하다는 것을 알았 습니다 .


OSX에서 여러 줄을 지원하지 않습니다
Abdennour TOUMI

17

user4040650의 대답은 간단하기 때문에 파일의 주석 (예 : #으로 시작하는 줄)을 허용합니다. 변수를 설명하는 주석을 추가 할 수 있기 때문에 나에게 매우 바람직합니다. 원래 질문의 맥락에서 다시 작성하십시오.

표시된대로 스크립트를 호출하면 minientrega.sh prac1minientrega.sh는 다음을 가질 수 있습니다.

set -a # export all variables created next
source $1
set +a # stop exporting

# test that it works
echo "Ficheros: $MINIENTREGA_FICHEROS"

다음은 세트 문서 에서 추출되었습니다 .

이 내장은 너무 복잡하여 자체 섹션이 필요합니다. set을 사용하면 쉘 옵션의 값을 변경하고 위치 매개 변수를 설정하거나 쉘 변수의 이름과 값을 표시 할 수 있습니다.

[--abefhkmnptuvxBCEHPT] [-o option-name] [argument…] set [+ abefhkmnptuvxBCEHPT] [+ o option-name] [argument…] 설정

옵션이나 인수가 제공되지 않으면 set은 현재 로케일에 따라 모든 쉘 변수 및 함수의 이름과 값을 현재 설정된 변수를 설정하거나 재설정하기위한 입력으로 재사용 할 수있는 형식으로 표시합니다. 읽기 전용 변수는 재설정 할 수 없습니다. POSIX 모드에서는 쉘 변수 만 나열됩니다.

옵션이 제공되면 쉘 속성을 설정하거나 설정 해제합니다. 지정된 경우 옵션의 의미는 다음과 같습니다.

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

그리고 이것도 :

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


14

Silas Paul의 답변 개선

서브 쉘에서 변수를 내 보내면 변수가 명령에 로컬이됩니다.

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


그런 다음이를 사용 (set -a; source dev.env; set +a; rails c)하여 소싱의 이점을 얻을 수도 있습니다 (예 : 스크립트 실행 가능).
wacha

12

SAVE=$(set +o | grep allexport) && set -o allexport && . .env; eval "$SAVE"

원래 옵션이 무엇이든 관계없이 저장 / 복원합니다.

를 사용 set -o allexport하면 정규 표현식없이 주석을 올바르게 건너 뛸 수 있다는 이점이 있습니다.

set +o자체적으로 모든 현재 옵션을 bash가 나중에 실행할 수있는 형식으로 출력합니다. 또한 편리합니다. set -o모든 현재 옵션을 인간 친화적 인 형식으로 출력합니다.


2
안에 만 설정된 변수를 설정 해제 해야하는 경우 exec env -i bash호출하기 전에 기존 환경을 지우고 싶을 것입니다 . eval.env
b4hand

11

내가 찾은 가장 짧은 방법 :

귀하의 .env파일 :

VARIABLE_NAME="A_VALUE"

그런 다음

. ./.env && echo ${VARIABLE_NAME}

보너스 : 짧은 1 라이너이기 때문에 package.json파일에 매우 유용 합니다

  "scripts": {
    "echo:variable": ". ./.env && echo ${VARIABLE_NAME}"
  }

변수가 많으면 어떻습니까?
Madeo

@Madeo 라인과 같은 방식으로 원하는만큼 라인을 추가 할 수 있습니다VARIABLE_NAME="A_VALUE"
Flavien Volken

9

더 간단하게 :

  1. 파일의 내용을 잡아
  2. 빈 줄을 제거하십시오 (물건을 분리 한 경우를 대비하여)
  3. 모든 의견을 제거하십시오 (일부 추가 한 경우 ...)
  4. export모든 줄에 추가
  5. eval 모든 일

eval $(cat .env | sed -e /^$/d -e /^#/d -e 's/^/export /')

다른 옵션 ( eval@Jaydeep 덕분에 실행할 필요가 없음 ) :

export $(cat .env | sed -e /^$/d -e /^#/d | xargs)

마지막으로 인생을 정말 쉽게 만들고 싶다면 다음을 추가하십시오 ~/.bash_profile.

function source_envfile() { export $(cat $1 | sed -e /^$/d -e /^#/d | xargs); }

(BASH 설정을 다시로드하십시오! source ~/.bash_profile또는 새 탭 / 창을 만들고 문제를 해결하십시오). 다음과 같이 호출하십시오.source_envfile .env


2
파이프 라인에 대해 gitlab 비밀 변수에서 .env 텍스트를 읽어야했습니다 source <( echo $(sed -E -n 's/[^#]+/ &/ p' <(echo "${2}" | tr -d '\r')) );. 솔루션을 기반 으로이 명령이 저에게 효과적이었습니다 . 어떻게 든 gitlab은 비밀 변수를 Windows 캐리지 리턴으로 저장하므로을 사용하여 트림해야했습니다 tr -d '\r'.
metanerd

6

원래 스크립트를 사용하여 변수를 설정할 수 있지만 독립형 도트를 사용하여 다음과 같이 호출해야합니다.

. ./minientrega.sh

또한 cat | while read접근 방식에 문제가있을 수 있습니다 . 나는 접근 방식을 사용하는 것이 좋습니다 while read line; do .... done < $FILE.

다음은 실제 예입니다.

> cat test.conf
VARIABLE_TMP1=some_value

> cat run_test.sh
#/bin/bash
while read line; do export "$line";
done < test.conf
echo "done"

> . ./run_test.sh
done

> echo $VARIABLE_TMP1
some_value

대부분의 다른 답변과 달리이 솔루션은 test.conf스크립트 파일로 평가되지 않습니다 . 그것은 더 나아집니다. 스크립트가 실제로 필요하지 않는 한, 특히 누군가가 그 일이 일어나고 있거나 잊어 버린 것을 알지 못하는 경우 스크립팅을 허용하지 않는 것이 안전합니다.
meustrus

5

다른 답변을 바탕으로 PREFIX_ONE="a word"다음 과 같이 공백이있는 값을 포함하여 파일의 행 하위 집합 만 내보내는 방법이 있습니다 .

set -a
. <(grep '^[ ]*PREFIX_' conf-file)
set +a

5

여기 내 변형이 있습니다.

  with_env() {
    (set -a && . ./.env && "$@")
  }

이전 솔루션과 비교 :

  • 범위를 벗어난 변수를 누설하지 않습니다. .env 호출자에게 노출되지 않습니다)
  • 클로버하지 않습니다 set옵션을
  • 실행 된 명령의 종료 코드를 반환
  • posix 호환 사용 set -a
  • bashism을 피하기 위해 .대신에 사용source
  • .env로드에 실패하면 명령이 호출되지 않습니다
with_env rails console

인라인으로 실행할 수도 있습니다 (변수가 현재 터미널 세션에 노출됨). set -a && . ./.env && "$@" && echo "your comand here"
Giovanne Afonso

4

.envMac에서 docker-compose 및 파일로 작업하고 .env테스트를 위해 내 bash 셸로 가져오고 싶었 습니다. 여기에서 "최상의"답변은 다음 변수에서 넘어졌습니다.

.env

NODE_ARGS=--expose-gc --max_old_space_size=2048

해결책

그래서 나는을 사용 eval하고 env var defs를 작은 따옴표로 묶었습니다.

eval $(grep -v -e '^#' .env | xargs -I {} echo export \'{}\')

배쉬 버전

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.


2

이전에 제안한 솔루션에 문제가 있습니다.

  • @anubhava의 솔루션은 bash 친화적 인 구성 파일 작성을 매우 성가 시게하며 항상 구성을 내보내고 싶지 않을 수도 있습니다.
  • @Silas Paul 솔루션은 따옴표로 묶은 값에서 잘 작동하는 공백이나 다른 문자가있는 변수가 있으면 $()엉망이됩니다.

여기 내 솔루션은 여전히 ​​끔찍한 IMO이며 Silas가 해결 한 "한 아이에게만 내보내기"문제를 해결하지 못합니다 (범위를 제한하기 위해 하위 셸에서 실행할 수는 있음).

source .conf-file
export $(cut -d= -f1 < .conf-file)

2

내 요구 사항은 다음과 같습니다.

  • export접두사가 없는 간단한 .env 파일 (dotenv와의 호환성을 위해)
  • 따옴표로 묶는 값 지원 : TEXT = "alpha bravo charlie"
  • #과 빈 줄이 접두어로 붙인 주석 지원
  • mac / BSD와 linux / GNU 모두에 보편적

위의 답변에서 컴파일 된 전체 작업 버전 :

  set -o allexport
  eval $(grep -v '^#' .env | sed 's/^/export /')
  set +o allexport

1
어쨌든 "export"앞에 붙일 경우 "-o allexport"의 요점은 무엇입니까?
il--ya

2

먼저 아래와 같은 환경의 모든 키-값 쌍을 갖는 환경 파일을 만들고 내 경우에 원하는 이름을 지정하십시오. env_var.env

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

그런 다음 아래와 같이 파이썬 환경에 대한 모든 환경 변수를 내보내는 스크립트를 만들고 이름을 export_env.sh

#!/usr/bin/env bash

ENV_FILE="$1"
CMD=${@:2}

set -o allexport
source $ENV_FILE
set +o allexport

$CMD

이 스크립트는 첫 번째 인수를 환경 파일로 사용하여 해당 파일의 모든 환경 변수를 내 보낸 다음 그 후에 명령을 실행합니다.

용법:

./export_env.sh env_var.env python app.py

1

--env-file쉘에서 Docker를 재사용하려고 할 때이 스레드를 발견했습니다 . 형식 은 bash와 호환되지 않지만 간단합니다 : name=value, 따옴표 없음, 대체 없음. 그들은 또한 빈 줄을 무시하고# 주석은 합니다.

나는 posix 호환을 얻을 수 없었지만 bash와 같은 쉘에서 작동 해야하는 것이 있습니다 (OSX 10.12.5의 zsh 및 Ubuntu 14.04의 bash에서 테스트 됨).

while read -r l; do export "$(sed 's/=.*$//' <<<$l)"="$(sed -E 's/^[^=]+=//' <<<$l)"; done < <(grep -E -v '^\s*(#|$)' your-env-file)

그것은 하지 않습니다 위에 링크 된 문서의 예를 세 가지 경우를 처리 :

  • bash: export: `123qwe=bar': not a valid identifier
  • bash: export: `org.spring.config=something': not a valid identifier
  • 통과 구문을 처리하지 않습니다 (bare FOO)

1

값의 공백

여기에는 많은 훌륭한 답변이 있지만 값에 공백이 지원되지 않는 것으로 나타났습니다.

DATABASE_CLIENT_HOST=host db-name db-user 0.0.0.0/0 md5

빈 줄과 주석을 지원하여 이러한 값으로 작동하는 2 가지 솔루션을 찾았습니다.

하나는 sed 및 @ javier-buzzi 답변을 기반으로합니다 .

source <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x "&"/g' .env)

그리고 @ john1024 답변을 기반으로 루프에 읽기 줄이있는 하나

while read -r line; do declare -x "$line"; done < <(egrep -v "(^#|^\s|^$)" .env)

여기서 핵심은 declare -x큰 따옴표로 줄을 사용 하고 넣는 것입니다. 왜 그런지 모르겠지만 루프 코드를 여러 줄로 다시 포맷하면 작동하지 않습니다. 나는 bash 프로그래머가 아니며 함께 모여서 여전히 마술입니다 :)


1
sed작동 하도록 솔루션 을 수정 해야했습니다. 그러나 먼저 몇 가지 설명 : -e은 짧으며 --expression, sed수행 할 작업을 알려줍니다 . -e /^$/d출력에서 파일이 아닌 빈 줄을 삭제합니다. -e /^#/d출력에서 bash 주석 (#으로 시작하는 행)을 삭제합니다. 's/.*/declare -x "&"/g'나머지 줄을으로 바꿉니다 (대체) declare -x "ENV_VAR="VALUE"". 적어도 나에게 이것을 제공하면 효과가 없었습니다. 대신 source <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x &/g' .env)여분의 "래퍼 를 제거하기 위해을 사용해야했습니다 .
jcasner

내가 사용하지 않는 ENV_VAR="lorem ipsum", 내가 가진 ENV_VAR=lorem ipsum.env의 파일에 따옴표없이. 이제 왜 그런지 잘 모르겠지만이 파일을 구문 분석하는 다른 도구에서는 문제가 있었을 것입니다. 그리고 대신 lorem ipsum나는 "lorem ipsum"따옴표 로 가치로 끝났습니다 . 설명을위한 Thx :)
Janusz Skonieczny

1
그것이 나의 선택이라면, 나는 ENV_VAR="lorem ipsum"어느 쪽도 사용하지 않을 것 입니다. 유스 케이스에서 호스팅 제공 업체는 내가 설정 한 일부 구성 옵션을 기반 으로이 파일을 생성하고 큰 따옴표를 삽입합니다. 그래서 나는 그것을 해결해야합니다. 도움을 주셔서 감사합니다. 올바른 sed옵션을 직접 찾아 보는 데 많은 시간이 절약되었습니다 !
jcasner

1

이런 식으로 해보십시오

for line in `cat your_env_file`; do if [[ $line != \#* ]];then export $line; fi;done

1
t=$(mktemp) && export -p > "$t" && set -a && . ./.env && set +a && . "$t" && rm "$t" && unset t

작동 원리

  1. 임시 파일을 만듭니다.
  2. 모든 현재 환경 변수 값을 임시 파일에 씁니다.
  3. 소스 스크립트에서 선언 된 모든 변수를 환경으로 내보낼 수 있습니다.
  4. .env파일을 읽습니다 . 모든 변수는 현재 환경으로 내보내집니다.
  5. 소스 스크립트에서 선언 된 모든 변수를 환경으로 내보낼 수 없습니다.
  6. 임시 파일의 내용을 읽습니다. 모든 라인에는 declare -x VAR="val"각 변수를 환경으로 내보내는 것이 있습니다.
  7. 임시 파일을 제거하십시오.
  8. 임시 파일 이름을 보유하는 변수를 설정 해제하십시오.

풍모

  • 환경에 이미 설정된 변수 값을 유지합니다
  • .env 의견을 가질 수있다
  • .env 빈 줄을 가질 수 있습니다
  • .env다른 답변과 같이 특별한 머리글이나 바닥 글이 필요하지 않습니다 ( set -aset +a)
  • .envexport모든 가치 를 가질 필요는 없습니다
  • 짧막 한 농담


0

내 .env 파일은 다음과 같습니다.

DATABASE_URI="postgres://sa:***@localhost:5432/my_db"
VARIABLE_1="SOME_VALUE"
VALIABLE_2="123456788"

은 Using @henke 인용 부호를 포함하는 최대의 방법으로 내 보낸 값의 끝을"

"postgres://sa:***@localhost:5432/my_db"
"SOME_VALUE"
"123456788"

그러나 내 보낸 값에 다음 만 포함하고 싶습니다.

postgres://sa:***@localhost:5432/my_db
SOME_VALUE
123456788

이 문제를 해결하려면 따옴표를 삭제하도록 명령을 편집하십시오.

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

0

이것은 RHS의 공백에 대처하고 bash 모듈 정의와 같은 '이상한'변수를 건너 뜁니다 ( '()'가 있음).

echo "# source this to set env vars" > $bld_dir/.env
env | while read line; do
    lhs="${line%%=*}"
    rhs="${line#*=}"
    if [[ "$lhs" =~ ^[0-9A-Za-z_]+$ ]]; then
        echo "export $lhs=\"$rhs\"" >> $bld_dir/.env
    fi
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.