我有两台远程服务器需要同步某个代码库。我把它全部设置在第一个,但在第二个设置时,我遇到了一个问题:
他们没有在同一位置安装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')
无法工作!!!
答案 0 :(得分:4)
which hg
仅在您的路径中已有hg
时才有效,否则会返回空字符串。
显然这不是您想要的,因为如果它已经在您的路径中,您可以使用hg
。
如果您使用的是具有不同配置的许多计算机,您只需在主目录中创建一个bin
目录,将其添加到您的路径中,并链接到该目录中所需的命令。这将允许您在所有计算机上使用相同的命令。
对于PHP,您需要将其放在Web服务器可访问的目录中(但最好在文档根目录之外),除此之外,您可以通过提供公共目录的绝对路径来使用相同的技术。你创建了你的链接。
答案 1 :(得分:0)
尝试
shell_exec('/usr/bin/which hg');
代替。可能未设置$PATH
,这是which