2012-04-13 16 views
11

Tengo un comando, por ejemplo 'git diff' que da salida a un resultado coloreado cuando lo ejecuto desde el terminal.Ejecutar un comando coloreado desde un script php

Ahora, quiero llamar a ese comando desde un script CLI php y mostrar en la consola el resultado coloreado. Lo he intentado con exec(), system(), passthru() pero en todos los casos el resultado se ha convertido en texto simple en blanco y negro.

¿Hay alguna manera de preservar el color del resultado estándar? Si no, ¿alguien sabe por qué se pierde esta información?

+0

Solo una idea: probablemente esté relacionado con la variable del entorno. Una prueba rápida podría proporcionar pistas: 'env> env_a.out && php -r 'system (" env ");' > env_b.out && diff env_a.out env_b.out' – gamen

+0

Intento su prueba, una vez que ambos archivos env se reordenan, la diferencia es solo así: 'SHLVL = 1 contra SHLVL = 2' – jeanmonod

+1

¿Eso similar? Estoy sorprendido de ser honesto. Tal vez proporcionar más detalles acerca de su entorno sería útil en su pregunta, así como también simplificar el problema al intentar generar primero un color ('php -r 'printf ("% c [32mGreen% c [0m \ n ", 27] , 27); '') en lugar de invocar un comando como git. – gamen

Respuesta

6

Con toda probabilidad el comando que se está ejecutando es la comprobación para ver si la salida es a un terminal y no colorear si no lo es. Usualmente hay una manera de forzarlo, pero eso va a ser específico para el comando mismo; en el caso de git diff, puede especificar --color=always.

+1

Sí, tiene razón, si hiciera algo así: ' ' Obtuve el color. Entonces, la pregunta ahora es: ¿hay alguna manera, desde php, de decir a los comandos que sí, estamos en una terminal? – jeanmonod

+3

Desafortunadamente, el comando realmente * no * está conectado a un terminal de la forma en que PHP lo ejecuta (a diferencia de la forma en que lo hace el shell). Incluso cuando usas 'passthru', PHP se coloca entre el comando y la terminal; simplemente no modifica la salida a medida que pasa. No son solo colores; los comandos de pantalla completa simplemente no funcionarán en absoluto cuando se ejecuten de esta manera. Tan corto de una configuración pseudo-terminal elaborada, que no creo que puedas hacer con PHP de todos modos, no creo que haya una solución general. –

+0

OK, gracias de todos modos – jeanmonod

-1

Comprobar esta clase: https://gist.github.com/2390007

public static function color($text, $foreground, $background = null) 
    { 
     if (static::is_windows()) 
     { 
      return $text; 
     } 

     if (! array_key_exists($foreground, static::$foreground_colors)) 
     { 
      throw new \FuelException('Invalid CLI foreground color: '.$foreground); 
     } 

     if ($background !== null and ! array_key_exists($background, static::$background_colors)) 
     { 
      throw new \FuelException('Invalid CLI background color: '.$background); 
     } 

     $string = "\033[".static::$foreground_colors[$foreground]."m"; 

     if ($background !== null) 
     { 
      $string .= "\033[".static::$background_colors[$background]."m"; 
     } 

     $string .= $text."\033[0m"; 

     return $string; 
    } 
+0

Esto no parece responder a la pregunta. El OP estaba pidiendo una forma de obtener salida coloreada de 'shell_exec()', 'exec()', etc., sin preguntar cómo generar salida coloreada al terminal desde un script PHP. –

Cuestiones relacionadas