我试图调试以以下行开头的 CGI 脚本:
#!/usr/bin/env python3
当然,问题是$PATH
Apache HTTPd 和我的 shell 的环境变量(特别是 )不同。
.profile
经过一番挖掘,我发现shell 的系统级$PATH
通过调用/usr/libexec/path_helper
.我通过调用/usr/libexec/path_helper
并将输出与 的输出进行比较来验证这一点echo $PATH
。
Apache HTTPd 的路径与此值不同。这使我假设 HTTPd 手动设置了值$PATH
。
我的问题是,为什么?为什么要手动设置流程$PATH
?我认为这/usr/libexec/path_helper
是某种系统标准,不是吗?
所以,问题是,为什么要$PATH
手动设置进程,而不是调用某种系统级标准,这/usr/libexec/path_helper
看起来像是系统级标准。
答案1
/usr/libexec/path_helper
我只在 Mac OS X 上见过; unix 上的守护进程(还有 cron)通常不使用与 shell 相同的环境(也不是相同的配置),因此交互式 shell(Apple 为其提供了一些 automagic 配置)和守护进程(尤其是那些不受管理的守护进程)之间存在明显的区别由苹果公司提供)。
实际上,如果网络守护进程选择了一个新路径,因为某些用户安装了一些随机包来玩,然后突然网络守护进程从错误的路径调用错误的工具......或者网络守护进程可能会非常糟糕需要软件 X 的特定版本,而不是来自系统范围路径系统的版本...
(顺便说一句,我在任何地方都完全禁用/usr/libexec/path_help
并手动设置PATH
,但我或多或少知道这样做会遇到什么麻烦。)