将环境变量设置为从perl脚本执行的shell



我正在运行一个perl文件a.pm,该文件通过系统命令调用b.sh。这里,b.sh使用的是find实用程序,其路径为/usr/local/bin

如果我直接在机器上的shell上运行env,我会得到如下PATH变量的输出。

PATH=/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/bin:/home/bin/samba::/home/venv/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin`

这就是为什么如果我直接从shell运行b.sh,它就能执行find实用程序。

现在,如果我像前面提到的那样使用system()通过a.pm运行b.sh,并且当我在b.sh中打印PATHenv变量时,它将作为

/bin:/usr/bin:/usr/X11R6/bin:/home/bin:/home/perl5/bin

它没有/usr/local/bin,这就是find命令失败的原因。

如果我在调用system(b.sh)之前尝试在perl中打印所有ENV变量,则不会打印PATH变量。

现在,在调用system(b.sh(之前,我尝试在.pm文件中添加路径变量,如下所示

$ENV{'PATH'} = '/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/home/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/';

现在,如果我试图在调用system(b.sh)之前打印perl中的所有ENV变量,则PATH变量将打印出上述值。

仍在执行a.pm文件,b.sh中打印的PATH变量是相同的:

/bin:/usr/bin:/usr/X11R6/bin:/home/bin:/home/perl5/bin

如何将相应的路径/usr/local/bin添加到使用a.pm调用的b.sh的shell?

我怀疑Perl程序正在修改它从调用它的shell获得的路径,或者您在某个地方遗漏了一个步骤。例如,如果您从不同的环境调用Perl程序,它可能会有不同的PATH

不过,你似乎已经找到了答案。在Perl程序的PATH中添加必要的目录。但是,你说这行不通。再说一遍,我认为有一些步骤你没有包括在内。我怀疑您运行系统的方式会覆盖从父级继承的PATH。

例如,这里有一个小Perl程序,它只运行一个shell脚本:

#!perl
use v5.10;
$ENV{PATH} = '/bin:/usr/bin';
say "PATH in Perl is $ENV{PATH}";
system( "sh ./pather.sh" );

shell脚本与PATH:相呼应

#!/bin/sh
echo "PATH in shell:" $PATH

当我运行这个时,两个路径都匹配:

PATH in Perl is /bin:/usr/bin
PATH in shell: /bin:/usr/bin

但是,也许system中的命令是另一回事。-l开关将shell视为登录shell,因此它将加载各种配置文件等等:

system( "sh -l ./pather.sh" );

现在shell脚本中的PATH不同了,因为我的特定配置文件覆盖了PATH:

PATH in Perl is /bin:/usr/bin
Path in shell: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/go/bin:...

我们的答案可以更有针对性——您可以生成一个最小的工作示例,在其中我们可以看到演示问题的实际代码。由于我们看不到您在system中实际运行的内容,因此只能猜测。

最新更新