【问题标题】:Where is $PATH in a system() declared声明的 system() 中的 $PATH 在哪里
【发布时间】:2012-08-24 15:48:50
【问题描述】:

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

【问题讨论】:

    标签: linux perl path sh


    【解决方案1】:

    通过system 启动的命令使用的PATH 与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 上提问,并确保说明详细信息您的操作系统(发行版、版本等)以及您的登录方式(这是用户问题,而不是编程问题)。

    【讨论】:

      【解决方案2】:

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

          PATH=$PATH:/usr/local/bin
      

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

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

      【讨论】:

      • 我不建议使用显式路径调用gperf。如果它在其他系统上的/usr/bin~/bin 中怎么办?这正是PATH 的用途。
      猜你喜欢
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2010-11-29
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多