2012-04-13 34 views
11

Mam polecenie, na przykład "git diff", które wyprowadza kolorowany wynik po uruchomieniu go z terminala.Wykonaj kolorowane polecenie ze skryptu php.

Teraz chcę wywołać to polecenie ze skryptu php CLI i wyświetlić w konsoli kolorowany wynik. Próbowałem z exec(), system(), passthru(), ale w każdym przypadku dane wyjściowe zostały przekonwertowane na zwykły czarno-biały tekst.

Czy istnieje sposób na zachowanie koloru standardowego wyniku? Jeśli nie, czy ktoś wie, dlaczego ta informacja się zagubiła?

+0

Po prostu pomysł: jest to prawdopodobnie związane ze zmienną środowiskową. Szybki test może dostarczyć wskazówek: 'env> env_a.out && php -r 'system (" env ");' > env_b.out && diff env_a.out env_b.out' – gamen

+0

Próbuję twojego testu, kiedy oba pliki env zostaną zmienione, różnica jest tylko taka: 'SHLVL = 1 przeciwko SHLVL = 2' – jeanmonod

+1

To podobne? Jestem zaskoczony, że jestem uczciwy. Być może podanie dodatkowych szczegółów na temat twojego środowiska byłoby pomocne w twoim pytaniu, a także uproszczenie problemu, próbując najpierw uzyskać kolor wyjściowy ('php -r 'printf ("% c [32mGreen% c [0m \ n ", 27 , 27); ''), a nie z wywoływania polecenia podobnego do git. – gamen

Odpowiedz

6

Według wszelkiego prawdopodobieństwa polecenie używasz sprawdza, czy wyjście jest do terminala i nie kolorowanie go, jeśli tak nie jest. Zwykle istnieje sposób, aby go zmusić, ale to będzie specyficzne dla samego polecenia; w przypadku git diff można podać --color=always.

+1

Tak, masz rację, jeśli zrobiłem coś takiego: ' ' Mam kolor. Pytanie teraz brzmi: czy istnieje sposób, od php, aby powiedzieć komendom, że tak, jesteśmy w terminalu? – jeanmonod

+3

Niestety, polecenie naprawdę * nie jest * dołączone do terminala w taki sam sposób, w jaki wykonuje go PHP (w przeciwieństwie do sposobu, w jaki działa powłoka). Nawet jeśli używasz 'passthru', PHP umieszcza się pomiędzy poleceniem a terminalem; po prostu nie modyfikuje wyjścia podczas jego przechodzenia. To nie tylko kolory; Polecenia pełnoekranowe po prostu nie będą działać po uruchomieniu w ten sposób. Nie ma w tym żadnej rozbudowanej konfiguracji pseudo-terminalowej, której nie sądzę, że możesz zrobić z PHP, ale nie sądzę, że istnieje ogólne rozwiązanie. –

+0

OK, dzięki i tak – jeanmonod

-1

Sprawdź ta klasa: 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

To wydaje się nie odpowiadać na pytanie. OP pytał o sposób uzyskania kolorystycznego wyjścia z 'shell_exec()', 'exec()', itp., Nie pytając, jak wyprowadzić kolorowane dane wyjściowe do terminala ze skryptu PHP. –