변수를 내보내지 않고 단일 프로세스의 텍스트 파일(.env)에서 변수를 로드하는 방법은 무엇입니까?

변수를 내보내지 않고 단일 프로세스의 텍스트 파일(.env)에서 변수를 로드하는 방법은 무엇입니까?

참고: 이 일반적인 주제는 여러 SE 사이트에서 지루하게 다루어지는 것 같습니다. 그러나 모든 세부 사항을 주의 깊게 읽어 보십시오. 아래에 설명된 모든 기준을 다루는 질문을 찾지 못했습니다.

zsh또한: 아래 예에서는 사용하고 있습니다. 나는 POSIX 호환 솔루션을 갖고 싶지만 그것이 꼭 필요한 요구 사항은 아닙니다. 작동 bash하고 zsh충분히 좋은 것입니다.

다음은 질문 제목을 명확히 하는 데 도움이 되는 예입니다.

다음 두 파일이 있다고 가정해 보겠습니다.

% ls -AF
.env    printenv*

% cat printenv
echo $LOCAL_MESSAGE_1
echo $LOCAL_MESSAGE_2

% cat .env
LOCAL_MESSAGE_1="hello world"
LOCAL_MESSAGE_2="goodnight moon"

스크립트를 실행 printenv하고 다음 내용을 확인하고 싶습니다 stdout.

hello world
goodnight moon

이러한 변수가 내 환경에 없으면 스크립트는 예상대로 빈 줄을 인쇄합니다.

% unset LOCAL_MESSAGE_1

% unset LOCAL_MESSAGE_2

% ./printenv


스크립트를 실행하기 전에 변수를 설정하면 해당 변수는 스크립트에서 사용할 수 있지만 해당 단일 프로세스에서만 사용할 수 있으며 동일한 셸에서 시작된 후속 프로세스에서는 사용할 수 없습니다.

% LOCAL_MESSAGE_1="hello world" LOCAL_MESSAGE_2="goodnight moon" ./printenv
hello world
goodnight moon

% ./printenv


그래서 제 질문은 다음과 같습니다. 다음 기준에 따라 이전 예제의 동작을 어떻게 복제할 수 있습니까?

  1. printenv하위 쉘이 아닌 현재 쉘에서 수정되지 않은 상태로 실행됩니다(감사합니다루딕) — 원하는 출력을 얻는 동시에
  2. 파일에서 변수를 로드하는 .env동시에
  3. 이 프로세스에서 호출한 지역 변수를 유지합니다. 이 변수는 셸 환경과 후속 프로세스에서 설정되지 않은 상태로 유지됩니다.unset필요 없어

이를 수행하기 위해 어떤 한 줄 구문을 사용할 수 있습니까? 위의 기준을 충족하려면 아래 물음표를 대체하려면 무엇을 사용해야 합니까?

% ?????????? ./printenv
hello world
goodnight moon

답변1

서브셸(in)에서 실행해 보셨나요 bash? 좋다

( . .env; . ./printenv )
hello world
goodnight moon

이렇게 하면 printenv스크립트에 LOCAL 변수만 설정되고 상위 셸의 환경은 변경되지 않은 채 유지됩니다.

새로운 확장 요구 사항(하위 쉘 없음)에 따라 (인기 없고 위험한) 접근 방식을 시도해 보십시오 eval.

eval $(< .env) ./printenv
hello world
goodnight moon

변수 정의와 명령을 한 줄에 넣은 다음 eval해당 줄을 실행합니다.

답변2

그리고runenv(이것은 다음과 같은 패키지의 일부입니다.범인- 일명 가해자):

runenv env_file command

~ 할 것이다
" command수정 없이(하위 쉘이 아닌) 현재 ​​쉘에서 실행하고 원하는 출력을 얻는 동시에 에서 변수를 로드하는 env_file동시에 해당 프로세스 호출에 대한 로컬 변수를 유지합니다. 해당 변수는 쉘 환경 및 후속 쉘 환경에서 사용할 수 있습니다. 프로세스 중에 설정되지 않은 상태로 남아 있는 항목은 설정을 해제할 필요가 없습니다."

답변3

".script" 구문을 사용하여 셸에 스크립트를 제공할 수 있습니다.

. .env && ./printenv

printenv 스크립트 시작 부분에 "..env"를 추가할 수도 있습니다. 그러면 printenv를 실행할 수 있습니다:

./printenv

"printenv"는 쉘에서 사용되기 때문에 좋은 이름 선택이 아닙니다.

관련 정보