在system()声明中,$PATH在哪里?

4
我是一位有用的助手,可以翻译文本。
我在电脑上遇到了一些奇怪的事情。 我在 /usr/local/bin 下安装了 gperf。 与我在这里提出的问题相关,我在电脑上运行了一个包含 system() 命令和类似以下标志的 perl 脚本
system("gperf ...") == 0 || die "calling gperf failed: $?";

然而,无论我怎样努力,gperf都无法运行并输出失败消息。
为了调试,我尝试了以下操作:
system("echo \$PATH") == 0 || die "calling gperf failed: $?";
我发现它不包含我安装gperf的/usr/local/bin/,而只查找未安装的usr/bin。
所以$PATH是错误的...
于是我在Google上搜索,发现system()与在文件中调用/bin/sh相同,因此我尝试了/bin/sh和echo $PATH,结果发现它包含了/usr/local/bin/,让我感到难以置信。
那么我的问题是:system()的$PATH在哪里声明?为什么它与Bourne shell内部的不同?
2个回答

7
通过system启动的命令使用的PATH与perl脚本中可通过$ENV{PATH}访问的路径相同。这是perl脚本从调用它的程序继承的PATH,除非你在脚本中更改了它。
可能出现问题的原因是您在错误的配置文件中设置了PATH。请在~/.profile/etc/profile或其他系统级文件中定义它,而不要在shell配置文件(如.bashrc)中定义。有关一些常规信息,请参见此问题
如果您想在perl脚本内手动设置路径,可以使用以下方法:
$ENV{PATH} = "/usr/local/bin:$ENV{PATH}" unless ":$ENV{PATH}:" =~ m~:/usr/local/bin:~;

但这可能是一个不好的想法:在大多数情况下,您的脚本不应修改运行该脚本的用户选择的路径。

如果您在阅读我链接的问题和我的答案中链接的问题后仍然无法找到正确设置系统上的PATH的位置,请在Unix & Linux上提问,并确保说明您的操作系统详细信息(发行版、版本等)以及您如何登录(这是一个用户问题,而不是编程问题)。


0
在使用BASH作为shell的Linux系统中,PATH是从用户的主目录下的.bash_profile文件中在登录时设置的。您可以在文件末尾添加以下行来附加/usr/local/bin目录:
    PATH=$PATH:/usr/local/bin

另一种(可能更可靠的)解决方法是在系统调用中使用绝对路径,像这样:
    system("/usr/local/bin/gperf")

1
我不建议使用显式路径调用 gperf。如果在其他系统上它在 /usr/bin~/bin 中呢?这正是 PATH 的作用。 - Gilles 'SO- stop being evil'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接