2012-04-13 14 views
11

Ho un comando, ad esempio 'git diff' che emette un risultato colorato quando lo eseguo dal terminale.Esegui un comando colorato da uno script php

Ora, voglio chiamare questo comando da uno script php CLI e visualizzare nella console il risultato colorized. Ho provato con exec(), system(), passthru() ma in tutti i casi l'output è stato convertito in testo in bianco e nero.

C'è un modo per preservare il colore del risultato standard? In caso contrario, qualcuno sa perché queste informazioni vengono perse?

+0

Solo un'idea: probabilmente è correlata all'ambiente. Un test rapido potrebbe fornire indizi: 'env> env_a.out && php -r 'system (" env ");' > env_b.out && diff env_a.out env_b.out' – gamen

+0

Ho provato il tuo test, una volta che entrambi i file ENV sono stati riordinati, il diff è solo questo: 'SHLVL = 1 contro SHLVL = 2' – jeanmonod

+1

Che simile? Sono sorpreso di essere onesto. Forse fornire ulteriori dettagli sul tuo ambiente sarebbe utile per la tua domanda, oltre a semplificare il problema provando ad emettere un colore da solo ('php -r 'printf ("% c [32mGreen% c [0m \ n ", 27 , 27); '') piuttosto che invocare un comando come git. – gamen

risposta

6

Con ogni probabilità il comando è in esecuzione sta controllando per vedere se l'uscita è quella di un terminale e non colorare, se non lo è. Di solito c'è un modo per forzarlo, ma questo sarà specifico del comando stesso; nel caso di git diff, è possibile specificare --color=always.

+1

Sì, hai ragione, se ho fatto qualcosa del genere: ' ' Ho ottenuto il colore. Quindi la domanda ora è: c'è un modo, da php, di dire ai comandi che sì, siamo in un terminale? – jeanmonod

+3

Sfortunatamente, il comando veramente * non è * collegato ad un terminale nel modo in cui PHP lo esegue (a differenza del modo in cui lo fa la shell). Anche quando usi 'passthru', PHP si colloca tra il comando e il terminale; semplicemente non modifica l'output mentre passa. Non sono solo i colori; i comandi a schermo intero semplicemente non funzionano affatto quando vengono eseguiti in questo modo. Quindi, a parte qualche elaborato setup pseudo-terminale, che non credo sia possibile fare da PHP in ogni caso, non penso che ci sia una soluzione generale. –

+0

OK, grazie comunque – jeanmonod

-1

Controllare questa classe: 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

Questo non sembra rispondere alla domanda. L'OP chiedeva un modo per ottenere un output colorized da 'shell_exec()', 'exec()', ecc., Non chiedendo come emettere output colorised sul terminale da uno script PHP. –

Problemi correlati