2016-06-12 5 views
-1

perl 스크립트의 도움으로 쉘 변수 이름을 설정하려고했습니다.도움말 perl 스크립트로 쉘 변수 설정

하지만 잘 돌아 가지 않았습니다.

system("variable_name=\"variable_value\""); 
`variable_name=\"variable_value\"`; 

아무튼 왜 작동하지 않는지 말해주세요.

사실 내 질문은 조금 다릅니다. perl 스크립트의 도움으로 환경 "setenv"를 설정하는 방법을 알고 싶습니다. 나는 $ENV{"VARIABLE_NAME"} = "home\/path_1\/path_2\/path_3";

가 그럼 난 후 나에게 내가 펄 스크립트에서 설정된 경로를 제공하지 않는 명령 에코 $의 VARIABLE_NAME을 발사 시도했습니다.

감사합니다.

+2

가능한 중복 1. [Perl 스크립트 내에서 셸 변수를 내보내는 방법] (http://stackoverflow.com/questions/2967762/how-to-export-a-shell-variable-within-a-perl -script), 2 .. [Perl 스크립트를 통한 환경 변수 설정] (http://stackoverflow.com/questions/19192682/setting-an-environment-variable-through-a-perl-script), 3 .. [어떻게 펄에서 환경 변수를 설정합니까?] (http://stackoverflow.com/questions/1747796/how-do-i-set-an-environment-variable-in-perl) –

+0

사실 내 질문은 조금 다른. perl 스크립트의 도움으로 환경 "setenv"를 설정하는 방법을 알고 싶습니다. $ ENV { "VARIABLE_NAME"} = "집/경로 1 \/경로 2 \/경로 3"; 그런 다음 echo $ VARIABLE_NAME 명령을 실행하면 perl 스크립트에서 설정 한 경로가 표시되지 않습니다. 미리 도움을 주셔서 감사합니다. –

+0

당신이하고 싶은 것이 아직 불분명합니다. 자체적 인 재생산기를 추가하는 것이 좋습니다. 즉, 질문을 할 때 * 할당을 수행하고 할당을 사용하고 코드의 실제 출력과 예상 출력을 제공하는 * 코드를 포함하는 것입니다. –

답변

1

문제는 다음 system 명령이 첫 번째 셸에서 설정된 변수에 대해 알지 못하는 새 셸을 실행한다는 것입니다.

system 'x=value; echo $x'; # Outputs "value". 
system 'echo $x';   # Empty line - the shell with $x doesn't exist anymore. 
+0

물론 그렇지 않습니다. 완전히 다른 과정입니다. x를 환경 변수로 만들고 부모 프로세스 (즉,'system'을 호출하는 펄 프로세스 내부)에 환경 변수를 설정해야합니다. – user1934428

+0

사실 제 질문은 조금 다릅니다. perl 스크립트의 도움으로 환경 "setenv"를 설정하는 방법을 알고 싶습니다. $ ENV { "VARIABLE_NAME"} = "집/경로 1 \/경로 2 \/경로 3"; 그런 다음 echo $ VARIABLE_NAME 명령을 실행하면 perl 스크립트에서 설정 한 경로가 표시되지 않습니다. 도움을 주셔서 미리 감사드립니다. –

+0

@AshutoshRawal : 저를 위해서 일합니다.'perl -we '$ ENV {VAR} = q (a/b/c); 시스템 q (echo $ VAR) ''. 변수는 큰 따옴표로 보간되며 Perl은 쉘 변수를 의미한다는 것을 알지 못합니다. – choroba

3

환경 변수를 설정하기 위해 새 셸을 실행할 필요가 없습니다. 값을 계승 한 셸의 살아남은 자식을 제외하고는 값이 할당 된 셸에서 수명이 지났기 때문에 실제로 그렇게하는 것은 비생산적입니다.

당신은 단순히 당신의 펄에서 직접 환경 변수를 설정할 수 있습니다

$ENV{"variable_name"} = "variable_value" 

당신이 당신의 펄 스크립트에서 시작 이후의 쉘이 표시됩니다.

+0

환경 변수를 새 셸에서 유지하고 Perl 스크립트에서 반환하지 않기를 원한다면 다음과 같이 할 수도 있습니다 :'system ($ ENV { 'SHELL'}); 'kill', getppid(); ' –

+0

@LexScarisbrick, ... 응? 'system ($ ENV { 'anything'})'은 끔찍한 생각입니다. 데이터를 문자열로 대체 한 다음 sh -c로 넘겨 주면 쉘 변수의 값을주의 깊게 검사하지 않는 한 쉘 주입 취약점의 제조법이됩니다. 그리고 위의 귀하의 의견에있는 코드가 더 일반적으로 달성하고자하는 것이 무엇인지 명확하지 않습니다. 하위 프로세스를 포크 화하려면 환경 변수를 설정 한 다음 쉘을 exec하여 해당 펄 프로세스를 명시 적으로 바꾸십시오. –

+0

공정한 포인트. 질문의 의도가 "쉘에서'소스 파일 '을 수행하는 것과 동등한 펄은 무엇입니까? (틀린) 가정을하고있었습니다." Perl 내부에서 환경 변수를 설정하고,'system()'을 호출하여 새로운 쉘을 호출 한 다음 Perl을 호출 한 프로세스를 효과적으로 종료하면이 작업이 수행됩니다. 그러나. 앞서 언급했듯이 새 셸을 호출하는 것은 보안 위험으로 인해 환경 변수를 기반으로해서는 안됩니다. –

관련 문제