programing

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

showcode 2023. 4. 10. 22:25
반응형

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

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


참고로, 다음은 질문의 원본 버전과 예시입니다.

특정 폴더에 3개의 변수가 있는 파일을 해석하는 스크립트를 bash에 쓰고 있습니다.이것이 그 중 하나입니다.

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

은 이음음음음음음음음음음음 is is this에 되어 있습니다../conf/prac1

스크립트 ★★★★★★★★★★★★★★★★★」minientrega.sh그런 다음 다음 다음 코드를 사용하여 파일을 해석합니다.

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

내가 '아예'를 실행하면minientrega.sh prac1

도 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★source ./conf/$1 같은 가 여전히 된다.

다른 방법이 있을 수 있습니다.전달하는 파일의 환경변수를 스크립트의 인수로 사용하면 됩니다.

이것은 도움이 될 수 있습니다.

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

는 시험해보고 때 입니다..env내 레일 콘솔에 있는 것들.

가브리엘프가 변수를 로컬로 유지하는 좋은 방법을 생각해냈어요이를 통해 프로젝트 간에 발생할 수 있는 문제를 해결할 수 있습니다.

env $(cat .env | xargs) rails

bash 3.2.51(1)-release


업데이트:

" "로 #, (Pete의 코멘트 덕분에) 다음을 사용합니다.

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 시스템에 있습니다.


답변에서 다음과 같이 OS를 자동 검출할 수 있습니다.

export-env.sh

#!/bin/sh

## Usage:
##   . ./export-env.sh ; $COMMAND
##   . ./export-env.sh ; echo ${MINIENTREGA_FECHALIMITE}

unamestr=$(uname)
if [ "$unamestr" = 'Linux' ]; then

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

elif [ "$unamestr" = 'FreeBSD' ] || [ "$unamestr" = 'Darwin' ]; then

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

fi

-o allexport그럼 다음 변수 정의를 모두 내보낼 수 있습니다. +o allexport는 이 기능을 디세블로 합니다.

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

