4

我的电脑上发生了一些奇怪的事情。我在 /usr/local/bin 下安装了 gperf。与我在这里问的问题有关,我的计算机上运行了一个 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是错误的......所以我四处搜索并看到system()与在文件中调用 /bin/sh 相同,所以我尝试/bin/shecho $PATH发现它包含/usr/local/bin/我不相信的内容。所以我的问题是 system() 的 $PATH 声明在哪里?为什么它与 Bourne shell 中的不同?

4

2 回答 2

7

PATHvia 启动的命令使用的命令与systemperl 脚本中的命令相同,可通过$ENV{PATH}. 这是PATHperl 脚本从调用它的程序继承的,除非您在脚本中更改它。

咬你的可能是你PATH在错误的配置文件中设置了你的。在 . 或其他系统范围的文件中定义它~/.profile/etc/profile而不是在 shell 配置文件中,例如.bashrc. 有关一些一般信息,请参阅此问题

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

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

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

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

于 2012-08-29T23:51:58.787 回答
0

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

    PATH=$PATH:/usr/local/bin

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

    system("/usr/local/bin/gperf")
于 2012-08-29T23:47:51.567 回答