以下のコードで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")));
}
}
パスを設定する関数もあるので、コード内のプログラムの環境変数を設定できます。