아래 코드를 통해 Perl 스크립트를 실행하는 쉘 스크립트가 있습니다.
perl perlscript.pl
Perl 스크립트에서 이라는 변수를 정의했습니다 $circle
. 이제 쉘 스크립트에서 이 변수 값을 사용하고 싶습니다. 어떻게 전화를 걸 수 있나요?
답변1
perl
스크립트가 $circle 값 이외의 출력을 생성하지 않는 경우 명령 대체를 사용하여 해당 출력을 변수에 저장할 수 있습니다. 예를 들어:
circle=$(perl perlscript.pl)
perl
스크립트가 추가 출력을 생성하거나 출력이 전혀 생성되지 않는 경우 다음을 수행해야 합니다.
sed
일반적인 텍스트 처리 도구( , ,awk
등 )를 사용하여 출력에서 필요한 값만 추출합니다. 다음은 매우 간단한 예입니다.perl
grep
circle=$(perl perlscript.pl | sed -e 's/junk.i.dont.want//')
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
또는 die
Perl을 사용하여 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")));
}
}
경로를 설정하는 함수도 있으므로 코드에서 프로그램의 환경 변수를 설정할 수 있습니다.