Perl 에서 bash 에 변수값을 전달하는 방법

o12bank1의 이미지

perl 에서 사용하는 변수를 export해서
bash에서 사용하려고 하는데 방법이 없나요?

bash -> perl은 가능한데
perl -> bash은 도저히 안되는데

방법이 없는지요?

...!의 이미지

foo=$(perl -e 'print "hello";')
echo $foo

bash command substitution 에 대해 찾아보시고, 말씀하신 바와 직접 관련은 없지만 시간이 있으시면 공부 삼아서 bash process substitution 에 대해서도 찾아보세요.

o12bank1의 이미지

예를 들어 perl.pl
bash.bs

두개에 파일이있는데
bash.bs 파일내에서 아래와 같이 perl.pl
perl.pl을 실행시켰을때

perl.pl내에 변수를 bash.bs에서 사용하고자 하는거에요

반대는 가능한데 ...

ymir의 이미지

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 님께서 설명해주셨지만, 간단히 정리하자면

#This is bash.bs
foo=$(./perl.pl)
# Do something with $foo

#!/usr/bin/env perl
#This is perl.ps
print "hello";

bushi의 이미지

#!/usr/bin/env bash
eval $(./perl.pl)
echo $hello
echo $foo
echo ${array[@]}

#!/usr/bin/env perl
print "hello=world\n";
print "foo=bar\n";
print "array=(1 2 3 4 5 6 7)\n";
...!의 이미지

흐음~. 저는 변수명을 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]}

일견 더 복잡해 보이지만 유지 보수와 확장성 측면에서 어쩔 수 없는 선택이라고 생각합니다.

ymir의 이미지

이미 두 개의 파일이 변수나 그 값을 공유해야 하는 상태라면, modularity 는 고려하기 어렵지 않나 생각되네요.
특히나 다양한 변수 또는 값을 공유해야 하는 경우, 별도 규칙을 만들어 파싱해야 하는데..
단순히 eval 로 처리하는 것보다 추가 작업이 필요하고, 내용이 변경 되는 경우 손 댈 부분이 늘어나니까요.

더구나 위의 eval 은 source 나 . (dot) 명령을 사용해서 변수들을 읽어 들이는 것과 동일한 상황이라..
큰 차이는 없다고 생각합니다.
그냥 상황에 맞게 편한 대로 골라쓰면 되지 않을까 싶네요.

저는 source 나 . 을 쓰는 경우에 (위의 eval 도 마찬가지로), 다음과 같이 한 줄 추가 해서..
문서화 겸, 그 파일에서 설정되어야 하는 변수들이 실수로 누락되는 경우를 방지합니다.

#!/bin/bash
 
. ./config.sh
 
: ${CONFIG_COMMON_CFLAGS?} ${CONFIG_COMMON_INCLUDES?} ${CONFIG_COMMON_LDFLAGS?} ${CONFIG_COMMON_LIBS?}

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ymir의 이미지

그냥 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 』

o12bank1의 이미지

예를 들어 perl.pl
bash.bs

두개에 파일이있는데
bash.bs 파일내에서 아래와 같이 perl.pl
perl.pl을 실행시켰을때

perl.pl내에 변수를 bash.bs에서 사용하고자 하는거에요

반대는 가능한데 ...

낙타2의 이미지

var.pl

#!/usr/bin/env perl
 
my $VAR1=1;
my $VAR2='hi';
 
print "VAR1=$VAR1\n";
print "VAR2=$VAR2\n";

var.sh

#!/bin/bash
 
perl var.pl > /tmp/tmp_import_var
source /tmp/tmp_import_var
 
echo $VAR1
echo $VAR2

실행결과

$ ./var.sh
1
hi

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.