배치 스크립트가 상위 bash 프로세스의 환경 변수를 변경하도록 허용하는 소스에 해당하는 것이 있습니까?

배치 스크립트가 상위 bash 프로세스의 환경 변수를 변경하도록 허용하는 소스에 해당하는 것이 있습니까?

내 상황은 다음과 같습니다. 저는 Windows 컴퓨터에서 conda와 함께 Python을 사용하고 명령줄에서 주로 cygwin에서 작업합니다. 이제 conda는 virtualenv와 유사한 다양한 Python 환경을 허용하지만 환경 전환을 위한 활성화.bat 스크립트만 함께 제공됩니다. 일반적으로 나는 다음과 같은 작업을 수행 source activate env하지만 분명히 bash가 아닌 스크립트에서는 작동하지 않습니다. 내 해결 방법은 다음과 같습니다.

cmd /C "activate $1 & bash"

잘 작동하지만 해결 방법처럼 느껴지기 때문에 약간 불만족스럽습니다. 하위 프로세스의 환경 변수를 상위 프로세스로 가져오는 방법이 있습니까?

답변1

에서는 cmd기본적으로 변수가 환경으로 유출됩니다. 이를 명시적으로 방지하려면 명령을 setlocal- 로 묶어야 합니다 endlocal. 따라서 제안한 접근 방식을 사용할 수 있습니다.토마스 디키환경 변수를 .bat파일 에 call먼저 넣으십시오.

setenv.bat우리는 일반적으로 Windows 컴퓨터에서 다른 스크립트를 호출하기 전에 명령 프롬프트에서 먼저 실행하는 스크립트를 제공하여 이 작업을 수행합니다 .

편집: 상위 프로세스에 대한 환경을 설정하기 위해 때때로 다음을 수행합니다. 환경을 설명하는 키-값 쌍 파일을 만드세요.

envkey1=envval1
envkey2=envval2

상위 프로세스에서 이를 읽고 그런 식으로 환경을 조정합니다.

내 Python-fu는 그렇게 훌륭하지는 않지만 Perl에서는 다음과 같은 작업을 수행할 수 있습니다.

open(my $f, '<', 'env.txt');
while (<$f>) {
  chomp;
  my ($k, $v) = split(m/=/, $_, 2); # assumes '=' as separator
  $ENV{$k} = $v; # updates the current environment
}
close($f);

답변2

아마도 그렇지 않을 것입니다. 통화에서 "&"를 사용하는 cmd것은 가능한 한 가깝습니다. 사용하면 조금 더 깔끔하게 만들 수 있어요call"activate.bat" 스크립트의 경우.

call"상위" 배치 프로그램을 중지하지 않기 때문에 요청된 셸 "소스"에 더 가깝습니다. 나중에 스크립트에서 사용하기 전에 환경 변수를 구축하는 배치 파일에서 이것을 사용합니다.

그러나 어떤 "상위" 프로세스를 참조하고 있는지는 확실하지 않습니다.

cmd /C "activate $1 & bash"

의 상위 명령을 의미하지 않는 한 에서 activate.bat후속 명령으로 변수를 전파한다고 보고했기 때문입니다 .bashcmd

관련 정보