는 '''입니다.export while루프가 서브셸에서 발생하고 있으며 이러한 변수는 현재 셸(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
set -a
. ./env.txt
set +a

ifenv.txt음음음같 뭇매하다

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

설명 - a는 allexport와 동일합니다.즉, 셸 내의 모든 변수 할당은 환경으로 내보내집니다(복수의 하위 프로세스에서 사용).자세한 내용은 Set built-in 매뉴얼을 참조하십시오.

-a 생성 또는 수정되는 각 변수 또는 함수에는 내보내기 속성이 부여되며 후속 명령어 환경으로 내보내기 위해 마킹됩니다.

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

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

export $(xargs < .env)

설명.

.env다음과 같이 합니다.

key=val
foo=bar

려려를 xargs < .env 획득하다key=val foo=bar

에는 '어느 정도'를 받게 될 거예요.export key=val foo=bar게게바바로리리리리!!!!!!!!!!

제한

  1. 값에 공백이 있는 경우는 취급하지 않습니다.env 등의 명령어는 이 형식을 생성합니다.– @Shardj

allexport에도 몇 되어 있습니다.이에 대해서는, 「선택할 수 없습니다」라고 하는 것이 있습니다.set -a.되는 환경변수를 보다 훨씬 .env를 소싱하면 코멘트, 공백 행 및 명령어로 생성되는 환경변수를 사용할 수 있기 때문에 행 위에 루프하여 내보내는 것보다 훨씬 좋습니다.my .my .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 /')

source 파일에는 bash 구문이 됩니다.「 bash 」이치노=,",',<,>, 입니다.그래서 그냥 이렇게 할 수도 있어요.

source development.env

효과가 있을 거야

단, 이 버전에서는 값의 모든 특수문자는 사용할 수 있습니다.

set -a
source <(cat development.env | \
    sed -e '/^#/d;/^\s*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g")
set +a

설명:

  • -a bash가 합니다.
  • /^#/d는 코멘트코멘트」로 를합니다.#)
  • /^\s*$/d 공간을 한 빈합니다.
  • "s/'/'\\\''/g" 를 따옴표로 .'\''는 따옴표를
  • "s/=\(.*\)/='\1'/g" ""를 합니다.a=ba='b'

그 결과 특수문자를 사용할 수 있습니다.

, 를 치환합니다.sourcecat이 명령어를 실행하면 어떤 결과가 나오는지 알 수 있습니다.

또 .sed 루비를로 하지 않습니다.alval은 다음과 같습니다.

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

systemd 유닛파일에 로딩하기 위한 파일을 작성할 때 특히 유용합니다.

왜 그랬는지, 뭘 놓쳤는지는 모르겠지만, 대부분의 답을 찾아봤지만 실패한 후에요.이 .env 파일을 통해 알게 되었습니다.

MY_VAR="hello there!"
MY_OTHER_VAR=123

간단하게 할 수 있습니다.

source .env
echo $MY_VAR

력::Hello there!

Ubuntu Linux 에서는 정상적으로 동작하고 있는 것 같습니다.

user40650의 답변은 둘 다 단순하고, 변수를 설명하는 코멘트를 추가할 수 있기 때문에 파일(#으로 시작하는 행)에 코멘트를 넣을 수 있는 것이 매우 바람직합니다.원래 질문의 맥락으로 다시 쓰는 것뿐이에요.

가 지정된:minientrega.sh prac1그럼 ., 다음가질 수 .

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

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

세트 매뉴얼에서 추출한 내용은 다음과 같습니다.

이 빌트인은 매우 복잡하기 때문에 독자적인 섹션을 가질 가치가 있습니다.set을 사용하면 셸 옵션의 값을 변경하고 위치 파라미터를 설정하거나 셸 변수의 이름과 값을 표시할 수 있습니다.

set [--abefhkmnptuvxBCE]HPT] [-o option-name][인수...] set [+abefhkmnptuvxBCE]HPT] [+o option-name][인수...]

옵션 또는 인수를 지정하지 않은 경우 set은 현재 설정된 변수를 설정 또는 리셋하기 위해 입력으로 재사용할 수 있는 형식으로 모든 셸 변수 및 함수의 이름과 값을 현재 로케일에 따라 정렬하여 표시합니다.읽기 전용 변수는 재설정할 수 없습니다.POSIX 모드에서는 셸 변수만 나열됩니다.

옵션이 지정되면 셸 속성을 설정 또는 해제합니다.옵션(지정되어 있는 경우)의 의미는 다음과 같습니다.

-a 생성 또는 수정되는 각 변수 또는 함수에는 내보내기 속성이 부여되며 후속 명령어 환경으로 내보내기 위해 마킹됩니다.

그리고 이것도 마찬가지입니다.

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

내가 찾은 가장 빠른 방법:

의 ★★★★★★★★★★★★★★★★★..env 삭제:

VARIABLE_NAME="A_VALUE"

그럼 그냥

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

보너스: 짧은 원라이너이기 때문에 매우 편리합니다.package.json

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

참고: 이 방법으로는 변수가 하위 프로세스로 내보내지지 않습니다. 필요한 경우 다른 답변을 확인하십시오.

사일러스 폴의 답변 개선

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

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

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

그러면 원래 옵션이 저장/복원됩니다.

「」를 사용합니다.set -o allexport에는 정규식을 사용하지 않고 코멘트를 적절히 건너뛸 수 있는 장점이 있습니다.

set +o가 나중에할 수 있는 을 모두 합니다.: ★★★★★★★★★★★★★★★★★★★:set -o현재 옵션을 모두 인간 친화적인 형식으로 출력합니다.

제 변형은 다음과 같습니다.

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

이전 솔루션과의 비교:

  • ( 「의 의 값)는 누설되지 ..env★★★★★★★★★★★★★★★★★★★★★★★★★★★★」
  • 않다set(옵션)
  • 실행된 명령어의 종료 코드를 반환합니다.
  • Posix 사용set -a
  • .source
  • 되지 않습니다..env 실패
with_env rails console

ifenv는 을 지원합니다.-S에서는 줄 이나 이스케이프 를 사용할 수 .\n ★★★★★★★★★★★★★★★★★」\t(환경 참조):

env -S "$(cat .env)" command

.env「 」:

KEY="value with space\nnewline\ttab\tand
multiple
lines"

테스트:

env -S "$(cat .env)" sh -c 'echo "$KEY"'

심플화:

  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

shdotenv 사용

및 준거 . 구문 .posix .env .env dot 。
https://github.com/ko1nksm/shdotenvhttpsgithub.com/ko1nksm/

eval "$(shdotenv)"

사용.

Usage: shdotenv [OPTION]... [--] [COMMAND [ARG]...]

  -d, --dialect DIALECT  Specify the .env dialect [default: posix]
                           (posix, ruby, node, python, php, go, rust, docker)
  -s, --shell SHELL      Output in the specified shell format [default: posix]
                           (posix, fish)
  -e, --env ENV_PATH     Location of the .env file [default: .env]
                           Multiple -e options are allowed
  -o, --overload         Overload predefined environment variables
  -n, --noexport         Do not export keys without export prefix
  -g, --grep PATTERN     Output only those that match the regexp pattern
  -k, --keyonly          Output only variable names
  -q, --quiet            Suppress all output
  -v, --version          Show the version and exit
  -h, --help             Show this message and exit

요구 사항들

shdotenv는 awk 스크립트가 내장된 단일 파일셸 스크립트입니다

  • POSIX 쉘(대시, bash, ksh, zsh 등)
  • awk(gawk, nawk, mawk, busybox awk)

도커 컴포넌트와.envMac " ( Import)를 Import하려고 ..env(쉘에 은 다음 () bash bash입니다.여기서 "최적의" 답은 다음 변수에 대한 오류입니다.

.env

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

솔루션

결국 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★eval따옴표로 env var defs quotes env var defs 。

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

Bash 버전

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
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(예: 른른른 like like like like like like like does does does does does does does does does does does does does does does does does does does does does does does does does does does does does does does does does does does does 。set -a ★★★★★★★★★★★★★★★★★」set +a)
  • .env는 필요 .export 값에 대해
  • 원라이너

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

. ./minientrega.sh

, 한한에 also also with with with with with with with with with with 에 문제가 있을 수 있습니다.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

으로 파일에는 공백이 있는 됩니다.PREFIX_ONE="a word":

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

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

  • 파일이 단순한 .env 파일(.env 파일)export)
  • 따옴표로 묶인 지원 값: TEXT="alpha bravo charlie"
  • # 및 빈 행이 앞에 붙은 지원 코멘트
  • mac/B 모두 범용SD 및 Linux/GNU

위의 답변에서 컴파일된 완전한 기능 버전:

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

이전에 제안한 해결책에 문제가 있습니다.

  • @anubhava의 솔루션은 bash 친화적인 설정 파일을 매우 빠르게 쓰는 것을 성가시게 합니다.또한 설정을 항상 내보내는 것은 아닙니다.
  • @로 둘러싸인 값이 가 있는 만, @Silas Paul은 과 같습니다$()엉망진창으로 만들죠

여기 제 솔루션이 있습니다.IMO는 여전히 매우 엉망이며, Silas가 대처하는 "한 자녀에게만 내보내기" 문제는 해결되지 않습니다(범위를 제한하기 위해 서브셸로 실행할 수도 있습니다).

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

내 .env:

#!/bin/bash
set -a # export all variables

#comments as usual, this is a bash script
USER=foo
PASS=bar

set +a #stop exporting variables

호출:

source .env; echo $USER; echo $PASS

레퍼런스 https://unix.stackexchange.com/questions/79068/how-to-export-variables-that-are-set-all-at-once

내 버전:

파일을 인쇄하고 주석 줄과 빈 줄을 제거한 후 "=" 기호에서 키/값을 분할합니다.그런 다음 export 명령을 적용하기만 하면 됩니다.

이 솔루션의 장점은 파이프, html 태그 등의 값에 특수 문자를 포함할 수 있으며 실제 속성 파일과 같이 값을 따옴표로 묶을 필요가 없다는 것입니다.

# Single line version
cat myenvfile.properties | grep -v '^#' | grep '=' | while read line; do IFS=\= read k v <<< $line; export $k="$v"; done

# Mutliline version:
cat myenvfile.properties | grep -v '^#' | grep '=' | while read line; do 
  IFS=\= read k v <<< $line
  export $k="$v"
done

이것에 대한 제 생각은 이렇습니다.다음과 같은 요건이 있었습니다.

  • 코멘트된 행 무시
  • 값에 공백 허용
  • 빈 줄 허용
  • .env로 기본 설정하면서 커스텀 env 파일을 전달할 수 있습니다.
  • 인라인으로 명령어 내보내기 및 실행 허용
  • env 파일이 존재하지 않으면 종료합니다.
source_env() {
  env=${1:-.env}
  [ ! -f "${env}" ] && { echo "Env file ${env} doesn't exist"; return 1; }
  eval $(sed -e '/^\s*$/d' -e '/^\s*#/d' -e 's/=/="/' -e 's/$/"/' -e 's/^/export /' "${env}")
}

함수를 .bash_profile 또는 동등한 파일에 저장한 후 사용:

source_env                # load default .env file
source_env .env.dev       # load custom .env file
(source_env && COMMAND)   # run command without saving vars to environment

하비에르와 다른 댓글에서 영감을 얻었다.

값의 공백

여기에는 많은 훌륭한 답변이 있지만, 가치의 공백 공간에 대한 지원이 모두 부족하다는 것을 알게 되었습니다.

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

빈 행과 코멘트를 지원하면서 이러한 값에 맞는 솔루션을 2개 찾았습니다.

하나는 sed와 @javier-buzi의 답변을 기반으로 합니다.

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이치노이유는를 여러 저는.이것들은 이지지지 i me i me i i i i i i i i 。쾅쾅거리다이것들을 게걸스럽게 먹어치웠을 뿐이에요:)

과 같은 을 모두 , 제 을 붙입니다.env_var.env

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

다음 를 만들고 python을 python으로 합니다.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

@Dan Kowalczyk에서 변경

는 이것을 거거에 .~/.bashrc.

set -a
. ./.env >/dev/null 2>&1
set +a

Oh-my-Zsh의 dotenv 플러그인과 매우 잘 호환됩니다.(Oh-my-bash는 있지만 dotenv 플러그인은 없습니다.)

언급URL : https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-value-pairs

반응형