从 php 脚本执行彩色命令

Posted

技术标签:

【中文标题】从 php 脚本执行彩色命令【英文标题】:Execute a colorized command from a php script 【发布时间】:2012-04-26 05:59:38 【问题描述】:

我有一个命令,例如“git diff”,当我从终端运行它时会输出彩色结果。

现在,我想从 CLI php 脚本调用该命令并在控制台中显示彩色结果。我尝试使用 exec()、system()、passthru(),但在所有情况下,输出都已转换为纯黑白文本。

有没有办法保留标准结果的颜色?如果没有,有人知道为什么这些信息会丢失吗?

【问题讨论】:

只是一个想法:它可能与环境变量有关。快速测试可能会提供线索:env > env_a.out && php -r 'system("env");' > env_b.out && diff env_a.out env_b.out 我试试你的测试,一旦两个 env 文件重新排序,差异只是这样:'SHLVL=1 对 SHLVL=2' 类似的?老实说,我很惊讶。也许提供有关您的环境的更多详细信息会对您的问题有所帮助,并通过尝试先自己输出颜色 (php -r 'printf("%c[32mGreen%c[0m\n", 27, 27);') 而不是调用 git 之类的命令来简化问题。 【参考方案1】:

您正在运行的命令很可能正在检查输出是否到终端,如果不是,则不对其进行着色。通常有一种方法可以强制它,但这将特定于命令本身;对于git diff,可以指定--color=always

【讨论】:

是的,你是对的,如果我做了这样的事情:<?php system('git diff --color=always'); ?> 我得到了颜色。所以现在的问题是:有没有办法从 php 告诉命令是的,我们在终端中? 不幸的是,命令真的不是附加到终端的方式PHP执行它(不像shell的方式)。即使您使用passthru,PHP 也会将自己置于命令和终端之间;它只是在通过时不会修改输出。不仅仅是颜色;以这种方式运行时,全屏命令根本不起作用。缺少一些复杂的伪终端设置,我认为无论如何你都不能从 PHP 中完成,我认为没有通用的解决方案。

以上是关于从 php 脚本执行彩色命令的主要内容,如果未能解决你的问题,请参考以下文章

用于发送邮件的 php 脚本在通过浏览器执行时不起作用,但在从命令行执行时工作正常

在 php 脚本中执行 curl 命令并从服务器获取响应并提取它

linux下php脚本怎么执行

从 mssql 触发器运行 php 脚本

如果使用带有 execute_process 命令的 CMake 脚本模式,如何获得彩色控制台输出?

从PHP执行PhantomJS