2013-12-13 2 views
1

필자의 펄 스크립트에서 환경 변수를 내 펄 변수에 넣고 싶다. 나는이펄에서 변화하는 환경 변수를 얻는 방법

$no_of_lic = $ENV{`ON_OF_ENV`}; 

할 수 있지만 같은 쉘 스크립트에서 환경 변수 변경 후 업데이트 된 값을하지 않을 경우이 처음에만 노력하고 있습니다.

내 코드 : 스크립트가 backgorund에에서 실행되는

!/usr/local/bin/perl -w 

$no_of_lic = $ARGV[0]; 

$ENV{'NO_OF_LIC'} = $no_of_lic; 

print "No of lic to be picked : $no_of_lic\n"; 

print "Environment var : $ENV{NO_OF_LIC}\n"; 

sleep(1); 

while ($no_of_lic != 0) { 

    sleep(1); 

    print "no of lic : $no_of_lic\n"; 

    #$no_of_lic = $ENV{'NO_OF_LIC'}; 

    sleep(10); 

} 

동안 내가 이렇게되면 setenv $NO_OF_ENV 5

, 난 스크립트가 업데이트 된 값으로 인쇄 할 것을 기대하고있는 환경 변수를 변경합니다 as 5

그러나 그 일은 일어나지 않습니다. 아무도이 작업을 수행 할 수 있습니까?

+6

프로그램은 시작할 때 환경에 제공됩니다. 부모 (또는 다른 프로세스)의 환경을 수정해도 하위 프로세스의 환경은 업데이트되지 않습니다. 프로그램과 통신 할 필요가 있다면, 파일을 사용하거나 (매번 루프에서 읽음) 또는 다른 IPC 메커니즘 (소켓, 데이터베이스 등)을 사용하는 것을 고려하십시오. –

+0

@KyleBurton : 답변으로 게시하십시오. – Borodin

+0

완료되었지만 이미 다른 답변이 있습니다 ... 감사합니다 @ 보로딘 –

답변

12

환경 변수의 작동 방식이 아닙니다.

Perl 스크립트가 실행되면 쉘 환경의 복제본을 가져옵니다. 그 후 Perl 스크립트가 실행되는 동안 쉘 환경에 대한 변경 사항은 Perl의 환경 사본에 표시되지 않습니다. (그리고 펄의 환경에 대한 변경 사항은 쉘에서 볼 수 없습니다.)

이것은 Perl에만 국한된 것은 아니며, 모든 스크립팅 언어는 이와 똑같이 동작합니다. 그것은 유닉스에서 환경이 구현되는 방법입니다. (그리고 Windows가 비슷하게 구현한다고 생각합니다.)

백그라운드에서 실행중인 Perl 스크립트로 새 데이터를 보내야하는 경우 FIFO (일명 "명명 된 파이프") 또는 소켓 (예 : TCP 소켓). 이 개념에 대한 더 넓은 용어는 프로세스 간 통신 (IPC)이며, perldoc의 perlipc 섹션에는 주제에 대한 더 많은 정보가 있습니다.

+0

고마워 tobyink .. IPC를 통해 이것을 해결할 수있는 모든 예가 있습니까 – user3099290

6

자식 프로세스는 부모 프로세스에서 모든 변수의 복사본을 가져옵니다. 나중에 상위 프로세스의 변수 변경은 하위 프로세스에 반영되지 않습니다.

생각해보십시오 : 프로세스의 작업 디렉토리를 변경하면 모든 하위 프로세스 (그리고 차례로 자식)의 작업 디렉토리가 변경 될 수 있습니다. 매우 불편할 것입니다.

2

프로그램 시작시 프로그램 환경이 제공됩니다. 부모 (또는 다른 프로세스)의 환경을 수정해도 하위 프로세스의 환경은 업데이트되지 않습니다. 프로그램과 통신 할 필요가 있다면, 파일을 사용하거나 (매번 루프에서 읽음) 또는 다른 IPC 메커니즘 (소켓, 데이터베이스 등)을 사용하는 것을 고려하십시오.

+0

어떻게 IPC를 사용할 수 있는지 자세히 설명해 주시겠습니까? – user3099290

관련 문제