ifcolor 是一个非常实用的命令行工具,它的全称是 "if color",顾名思义,它的核心功能是 根据终端输出是否包含颜色(ANSI 转义码)来执行不同的操作。

你可以把它想象成一个 "颜色感知" 的 if 语句。
ifcolor 是什么?
ifcolor 是一个用 Go 语言编写的开源命令行工具,它不是 Linux 或 macOS 系统自带的,需要你手动安装,它的主要用途是判断标准输入(stdin)或文件内容中是否包含了 ANSI 颜色代码,并根据判断结果执行指定的命令。
核心工作流程:
- 从标准输入或文件中读取内容。
- 中是否包含 ANSI 颜色代码(
\x1b[31m代表红色)。 - 包含 颜色代码,则执行
--then后面的命令。 - 不包含 颜色代码,则执行
--else后面的命令。
安装 ifcolor
在安装之前,请确保你的系统已经安装了 Go 环境。

使用 Go 安装(推荐)
这是最简单、最通用的安装方法,适用于任何 Go 支持的操作系统(Linux, macOS, Windows 等)。
go install github.com/gsamokovarov/ifcolor@latest
安装完成后,将你的 Go bin 目录添加到 PATH 环境变量中,通常这个目录是 ~/go/bin。
# 对于 bash echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc source ~/.bashrc # 对于 zsh echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.zshrc source ~/.zshrc
安装完成后,可以通过以下命令验证:
ifcolor --version
基本语法和用法
ifcolor 的基本语法如下:

ifcolor [选项] --then <command> --else <command>
常用选项:
-f, --file <filename>: 从指定文件读取内容,而不是从标准输入。--then <command>: 当检测到颜色时执行的命令。--else <command>: 当未检测到颜色时执行的命令。
实用示例
示例 1:判断命令输出是否有颜色
这是一个非常经典的用例,我们可以用 ifcolor 来判断 ls 命令是否在彩色输出。
# ls --color=always 强制输出颜色 ls --color=always | ifcolor --then "echo '输出是彩色的!'" --else "echo '输出是黑白的。'"
预期输出:
输出是彩色的!
对比一下:
# ls --color=never 强制不输出颜色 ls --color=never | ifcolor --then "echo '输出是彩色的!'" --else "echo '输出是黑白的。'"
预期输出:
输出是黑白的。
示例 2:处理有颜色的 grep 输出
grep 默认会为匹配到的文本高亮显示(即带颜色),我们可以利用这一点。
echo "hello world, this is a test" | grep "hello" | ifcolor --then "echo '找到了匹配项,grep 给它加了颜色'" --else "echo '没有找到匹配项,或者 grep 没有输出颜色'"
预期输出:
找到了匹配项,grep 给它加了颜色
示例 3:根据颜色决定如何处理文件
假设你有一个日志文件 app.log,其中某些错误信息被标记为红色,你想提取这些错误信息。
-
创建一个带颜色的日志文件:
echo -e "\x1b[32m[INFO] Application started successfully.\x1b[0m" > app.log echo -e "\x1b[31m[ERROR] Failed to connect to database.\x1b[0m" >> app.log echo -e "\x1b[32m[INFO] User logged in.\x1b[0m" >> app.log
-
使用
ifcolor来过滤这些带颜色的行(即错误行):ifcolor -f app.log --then "cat app.log" --else "echo '文件中没有带颜色的行'"
这个命令会读取
app.log,因为文件中包含颜色代码,所以它会执行cat app.log,将整个文件内容打印出来。 -
更有用的场景:我们只想处理带颜色的行,我们可以结合
grep的--color=always和ifcolor来实现一个巧妙的过滤:# 1. 用 grep --color=always 确保所有匹配的行都带上颜色 # 2. 用 ifcolor 判断这些行是否有颜色 # 3. 如果有颜色,就执行 sed 命令移除 ANSI 颜色码,只保留文本 grep --color=always "ERROR" app.log | ifcolor --then "sed 's/\x1b\[[0-9;]*m//g'" --else "echo '没有找到错误'"
预期输出:
[ERROR] Failed to connect to database.命令解析:
grep --color=always "ERROR" app.log: 会输出所有包含 "ERROR" 的行,并且给 "ERROR" 这几个字加上红色。| ifcolor --then ...:ifcolor接收到这些带颜色的行,因此执行--then后面的命令。sed 's/\x1b\[[0-9;]*m//g': 这是一个sed命令,用于移除所有 ANSI 颜色转义码,最终得到干净的文本。
示例 4:在脚本中做出决策
ifcolor 的退出状态码(exit code)也很有用:
- 如果检测到颜色,退出码为
0(成功)。 - 如果没有检测到颜色,退出码为
1(失败)。
这让我们可以在 if 语句中直接使用它。
#!/bin/bash
# 模拟一个可能带颜色的命令输出
output=$(ls --color=always)
if echo "$output" | ifcolor --then /bin/true --else /bin/false; then
echo "检测到颜色,可以执行彩色友好的操作。"
else
echo "未检测到颜色,执行黑白友好的操作。"
fi
ifcolor 虽然是一个小众工具,但在处理脚本和命令管道时非常强大,它的主要优势在于:
- 自动化决策:让脚本能够“感知”到输出的格式,从而做出不同的反应。
- 处理日志:可以方便地从日志中提取被高亮或标记为特殊颜色的条目。
- 兼容性测试:可以测试一个程序是否正确地支持了
--color或--no-color选项。 - 构建工具链:作为复杂命令管道中的一个判断环节,实现更精细的控制。
如果你经常需要编写复杂的 shell 脚本或者处理各种格式的命令输出,ifcolor 绝对是一个值得加入你工具箱的利器。
