声明在system()中的$ PATH在哪里

时间:2012-08-29 23:43:13

标签: linux perl path sh

我的计算机上发生了一些奇怪的事情。 我在/ usr / local / bin下安装了gperf。 与问题I asked here相关,我在我的计算机上运行了一个perl脚本,其中包含gperf上的行system(),其中的标志看起来像

perl文件:

system("gperf ...") == 0 || die "calling gperf failed: $?";

然而,无论我怎么努力,gperf都不会运行并输出失败的消息

调试我试过像

这样的东西

system("echo \$PATH") == 0 || die "calling gperf failed: $?";

并发现它不包含/usr/local/bin/,其中我安装了我的gperf,但只查看usr/bin未安装的地方

所以$PATH错了...... 所以我用Google搜索并看到system()与在文件中调用/ bin / sh相同,所以我尝试了/bin/shecho $PATH,发现它包含/usr/local/bin/让我不相信。 所以我的问题是系统()声明的$ PATH在哪里?为什么它与Bourne shell中的那个不同?

2 个答案:

答案 0 :(得分:7)

通过PATH启动的命令使用的system与perl脚本中的命令相同,可通过$ENV{PATH}访问。这是perl脚本从调用它的程序继承的PATH,除非你在脚本中更改它。

你可能会在错误的配置文件中设置PATH。在~/.profile/etc/profile或其他系统范围的文件中定义它,而不是在.bashrc等shell配置文件中定义。有关一般信息,请参阅this question

如果要在perl脚本中手动设置路径,可以使用类似

的内容
$ENV{PATH} = "/usr/local/bin:$ENV{PATH}" unless ":$ENV{PATH}:" =~ m~:/usr/local/bin:~;

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

如果您在阅读我链接的问题以及我的答案中链接的问题后找不到合适的地方在您的系统上设置PATH,请在Unix & Linux上询问并确保说明您的操作系统的详细信息(分发,版本等)以及您的登录方式(这是用户问题,而不是编程问题)。

答案 1 :(得分:0)

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

    PATH=$PATH:/usr/local/bin

另一种(可能更可靠)解决方法是在系统调用中使用绝对路径,如下所示:

    system("/usr/local/bin/gperf")