Perl 스크립트에서 쉘 스크립트로 변수를 내보내는 방법은 무엇입니까?

Perl 스크립트에서 쉘 스크립트로 변수를 내보내는 방법은 무엇입니까?

아래 코드를 통해 Perl 스크립트를 실행하는 쉘 스크립트가 있습니다.

perl perlscript.pl

Perl 스크립트에서 이라는 변수를 정의했습니다 $circle. 이제 쉘 스크립트에서 이 변수 ​​값을 사용하고 싶습니다. 어떻게 전화를 걸 수 있나요?

답변1

perl스크립트가 $circle 값 이외의 출력을 생성하지 않는 경우 명령 대체를 사용하여 해당 출력을 변수에 저장할 수 있습니다. 예를 들어:

circle=$(perl perlscript.pl)

perl스크립트가 추가 출력을 생성하거나 출력이 전혀 생성되지 않는 경우 다음을 수행해야 합니다.

  1. sed일반적인 텍스트 처리 도구( , , awk등 )를 사용하여 출력에서 ​​필요한 값만 추출합니다. 다음은 매우 간단한 예입니다.perlgrep

    circle=$(perl perlscript.pl | sed -e 's/junk.i.dont.want//')

  2. perl스크립트에서 $circle 값을 파일(예: /path/to/circle)에 기록하여 셸에서 읽을 수 있도록(예: circle=$(cat /path/to/circle)) 간접적인 방법을 사용합니다.

참고: 귀하의 추가 세부정보 없이는 이와 같은 일반적인 조언을 제공하는 것이 불가능합니다.

답변2

@cas의 답변을 확장하기 위한 예는 다음과 같습니다.

  • 쉘 스크립트는 변수를 저장할 임시 파일을 생성합니다.
  • Perl 출력 변수, 쉘 스크립트는 이를 임시 파일로 리디렉션합니다.
  • 쉘은 임시 파일을 가져오고 삭제합니다.

Perl 스크립트에서 STDERR을 사용하지 않는 경우 이를 사용하여 확장자가 .stderr인 임시 파일로 리디렉션할 수 있습니다 2>$tempfile.

완전한 예는 다음과 같습니다.

#!/usr/bin/env bash

# create a temp file to hold the variables from perl
tmpfile=$(mktemp perlvars.XXXX)

#perl writes them to STDERR, which is redirected to the $tmpfile
perl -e '$var1="Perl Variable 1"; $var2="Other variable";
         print "In Perl: \$var1 = $var1, \$var2 = $var2\n";
         END { print STDERR qq(var1="$var1"\nvar2="$var2"\n) }' 2>$tmpfile

# source the $tmpfile and remove it
. "$tmpfile" && rm "$tmpfile"

echo "Now back in Bash: var1 = '$var1', var2 = '$var2'"

Perl에서도 STDERR이 필요합니다. warn또는 diePerl을 사용하여 Perl에서 다른 파일 설명자를 열고 다음과 같이 open(F3, ">&=", 3)작성할 수 있습니다.

#!/usr/bin/env bash

# create a temp file to hold the variables from perl
tmpfile=$(mktemp perlvars.XXXX)

#perl writes them to file handle 3, which is redirected to the $tmpfile
perl -e '$var1="Perl Variable 1"; $var2="Other variable";
         print "In Perl: \$var1 = $var1, \$var2 = $var2\n";
         END {open(F3, ">&=", 3);
              print F3 qq(var1="$var1"\nvar2="$var2"\n)}' 3>$tmpfile

# source the $tmpfile and remove it
. "$tmpfile" && rm "$tmpfile"

echo "Now back in Bash: var1 = '$var1', var2 = '$var2'"

답변3

Perl에서 환경 변수를 설정하면 쉘이 이를 찾을 것입니다. C에서는 다음과 같이 경로를 확인할 수 있습니다

void getPath() {
    if (getenv("PATH") == NULL) {
        printf("'%s' is not set.\n", "PATH");
        /* Default our path if it is not set. */
        putenv("PATH=/bin:/usr/bin:/sbin:/usr/sbin:/etc");
    }
    else if (getenv("PATH")) {
        printf("'%s' is set to %s.\n", "PATH", (getenv("PATH")));
    }
}

경로를 설정하는 함수도 있으므로 코드에서 프로그램의 환경 변수를 설정할 수 있습니다.

관련 정보