如何将 Perl 脚本中的变量导出到 shell 脚本中?

如何将 Perl 脚本中的变量导出到 shell 脚本中?

我有一个 shell 脚本,我在其中通过下面的代码运行 perl 脚本。

perl perlscript.pl

在 perl 脚本中,我定义了一个名为 的变量$circle。现在我想在我的 shell 脚本中使用这个变量值。我怎样才能打电话?

答案1

如果您的perl脚本除了 $circle 的值之外没有生成其他输出,您可以使用命令替换将该输出存储在变量中。例如:

circle=$(perl perlscript.pl)

如果perl脚本还生成其他输出(或根本不输出),您必须:

  1. sed使用常用的文本处理工具( 、awkperlgrep等)仅从输出中提取所需的值。这是一个非常简单的例子:

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

  2. 使用间接方法,例如让perl脚本将 $circle 的值写入文件(例如/path/to/circle)以便 shell 读取它(例如circle=$(cat /path/to/circle)

注意:如果没有您提供更多详细信息,就不可能提供像这样的一般性建议。

答案2

为了扩展@cas的答案,这里有一个例子:

  • shell脚本创建一个临时文件来保存变量
  • Perl 输出变量,shell 脚本将其重定向到临时文件
  • shell 获取临时文件(并将其删除)

如果您在 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 中设置一个环境变量,您的 shell 就会找到它。在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")));
    }
}

还有用于设置路径的函数,因此您可以在代码中为程序设置环境变量。

相关内容