2012-04-13 20 views
11

Ich habe einen Befehl, zum Beispiel 'git diff', die ein koloriertes Ergebnis ausgeben, wenn ich es aus dem Terminal ausführen.Führen Sie einen eingefärbten Befehl aus einem PHP-Skript

Nun möchte ich diesen Befehl von einem CLI-PHP-Skript aufrufen und in der Konsole das eingefärbte Ergebnis anzeigen. Ich habe versucht mit exec(), system(), passthru(), aber in jedem Fall wurde die Ausgabe in einfachen schwarzen und weißen Text umgewandelt.

Gibt es eine Möglichkeit, die Farbe des Standardergebnisses zu erhalten? Wenn nicht, weiß jemand, warum diese Informationen verloren gehen?

+0

Nur eine Idee: es ist wahrscheinlich Umwelt-Variable verwandt. Ein schneller Test könnte Hinweise liefern: 'env> env_a.out && php -r 'system (" env ");' > env_b.out && diff env_a.out env_b.out' – gamen

+0

Ich versuche Ihren Test, einmal beide env-Datei neu geordnet, das diff ist nur so: 'SHLVL = 1 gegen SHLVL = 2' – jeanmonod

+1

Das ähnlich? Ich bin überrascht, ehrlich zu sein. Vielleicht wäre es hilfreich, in Ihrer Frage weitere Details zu Ihrer Umgebung bereitzustellen und das Problem zu vereinfachen, indem Sie zuerst versuchen, eine Farbe selbst auszugeben ('php -r 'printf ("% c [32mGreen% c [0m \ n ", 27 , 27); ") anstatt einen Befehl wie git aufzurufen. – gamen

Antwort

6

Aller Wahrscheinlichkeit nach dem Befehl Sie prüft ausgeführt werden, um zu sehen, ob Ausgang an einen Terminal ist und es nicht Einfärben, wenn es nicht ist. Es gibt normalerweise eine Möglichkeit, es zu erzwingen, aber das wird spezifisch für den Befehl selbst sein; Im Fall von git diff können Sie --color=always angeben.

+1

Ja, du hast recht, wenn ich so etwas gemacht habe: ' Ich habe die Farbe. So die Frage ist jetzt: Gibt es einen Weg, von PHP, den Befehlen zu sagen, dass ja, wir sind in einem Terminal? – jeanmonod

+3

Leider ist der Befehl * nicht wirklich an ein Terminal gebunden, so wie PHP es ausführt (anders als die Shell). Auch wenn Sie 'passthru 'verwenden, stellt sich PHP zwischen den Befehl und das Terminal; Es ändert nur nicht die Ausgabe, wie es durchläuft. Es sind nicht nur Farben; Vollbild-Befehle funktionieren einfach nicht, wenn sie auf diese Weise ausgeführt werden. So kurz vor einem ausgeklügelten Pseudo-Terminal-Setup, von dem ich nicht glaube, dass Sie es von PHP aus tun können, glaube ich nicht, dass es eine allgemeine Lösung gibt. –

+0

OK, danke trotzdem – jeanmonod

-1

prüft diese Klasse: 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

Dies scheint die Frage nicht zu beantworten. Das OP fragte nach einer Möglichkeit, eine colorierte Ausgabe von 'shell_exec()', 'exec()' usw. zu erhalten, ohne zu fragen, wie man colorisierte Ausgaben von einem PHP-Skript an das Terminal ausgeben könnte. –

Verwandte Themen