2012-04-13 43 views
11

Tôi có lệnh, ví dụ 'git diff' xuất kết quả được tô màu khi tôi chạy nó từ thiết bị đầu cuối.Thực hiện lệnh được tô màu từ tập lệnh php

Bây giờ, tôi muốn gọi lệnh đó từ tập lệnh php CLI và hiển thị trong bảng điều khiển kết quả được tô màu. Tôi đã thử với exec(), system(), passthru() nhưng trong mọi trường hợp đầu ra đã được chuyển đổi sang văn bản màu đen và trắng đơn giản.

Có cách nào để bảo toàn màu của kết quả chuẩn không? Nếu không, ai đó có biết tại sao thông tin này bị mất không?

+0

Chỉ cần một ý tưởng: nó có thể liên quan đến biến môi trường. Một bài kiểm tra nhanh có thể cung cấp manh mối: 'env> env_a.out && php -r 'system (" env ");' > env_b.out && diff env_a.out env_b.out' – gamen

+0

Tôi thử thử nghiệm của bạn, một khi cả hai tập tin env sắp xếp lại, sự khác biệt chỉ như thế này: 'SHLVL = 1 so với SHLVL = 2' – jeanmonod

+1

Điều đó tương tự? Tôi rất ngạc nhiên khi thành thật. Có lẽ cung cấp thêm chi tiết về môi trường của bạn sẽ hữu ích trong câu hỏi của bạn, cũng như đơn giản hóa vấn đề bằng cách cố gắng tự tạo màu đầu tiên ('php -r 'printf ("% c [32mGreen% c [0m \ n ", 27 , 27); '') thay vì gọi lệnh như git. – gamen

Trả lời

6

Trong khả năng tất cả các lệnh bạn đang chạy được kiểm tra để xem nếu đầu ra là một thiết bị đầu cuối và không colorizing nó nếu nó không phải là. Thường có một cách để ép buộc nó, nhưng điều đó sẽ đặc trưng cho chính lệnh đó; trong trường hợp git diff, bạn có thể chỉ định --color=always.

+1

Có, bạn đã đúng, nếu tôi đã làm một cái gì đó như thế: ' ' Tôi nhận được màu sắc. Vì vậy, câu hỏi bây giờ là: Có cách nào, từ php, để nói với các lệnh có, chúng tôi đang ở trong một thiết bị đầu cuối? – jeanmonod

+3

Thật không may, lệnh * thực sự không được gắn vào một terminal theo cách PHP thực hiện nó (không giống như cách mà shell thực hiện). Ngay cả khi bạn sử dụng 'passthru', PHP đặt chính nó vào giữa lệnh và thiết bị đầu cuối; nó không thay đổi đầu ra khi nó đi qua. Nó không chỉ là màu sắc; lệnh toàn màn hình sẽ không hoạt động chút nào khi chạy theo cách này. Vì vậy, ngắn của một số thiết lập thiết bị đầu cuối giả xây dựng, mà tôi không nghĩ rằng bạn có thể làm từ PHP anyway, tôi không nghĩ rằng có một giải pháp chung. –

+0

OK, cảm ơn – jeanmonod

-1

Kiểm tra lớp này: 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

Điều này dường như không trả lời được câu hỏi. OP đã yêu cầu một cách để có được kết quả được tô màu từ 'shell_exec()', 'exec()', v.v., không hỏi làm thế nào để xuất kết quả đầu ra được tô màu cho thiết bị đầu cuối từ một kịch bản lệnh PHP. –

Các vấn đề liên quan