child process 에서 설정한 환경 변수는, parent process 에 영향을 미칠 수 없습니다.
반대로 parent process 에서 export 된 환경 변수는 child process 에 전달됩니다.
bash.bs 에서 환경 변수를 export 하고 perl.pl 을 실행하면..
child process 인 perl.pl 에서는 그 환경 변수를 이용할 수 있지만..
그 반대로 perl.pl 에서 export 한 환경 변수는, parent 인 bash.bs 로 전달 할 수 없다는 의미입니다.
이런 경우 대개는 perl.pl 같은 애가 변수의 내용을 print 로 출력하고, 호출한 애가 그 값을 받아서..
명시적으로 export 하는 형태로 사용합니다.
그게 맨 첫 댓글에 있는 방식입니다.
아니면 아예 perl 에서 print 'export hello=world' 와 같이 shell 의 export 문법을 쓰고..
shell script 에서 eval `perl.pl` 과 같이 eval 로 처리해도 됩니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
흐음~. 저는 변수명을 perl 스크립트 안에서 정해주는 것이 좋지 않아보입니다. modularity를 깨는 것이지요. perl을 그렇게 사용하는 분들이 많지만 권장할 사항은 아닌 듯 합니다. 안쪽 스코프에서 정의한 변수 이름이 바깥쪽 스코프에 보이는 것은 좋지 않습니다.
만약에 여러 값을 리턴해야할 필요가 있어서 그렇다면, 저라면 이렇게 하겠습니다.
#!/usr/bin/env perl
print "1,2,3 world bar";
#!/usr/bin/env bash
ret=($(./perl.pl))
array=(${ret[0]//,/ }) # / 와 } 사이 공백에 주의
hello=${ret[1]}
foo=${ret[2]}
일견 더 복잡해 보이지만 유지 보수와 확장성 측면에서 어쩔 수 없는 선택이라고 생각합니다.
이미 두 개의 파일이 변수나 그 값을 공유해야 하는 상태라면, modularity 는 고려하기 어렵지 않나 생각되네요.
특히나 다양한 변수 또는 값을 공유해야 하는 경우, 별도 규칙을 만들어 파싱해야 하는데..
단순히 eval 로 처리하는 것보다 추가 작업이 필요하고, 내용이 변경 되는 경우 손 댈 부분이 늘어나니까요.
더구나 위의 eval 은 source 나 . (dot) 명령을 사용해서 변수들을 읽어 들이는 것과 동일한 상황이라..
큰 차이는 없다고 생각합니다.
그냥 상황에 맞게 편한 대로 골라쓰면 되지 않을까 싶네요.
저는 source 나 . 을 쓰는 경우에 (위의 eval 도 마찬가지로), 다음과 같이 한 줄 추가 해서..
문서화 겸, 그 파일에서 설정되어야 하는 변수들이 실수로 누락되는 경우를 방지합니다.
command substitution
bash command substitution 에 대해 찾아보시고, 말씀하신 바와 직접 관련은 없지만 시간이 있으시면 공부 삼아서 bash process substitution 에 대해서도 찾아보세요.
제가 원하는 질문은 두개파일을 혼용했을때입니다.
예를 들어 perl.pl
bash.bs
두개에 파일이있는데
bash.bs 파일내에서 아래와 같이 perl.pl
perl.pl을 실행시켰을때
perl.pl내에 변수를 bash.bs에서 사용하고자 하는거에요
반대는 가능한데 ...
음 ..
child process 에서 설정한 환경 변수는, parent process 에 영향을 미칠 수 없습니다.
반대로 parent process 에서 export 된 환경 변수는 child process 에 전달됩니다.
bash.bs 에서 환경 변수를 export 하고 perl.pl 을 실행하면..
child process 인 perl.pl 에서는 그 환경 변수를 이용할 수 있지만..
그 반대로 perl.pl 에서 export 한 환경 변수는, parent 인 bash.bs 로 전달 할 수 없다는 의미입니다.
이런 경우 대개는 perl.pl 같은 애가 변수의 내용을 print 로 출력하고, 호출한 애가 그 값을 받아서..
명시적으로 export 하는 형태로 사용합니다.
그게 맨 첫 댓글에 있는 방식입니다.
아니면 아예 perl 에서 print 'export hello=world' 와 같이 shell 의 export 문법을 쓰고..
shell script 에서 eval `perl.pl` 과 같이 eval 로 처리해도 됩니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
이미 ymir 님께서 설명해주셨지만, 간단히
이미 ymir 님께서 설명해주셨지만, 간단히 정리하자면
#!/usr/bin/env bash
흐음~. 저는 변수명을 perl 스크립트 안에서
흐음~. 저는 변수명을 perl 스크립트 안에서 정해주는 것이 좋지 않아보입니다. modularity를 깨는 것이지요. perl을 그렇게 사용하는 분들이 많지만 권장할 사항은 아닌 듯 합니다. 안쪽 스코프에서 정의한 변수 이름이 바깥쪽 스코프에 보이는 것은 좋지 않습니다.
만약에 여러 값을 리턴해야할 필요가 있어서 그렇다면, 저라면 이렇게 하겠습니다.
일견 더 복잡해 보이지만 유지 보수와 확장성 측면에서 어쩔 수 없는 선택이라고 생각합니다.
음 ..
이미 두 개의 파일이 변수나 그 값을 공유해야 하는 상태라면, modularity 는 고려하기 어렵지 않나 생각되네요.
특히나 다양한 변수 또는 값을 공유해야 하는 경우, 별도 규칙을 만들어 파싱해야 하는데..
단순히 eval 로 처리하는 것보다 추가 작업이 필요하고, 내용이 변경 되는 경우 손 댈 부분이 늘어나니까요.
더구나 위의 eval 은 source 나 . (dot) 명령을 사용해서 변수들을 읽어 들이는 것과 동일한 상황이라..
큰 차이는 없다고 생각합니다.
그냥 상황에 맞게 편한 대로 골라쓰면 되지 않을까 싶네요.
저는 source 나 . 을 쓰는 경우에 (위의 eval 도 마찬가지로), 다음과 같이 한 줄 추가 해서..
문서화 겸, 그 파일에서 설정되어야 하는 변수들이 실수로 누락되는 경우를 방지합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
음 ..
그냥 modularity 관점에서 한 번 생각해 봤습니다.
말 그대로 include 하려는 파일에서 내부적으로 변수들을 고정하는 경우는..
어떤 변수들이 있는지 직관적으로 알기 어렵기 때문에 선호하지 않는 분들도 있는 것 같습니다.
(그래서 제가 : ${var?} 로 체크하는 이유이기도 합니다.)
근데 모듈화의 관점이라면 결국은
foo=$(./foo.sh)
var=$(./var.sh)
...
와 같이 각각의 변수 할당, 즉 기능 별로 파일들을 쪼개줘야 하는게 맞지 않나 생각되네요.
단위 함수처럼 하나의 기능만 동작하도록 만들어서 풀어줘야 직관적으로 이해하기 쉽고..
유지보수 하기도 편하지 않을까 생각됩니다.
물론 foo.sh 나 var.sh 가 공통으로 사용해야 하는 루틴이 있다면...
이거 역시 function 으로 빼서, lib.sh 와 같은 녀석으로 몰아 넣은 후에..
. 명령으로 include 하면 되겠구요. (init script 들이 이런식으로 만들어져 있죠.)
근데 변수들이 많아질수록 파일들이 많이 필요하고, 관리 포인트가 늘어나기 때문에...
적절한 시점에서는 . 명령 한방으로 해결하는게 더 이득이 되는 시점이 오게 될 것 같네요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
제가 원하는 질문은 두개파일을 혼용했을때입니다.
예를 들어 perl.pl
bash.bs
두개에 파일이있는데
bash.bs 파일내에서 아래와 같이 perl.pl
perl.pl을 실행시켰을때
perl.pl내에 변수를 bash.bs에서 사용하고자 하는거에요
반대는 가능한데 ...
이렇게 하면 어떨까요?
var.pl
var.sh
실행결과
댓글 달기