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")));
    }
}

パスを設定する関数もあるので、コード内のプログラムの環境変数を設定できます。

関連情報