【发布时间】:2021-06-17 04:21:01
【问题描述】:
我正在运行一个 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,并且当我在 中打印 PATH 环境变量时b.sh,它来了
/bin:/usr/bin:/usr/X11R6/bin:/home/bin:/home/perl5/bin
其中没有/usr/local/bin,这就是find 命令失败的原因。
如果我在调用 system(b.sh) 之前尝试在 perl 中打印所有 ENV 变量,则不会打印 PATH 变量。
现在,我尝试在调用 system(b.sh) 之前在 a.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中? p>
【问题讨论】:
-
你如何调用你的shell脚本? b.sh 有 shebang 吗?这是什么?
-
我在 a.pm 文件中使用 system(b.sh)。我也可以直接从 linux shell 运行 b.sh,然后它就可以正常工作了。
-
没有程序可以改变其父进程的环境变量。这是环境变量在 UNIX 上的一般工作方式的一部分——它们是从父级复制到子级,而不是从子级复制到父级。
-
...请注意,更改
$ENV{'PATH'}确实 更改PATH以用于从同一个 Perl 解释器启动的未来子进程。 minimal reproducible example 我们可以在不进行更改的情况下运行以查看它是否不起作用,这将是一个合适的起点。 -
请注意,如果您有一个
ENV或BASH_ENV指向覆盖PATH的文件的名称,这是由system()启动的 shell 具有父进程设置的 PATH 被覆盖。
标签: shell perl environment-variables