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
했지만 동일한 문제가 여전히 적용됩니다.
어쩌면 이것을 수행하는 다른 방법이있을 수 있습니다. 스크립트의 인수로 전달하는 파일의 환경 변수를 사용해야합니다.
답변
접근 방식의 문제 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
답변
도움이 될 수 있습니다.
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
것이고 그것은 우리가 정확히 필요한 것입니다!
한정
- 값에 공백이있는 경우는 처리하지 않습니다. env와 같은 명령이이 형식을 생성합니다. – @Shardj