【问题标题】:Capturing colorized output to a bash variable将彩色输出捕获到 bash 变量
【发布时间】:2011-10-13 06:15:45
【问题描述】:

我想在变量中捕获git status 的颜色输出并稍后打印。

到目前为止,我已经达到了:

status=$(git status -s)
echo -e "$status"

上述脚本保持换行符不变(感谢Capturing multiple line output into a Bash variable),但从输出中去除颜色。

有没有办法将颜色保留在变量中并回显它?

【问题讨论】:

    标签: bash variables colors


    【解决方案1】:

    问题不在于 bash 在存储文本之前去除了颜色输出,而是 git 首先拒绝产生彩色输出,可能是因为它可以判断其 STDOUT 不是终端。许多命令都这样做(例如ls)。其中大多数都有一个选项告诉他们无论如何都要使用颜色,以便在这种情况下使用(例如--color for ls)。请查阅您的 git 文档是否也有这样的覆盖选项。

    【讨论】:

    • 对我来说,我需要将 color.status 更改为 always,而不是 color.ui
    【解决方案2】:

    对于特定于 git 的解决方案,您可以通过 color.status 配置选项强制 git 提供颜色。要覆盖此单个命令的配置条目,请使用 git -c color.status=always status

    请记住,以这种方式捕获的命令输出不一定包含尾随换行符,因此如果您打算稍后打印它,则需要添加它。

    out=$(git -c color.status=always status)
    printf "$out\n"
    

    对于与不提供颜色覆盖的其他程序一起使用的更通用的解决方案,更好的方法是使用Can colorized output be captured via shell redirect? 中所示的脚本

    在这些情况下,您可能希望使用status=$(script -q /dev/null git status | cat)

    【讨论】:

      【解决方案3】:

      正如 Kilian Foth 所说:

      “查阅你的 git 文档是否也有这样的覆盖选项”

      Git 文档说 (http://git-scm.com/book/en/Customizing-Git-Git-Configuration#Colors-in-Git):

      “如果您希望在重定向输出中使用颜色代码,则可以将 --color 标志传递给 Git 命令以强制它使用颜色代码”

      使用 git 版本 1.9.2,我正在尝试“git status --color”和“git --color status”,但它们似乎都没有有效的标志。可能尚未实施?

      但是,捕获ls 的彩色输出可以使用:

      IFS=""
      output=$(ls -l --color)
      echo -e "$output"
      

      【讨论】: