참고: 이 일반적인 주제는 여러 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
그래서 제 질문은 다음과 같습니다. 다음 기준에 따라 이전 예제의 동작을 어떻게 복제할 수 있습니까?
printenv
하위 쉘이 아닌 현재 쉘에서 수정되지 않은 상태로 실행됩니다(감사합니다루딕) — 원하는 출력을 얻는 동시에- 파일에서 변수를 로드하는
.env
동시에 - 이 프로세스에서 호출한 지역 변수를 유지합니다. 이 변수는 셸 환경과 후속 프로세스에서 설정되지 않은 상태로 유지됩니다.
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
답변3
".script" 구문을 사용하여 셸에 스크립트를 제공할 수 있습니다.
. .env && ./printenv
printenv 스크립트 시작 부분에 "..env"를 추가할 수도 있습니다. 그러면 printenv를 실행할 수 있습니다:
./printenv
"printenv"는 쉘에서 사용되기 때문에 좋은 이름 선택이 아닙니다.