我有两个远程服务器,它们需要同步某个代码库。我在第一个上设置了所有内容,但在第二个上设置时,我遇到了一个问题:
他们没有在同一位置安装hg
。我不能只运行hg <command>
,因为它返回错误:
sh:hg:找不到命令
所以我一直在使用完整路径,但这对两个单独的hg
位置不起作用。
我认为运行which hg
并使用响应的路径会很聪明,所以下面是新代码:
$hg = trim(`which hg`, "n");
$output = `{$hg} pull -u`
但是$hg
就是NULL
,所以这不起作用!我可以ssh到第二台服务器,并看到which hg
确实可以工作。我甚至附加了2>> path/to/log
,看看which
命令是否有任何错误,但没有。我确定它是在写日志,所以它与此无关。
我不是在安全模式下运行的,而且我肯定被允许运行shell_exec
,因为其他命令都可以工作。
我知道我可以创建一个符号链接,这样他们就有了相同的路径,只需硬编码路径,但shell_exec('which hg')
不起作用的原因让我抓狂!!!
which hg
只有在hg
已经在您的路径中时才会工作,否则它将返回空字符串。
显然,这不是您想要的,因为如果它已经在您的路径上,您可以使用hg
。
如果您使用许多具有不同配置的机器,您可以在主目录中创建一个bin
目录,将其添加到路径中,并链接到该目录中所需的命令。这将允许您在所有机器上使用相同的命令。
对于PHP,您需要将其放在web服务器可访问的目录中(但最好放在文档根目录之外),除此之外,您还可以在那里使用相同的技术,提供创建链接的公共目录的绝对路径。
尝试
shell_exec('/usr/bin/which hg');
相反。可以不设置$PATH
,这是which
的典型位置