2015-01-20 4 views
2

쉘 스크립트에서 사용할 수 있도록 Perl에서 대소 문자를 구분하여 Windows 환경 변수를 설정하려고합니다.Perl에서 대소 문자를 구분하는 Windows 환경 변수 설정

그러나 나는 펄에서 호출 된 쉘 스크립트에서 system 명령을 사용하여 소문자로 사용하려고 시도하고 Msys로 실행할 때 환경 변수가 모두 대문자임을 알아 냈습니다. 예를 들어

, 다음 스크립트 :

#!perl 

system "echo echo TOTO=\$TOTO > toto.sh"; 
system "echo echo Titi=\$Titi >> toto.sh"; 
system "echo echo TITI=\$TITI >> toto.sh"; 
$ENV{'TOTO'}="0+0"; 
$ENV{'Titi'}="Not toto!"; 
system("sh toto.sh"); 

반환 (동안 MSYS에서 실행) 다음과 같은 출력 :

TOTO=0+0 
Titi= 
TITI=Not toto! 

는 사람이 즉 윈도우 (가능 어떻게 설정할지 여부를 알고 있나요 환경 변수 Titi이고 TITI이 아님)?

감사합니다.

+0

어떤 시스템 (OS)을 사용하고 있습니까? 제 경우 (OS X 및 Linux)에서는 작동합니다 (스크립트 작성 문장에서 달러를 인용해야했습니다). 예 : 시스템 "echo echo TOTO = '\ $ TOTO'> toto.sh"; – Matteo

+0

내가 얻을 : TOTO = 0 + 0, Titi = 아니 토륨 !, TITI = – Matteo

+0

나는 불행히도 Windows를 사용 ... 나는 질문을 업데이 트됩니다. –

답변

-1

할 수없는 것으로 보입니다. Windows는 대문자 변수 만 사용합니다.

내가 한 방법은 임시로 변수를 대문자로 바꾸고 임시 변수를 사용하여 이전 상태로 다시 전환하여 스크립트를 변환하는 것이 었습니다.

내 경우 쉘 스크립트 Run_Session.sh에서 내 보낸 변수를 처리해야했습니다. 나는 대문자 교체를 수행하기 위해 펄 스크립트를 만들었으며 이것이 결과이다.

############################### 
## SUBROUTINE uc_variables ## 
#-----------------------------# 
# This subroutine convert the environment variables exported 
# by the top level script to upper case, and can revert the operation. 
# 
# Input: 
# ----- 
# $mode: "ON" (default) or "OFF" 
# 
# Output: 
# ------ 
# N/A 
#-----------------------# 
######################### 
sub uc_variables { 
    my $mode=shift; 
    chdir $Bin; 
    if ($mode eq "OFF") { 
     foreach my $bak (glob "{*,*/*}.sh.bak") { 
      (my $orig = $bak)=~s/\.bak//; 
      move($bak,$orig); 
     } 
    } else { 
     #Check if back-up already exists 
     uc_variables("OFF") if (-e "Run_Session.sh.bak"); 
     #List variables to update 
     my %uc_var; 
     open RUN_SESSION,"<Run_Session.sh" or die "Error while reading Run_Session.sh ($!)\n"; 
     map { /export\s+(\w*[a-z]\w*)/ and ($uc_var{$1}=uc($1))=~s/Directory/DIR/i } <RUN_SESSION>; 
     close RUN_SESSION; 
     #Replace variables 
     foreach my $shell (glob "{*,*/*}.sh") { 
      #Back-up 
      copy($shell,"$shell.bak"); 
      #Read data 
      open SHELL,"<$shell" or die "Error while reading $shell ($!)\n"; 
      my $SHELL = join("", <SHELL>); 
      close SHELL; 
      #Replace 
      map { $SHELL=~s/$_/$uc_var{$_}/g } keys %uc_var; 
      #Print 
      open SHELL,">$shell" or die "Error while writing in $shell ($!)\n"; 
      print SHELL $SHELL; 
      close SHELL; 
     } 
    } 
} #end of uc_variables 
0

다음은 케이스 문제와 독립적으로 적용되어야합니다.

의 첫 번째 라인을 보자 : 당신은 당신의 명령 행에

echo echo TOTO=\$TOTO 

를 호출 할 경우

system "echo echo TOTO=\$TOTO > toto.sh"; 

을 출력 될 것입니다 :

것 같다
echo TOTO=\$TOTO 

, 무엇을 네가 원해.

그러나 시스템에서 호출하는 줄은 먼저 perl에 의해 해석되므로 이스케이프 된 $는 $가됩니다.

출력은 (스크립트에서 환경 변수를 설정하기 전에) $ TOTO의 현재 값에 따라 달라지며, 아마도 비어 있습니다.

당신은 모든 시스템을 변경해야 인용 한 것으로 호출

system 'echo echo TOTO=\$TOTO > toto.sh'; 

이 작업을 수행하면 다음과 같은 출력을 얻을 것이다 : 당신이 didn를하기 때문에 ',

TOTO=0+0 
Titi= 
TITI=not TOTO 

티티가 비어을 값을 지정하십시오.

+0

그런 긴 대답을 쓸 시간을내어 주셔서 감사합니다. 그러나, 나는 명령 줄에 "echo TOTO = $ TOTO"를 보내려는 것에 동의하지 않으므로 시스템 호출이 정확하다. 마지막 제안은 (적어도 Windows에서는) 다음과 같이 반환됩니다 : TOTO = $ TOTO. 그러나 "System 'echo echo TOTO = \ $ TOTO> toto.sh';" 그래서 단순화. 내가 가진 문제는 대문자로 저장되는 Windows 환경 변수와 관련이있는 것 같습니다. –

+0

죄송합니다. 리눅스에서 bash를 쉘로 테스트했습니다. 사례에 "sh"가 무엇입니까? Cygwin을 설치 했습니까? – nlu

+0

감사합니다. 답변과 의견을 보내 주시면 감사하겠습니다. –

1

Windows 환경 변수 식별자는 Windows 파일과 같은 방식으로 대소 문자가 구분됩니다.

TitiTITI와 동일한 변수 모두 이름이며, 그 값은 $ENV{TITI} 또는 펄 $ENV{Titi} 어느 통해 다룰수있다. 마찬가지로 명령 행에 echo %TITI%echo %Titi%도 같은 결과를 줄 것입니다.

왜 대소 문자를 구분하는 환경 변수 이름이 필요한지 설명하면 도움을 줄 수 있습니다.

+0

소문자를 사용하는 쉘 스크립트에서 호출하려고합니다. 나는 쉘 스크립트를 수정하는 것을 피하기 위해 쉘 스크립트에 대한 접근을 제한했다. –

+0

쉘 스크립트는 동일한 변수 이름의 대소 문자 버전을 사용합니까? 그렇지 않다면, 당신은 그들 사이에 구별 할 필요가 없어야하지만, 그렇다면 나는 당신이 스크립트를 수정하는 것 외에 다른 선택의 여지가 없다고 생각합니다. 당신의'쉬 '는 어디에서 왔습니까? Windows에서는 표준이 아닙니다. – Borodin

+0

스크립트는 Titi와 같이 부분적으로 소문자로 된 하나의 버전 만 사용합니다. 나는 거기에서 Mys를 설치하고 쉘을 실행한다. –