我有一个 shell 脚本,我在其中通过下面的代码运行 perl 脚本。
perl perlscript.pl
在 perl 脚本中,我定义了一个名为 的变量$circle
。现在我想在我的 shell 脚本中使用这个变量值。我怎样才能打电话?
答案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
)以便 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")));
}
}
还有用于设置路径的函数,因此您可以在代码中为程序设置环境变量。