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


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.