在PHP exec()中调用Linux内置工具compgen提示未找到如何解决?
解决PHP exec()调用compgen命令提示"not found"的问题
这个问题我之前碰到过,根源其实很明确:compgen是Bash专属的内置命令,而PHP的exec()、shell_exec()这类函数默认调用的是系统的sh shell(在多数Linux发行版里,sh其实是Dash的软链接,一个轻量级的POSIX兼容shell),Dash并没有compgen这个命令,所以才会抛出sh: 1: compgen: not found的错误。
而你在终端直接执行能成功,是因为终端默认使用的是Bash,自然能识别这个内置命令。
解决方法:显式指定用Bash执行命令
只需要在你的命令前加上bash -c,让Bash来处理compgen命令就行:
// 使用exec()的写法,会返回最后一行输出 $c = exec('bash -c "compgen -c pyt"'); // 如果用shell_exec(),可以拿到完整的所有补全结果 $output = shell_exec('bash -c "compgen -c pyt"');
执行后就能得到你预期的类似python3.5m python3.5 python2.7 python2 python3 python3m python的结果了。
额外验证小技巧
你可以先确认PHP当前默认使用的shell是什么:
echo shell_exec('echo $SHELL');
输出大概率是/bin/sh,这也能佐证为什么直接调用compgen会失败。
内容的提问来源于stack exchange,提问作者hungl
相关产品推荐
相关产品推荐

