파일에서 변수를 내보내는 방법?


80

tmp.txt내보낼 변수가 포함 된 파일이 있습니다. 예를 들면 다음과 같습니다.

a=123
b="hello world"
c="one more variable"

export명령을 사용하여 이러한 모든 변수를 내 보내서 나중에 하위 프로세스에서 사용할 수 있도록 하려면 어떻게해야합니까?


1
bash --init-file somefile.blah -c "command"
Dillian Murphey

SO는 디렉토리에 들어갈 때 파일자동으로 소싱.env 하는 방법에 대한 유용한 답변을 제공합니다 cd.
Dan Dascalescu

@Neerav 다른 답변을 수락하십시오. 그것은 훨씬 더 나은 해결책입니다.
coderDude

답변:


65
source tmp.txt
export a b c
./child ...

다른 질문으로 판단하면 변수 이름을 하드 코딩하고 싶지 않습니다.

source tmp.txt
export $(cut -d= -f1 tmp.txt)

그것을 테스트 :

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable

2
예를 들어 환경 파일에 주석이 포함되어 있으면 작동하지 않습니다. (예 : systemd의 EnvironmentFile에서 재사용 할 수있는 파일)
Chris Lamb

3
@ChrisLamb 당신은 grep코멘트를 건너 뛰는 데 사용할 수 있습니다 :export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee

182
set -a
. ./tmp.txt
set +a

set -a지금부터 정의 된 변수 ¹가 자동으로 내보내집니다. Bourne과 같은 쉘에서 사용할 수 있습니다. .의 표준 및 Bourne의 이름을 source내가 이동성 (그것을 선호 있도록 명령 source에서 오는 csh등 가장 현대적인 본쉘에서 사용할 수 있습니다 bash(때로는) 약간 다른 행동하지만).

POSIX 셸에서는 set -o allexport보다 설명적인 대체 방법으로 쓸 수도 있습니다 ( set +o allexport설정 해제).


¹에서로 선언 된 bash모든 함수allexport 가 환경으로 내보내 지도록합니다 (로 실행되는 경우에도 해당 환경에서 BASH_FUNC_myfunction%%모든 bash셸에서 가져온 환경 변수 로 sh).


1

그냥 해:

while read LINE; do export "$LINE"; done < ./tmp.txt

그것이 작동하는지 확인 했습니까?
RalfFriedl

@RalfFriedl 이것이 작동 해야하는 이유는 무엇입니까? 매우 우아하지 않고 소싱하는 set -a것이 훨씬 간단하지만 실제로 작동합니다.
terdon

깨지기 쉽다. 입력 파일에 주석을 허용하지 않고 인용 된 변수 값을 올바르게 처리하지 않으며 여러 줄 변수에서 실패합니다. 여러 줄 변수가 많지 않지만 정기적으로 주석을 사용하고 종종 변수 값에 따옴표를 사용해야합니다.
루이

그것은 나를 위해 일했다.
mchawre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.