3

我正在尝试设置一个基于 Web 的门户,通过该门户我们可以通过简单地单击后端面板来签出 Git 存储库的不同分支。

所以目前,我有 /var/www/devportal 其中包含index.phpstatus.shcheckout.sh

index.php中,我执行以下操作:

$repo = $_GET['repo'];
$command = 'sh status.sh ' . $repo;
$output = exec($command);
echo "<pre>$output</pre>";

status.sh的内容是:

#!/bin/bash -e
if [ $# -ne 1 ]
then
    echo "Usage: `basename $0` <repo name>"
    exit 1
fi
cd /var/www/$1
git status

这很好用。在 PHP 中回显的输出显示了 /var/www/proj 中当前分支的状态。

现在,当我尝试使用 checkout.sh 做同样的事情(这次传递 2 个参数,第二个是要结帐的分支的名称)时其内容是:

#!/bin/bash -e
if [ $# -ne 2 ]
then
    echo "Usage: `basename $0` <repo name> <branch name>"
    exit 1
fi
cd /var/www/$1
git checkout $2

它不起作用。它不仅不起作用,而且我不会因为错误消息而傻傻地蹲下。没有输出。我知道 checkout.sh 脚本工作正常,因为当我回显通过 PHP 的 exec 命令发送的命令时,复制该确切内容并通过以 root 身份登录的终端运行它,它工作得很好,执行结帐并返回新激活的分支的名称。

对此的任何提示将不胜感激。我的盒子非常标准,Ubuntu 10.04 并运行 Apache2。

谢谢!

4

2 回答 2

4

exec 用您的命令标准输出填充 $output,以显示错误(如果有)在命令末尾添加“2>&1”。

exec 也可以告诉你返回值,试试:

$output = exec($command, $array_output, $ret_val);
var_dump($ret_val);
echo "<pre>$output</pre>";
于 2012-06-25T10:26:07.800 回答
0
$repo = $_GET['repo'];
$command = 'sh status.sh ' . $repo;
$output = exec($command);

哦,天哪。不要这样做。escapeshellarg存在是有原因的

于 2012-06-25T14:30:35.057 回答