2010-10-05 15 views
33

Estoy tratando de obtener cierta salida para el comando svn en formato XML. La salida está bien cuando escribo parámetros válidos. Sin embargo, cuando escribo una contraseña incorrecta, la salida no muestra un mensaje de error. Este es el código PHP:PHP exec() no está devolviendo el mensaje de error en la salida

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output); 

Aquí se emite recibo en el terminal:

<?xml version="1.0"?> 
<log> 
svn: OPTIONS of 'http://a51.unfuddle.com/svn/a51_activecollab': authorization failed: Could not authenticate to server: rejected Basic challenge (http://a51.unfuddle.com) 

Y aquí está la salida que recibo de la variable de salida $ con var_dump:

array(2) { 
[0]=> 
string(21) "<?xml version="1.0"?>" 
[1]=> 
string(5) "<log>" 
} 

Como puede ver, la variable $ output no devuelve la tercera línea de salida, donde lo hace el terminal. Ayúdame a obtener el mismo resultado que obtengo en el terminal (incluso lo intenté con los métodos shell_exec() o system() pero devuelven el mismo resultado que exec()) ¿Cómo obtengo el resultado completo? ¡Gracias de antemano!

Respuesta

62

Es necesario captar la stderr también.

Redirigir stderr a stdout debería hacer el truco. Añada 2>&1 al final de su comando.

p. Ej.

exec("/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/ 2>&1", $output); 
+0

Esto ha solucionado el problema. Muchas gracias. – Goran

+8

Aparte: ¿no es extraño que el ejecutivo de PHP no proporcione una forma simple de capturar la salida 'stderr' por separado? –

-2

es necesario definir una variable en el que almacenar el mensaje

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51 _activecollab/');

0

Eso probablemente no es la solución, sólo una mala sugerencia: has de añadir un eco adicional en el comando:

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/;**echo ""**', $output); 

Y la otra forma de resolverlo es como ya se mencionó: si no tiene la última línea en $ salida, de todos modos está en el valor devuelto de la función exec(). Habría entonces

$totalOutput = push($msg,$output); 

con

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output); 
Cuestiones relacionadas