当使用php exec()来运行shell脚本时,一个脚本可以工作(只是简单地执行git status),另一个脚本不会(git checkout)。 怎么来的?

我正在尝试设置一个基于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个参数,第二个参数是要检出的分支的名字),who'se的内容是:

 #!/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命令发送的命令,复制该确切的东西,并通过terminallogin作为根运行它,它工作得很好,结帐和返回新激活的分支的名称。

任何提示,将不胜感激。 我的盒子很标准,Ubuntu 10.04和运行Apache2。

谢谢!

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

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

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

哦,耶稣的人。 不要这样做。 escapeshellarg存在的原因