Bash脚本在PHP页面运行失效但终端可正常执行的问题排查
问题原因与解决方案
核心原因
XAMPP中PHP进程的环境变量PATH和你终端用户的PATH不一致。system_profiler命令位于/usr/sbin或/usr/bin目录下,但XAMPP的Apache/PHP进程默认的PATH里没有包含这些系统命令目录,导致脚本找不到该命令。
而你在终端能正常运行脚本,是因为终端会加载用户的shell配置文件(如.zshrc、.bash_profile),自动把系统命令目录加入PATH。
解决方法
方法1:在脚本中使用system_profiler的绝对路径
- 先在终端执行以下命令,获取
system_profiler的绝对路径:
通常会输出which system_profiler/usr/sbin/system_profiler。 - 修改你的
sysinfo1.sh脚本,把所有system_profiler替换成上面得到的绝对路径,比如:# 原脚本中的行 # system_profiler SPSoftwareDataType # 替换为 /usr/sbin/system_profiler SPSoftwareDataType
方法2:在脚本开头手动添加PATH环境变量
在sysinfo1.sh的最开头添加一行,把系统命令目录加入PATH:
export PATH="/usr/sbin:/usr/bin:$PATH" # 后面的原有脚本内容
方法3:在PHP的proc_open中传递完整环境变量
在调用proc_open时,手动传入包含正确PATH的环境变量数组:
// 先在终端执行 echo $PATH,复制输出的内容 $env = [ 'PATH' => '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/你的其他路径' ]; $descriptorspec = [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w'] ]; $process = proc_open('./sysinfo1.sh', $descriptorspec, $pipes, __DIR__, $env); // 后续的读取和关闭逻辑
额外验证
修改后,重新访问PHP页面,应该就能正常获取system_profiler的输出,不会再出现"command not found"的错误。
内容的提问来源于stack exchange,提问作者StealthRT
相关产品推荐
相关产品推荐

