LS_COLORS —— ls、dircolors、文件列表的 ANSI 颜色
GNU `ls` 每次调用都会读取 `LS_COLORS` 环境变量 —— 一个冒号分隔的 `type=SGR` 与 `*.ext=SGR` 串,按文件类型和尾缀给每个条目着色。BSD 派生的 `ls`(macOS、FreeBSD、OpenBSD)读取完全不同的环境变量 `LSCOLORS`,格式为固定位置 22 字符且不支持扩展名。下方七段复制即用片段覆盖完整 LS_COLORS 地图:环境变量语法、`dircolors` 工作流、BSD 分歧、GNU 权威默认值、`eza` / `exa` 扩展、`--color` / `NO_COLOR` / `CLICOLOR` 覆盖、以及 bash / zsh / fish / csh 的按 shell 接线。
配置片段
LS_COLORS —— 冒号分隔的 key=value 字符串语法
GNU `ls --color=auto` 每次调用都会读取 `LS_COLORS` 环境变量。它是单个由冒号分隔的 `key=SGR` 串。键有两类:**类型标记**(两字母助记符匹配文件类型 —— `di` 目录、`ln` 符号链接、`ex` 可执行、`fi` 普通文件、`pi` 管道 / FIFO、`so` 套接字、`bd` 块设备、`cd` 字符设备、`or` 悬空符号链接、`mi` 缺失目标、`tw` 可写粘滞目录、`ow` 可写他人目录、`st` 粘滞目录、`su` setuid、`sg` setgid、`ca` capability、`mh` 多硬链接、`do` Solaris door)和**扩展名标记**(`*.ext=SGR` 模式按尾缀匹配,默认大小写敏感 —— 不支持 glob 匹配,只支持精确尾缀)。值是去掉前导 `\x1b[` 与末尾 `m` 的 SGR 参数串:`01;31` = 粗体红前景、`38;5;208` = 256 调色板橘、`38;2;255;128;0` = 24 位真彩色。标记从左到右首次命中,后续条目覆盖前面。
# Minimal LS_COLORS — a few type tokens + a few extension tokens:
export LS_COLORS='di=01;34:ln=01;36:ex=01;32:*.tar=01;31:*.zip=01;31:*.gz=01;31:*.md=00;33'
# What each pair means:
# di=01;34 directories → bold blue
# ln=01;36 symlinks → bold cyan
# ex=01;32 executables → bold green
# *.tar=01;31 .tar files → bold red
# *.zip=01;31 .zip files → bold red
# *.gz=01;31 .gz files → bold red
# *.md=00;33 .md files → yellow
# 256-palette + truecolor (coreutils 8.32+, 2020):
export LS_COLORS='di=38;5;33:*.json=38;2;255;128;0'
# di=38;5;33 directories → palette index 33 (blue)
# *.json=38;2;… .json files → orange 24-bit
# Important: case-sensitive by default. Match .JPG separately from .jpg
# unless you set TZ-style insensitivity via dircolors --print-database flags.
export LS_COLORS='*.jpg=01;35:*.JPG=01;35:*.png=01;35:*.PNG=01;35'
# Verify the env var is set, paged for readability:
echo "$LS_COLORS" | tr ':' '\n'dircolors —— 把可读数据库转换为 LS_COLORS
手写一个巨长的冒号分隔字符串很痛苦。`dircolors` 接受一个多行、注释友好的数据库(每行一个键、`# 注释`、节标题)然后输出 `LS_COLORS=…; export LS_COLORS` shell 命令。多数发行版自带 `/etc/DIR_COLORS`(只读)加用户可编辑的 `~/.dir_colors`。`dircolors -p` 把内置默认输出到 stdout —— 管道进文件后编辑,然后在 `.bashrc` 中 `eval $(dircolors -b ~/.dir_colors)`。输出格式 shell 感知:`-b` 输出 bash / sh 语法,`-c` 输出 csh / tcsh 语法。Fish 用户需要不同的接线 —— 见片段 7。
# 1. Generate a template — built-in default, fully commented:
dircolors -p > ~/.dir_colors
# Sample contents look like:
#
# # Files of special type
# DIR 01;34 # directory
# LINK 01;36 # symbolic link (a 'target' here for ls -l)
# EXEC 01;32 # files with execute permission
#
# # Archives or compressed (bright red)
# .tar 01;31
# .tgz 01;31
# .zip 01;31
#
# # Image formats (bright magenta)
# .jpg 01;35
# .png 01;35
# 2. Edit ~/.dir_colors to taste, then wire it into ~/.bashrc:
echo 'eval "$(dircolors -b ~/.dir_colors)"' >> ~/.bashrc
# 3. Reload the shell or:
eval "$(dircolors -b ~/.dir_colors)"
# Verify it landed:
ls --color=always | head
# csh / tcsh form:
eval \`dircolors -c ~/.dir_colors\`BSD ls —— LSCOLORS 是完全不同的格式(本页最大差异化)
macOS、FreeBSD、OpenBSD、NetBSD 自带 BSD 派生的 `ls` —— 它不读 `LS_COLORS`。它读 `LSCOLORS`(注意:没有下划线)且格式是固定位置的 22 字符串,每对字符按硬编码顺序为某个文件类型槽位编码(前景, 背景):`目录 · 符号链接 · 套接字 · 管道 · 可执行 · 块设备 · 字符设备 · setuid · setgid · 粘滞他人可写 · 他人可写`。每个字符为 `a-h`(小写 = 颜色)/ `A-H`(大写 = 粗体颜色)/ `x`(默认)。字母映射:`a=黑 b=红 c=绿 d=褐 / 黄 e=蓝 f=品红 g=青 h=浅灰`。**不支持按扩展名着色** —— BSD `ls` 仅按类型着色,绝不按 `.tar` / `.zip` 尾缀。`ls -G` 启用颜色(BSD 默认关)或在 env 中 `CLICOLOR=1`;管道时强制开 `CLICOLOR_FORCE=1`。多数跨平台 dotfile 同时设置 `LS_COLORS` 和 `LSCOLORS`,让同一份 `~/.bashrc` 在 Linux 和 macOS 都能用。
# BSD LSCOLORS — 11 pairs (22 chars), hard-coded slot order:
#
# pos slot default
# 1-2 directory ex (blue, default-bg)
# 3-4 symlink fx (magenta, default-bg)
# 5-6 socket cx (green, default-bg)
# 7-8 pipe / FIFO dx (brown / yellow, default-bg)
# 9-10 executable bx (red, default-bg)
# 11-12 block device egcx -- wait, this is wrong;
# the canonical slot is:
# block device cd (green, brown)
# 13-14 char device ed (blue, brown)
# 15-16 setuid ab (black, red)
# 17-18 setgid ag (black, cyan)
# 19-20 sticky+other-writable hb (light-gray, red)
# 21-22 other-writable hc (light-gray, green)
#
# Letter map (BSD-specific, NOT ANSI / SGR numerics):
# a=black b=red c=green d=brown e=blue f=magenta g=cyan h=light-gray
# uppercase = bold version of the same colour
# x = default terminal colour
#
# BSD ls colour default — the value of LSCOLORS if you don't set it:
export LSCOLORS='exfxcxdxbxegedabagacad'
# Enable colour on BSD ls — default-off, opposite of GNU ls:
export CLICOLOR=1 # honour TTY detection
export CLICOLOR_FORCE=1 # force on pipe (skip if you pipe to grep)
# Verify with ls -G (BSD-flag) or just ls (when CLICOLOR is set):
ls -G
# Cross-platform dotfile — set BOTH so Linux + macOS work from the same file:
export LS_COLORS='di=01;34:ln=01;36:ex=01;32:*.tar=01;31:*.zip=01;31'
export LSCOLORS='ExFxCxDxBxegedabagacad' # uppercase = bold on BSD
# Or just install GNU coreutils on macOS for unified behaviour:
# brew install coreutils
# alias ls='gls --color=auto'
# Then LS_COLORS applies on macOS too.权威的 GNU LS_COLORS 默认值 —— 可复制粘贴
如果你只想要一行可粘贴的、`dircolors -p | dircolors --bourne-shell` 在 GNU coreutils 9.x 上会产出的默认值 —— 见下方。保存到 `.bashrc` 就有上游默认而无需运行 `dircolors` —— 在最小化容器 / Alpine / scratch 镜像 / distroless 等可能没有 `dircolors` 的场景特别有用。类型标记在前,扩展名标记按颜色分组(归档红、图片品红、音频青、源码默认)。最后写入的覆盖前面,故较窄的扩展覆盖应放在广义类型标记之后。
# Canonical GNU coreutils 9.x default LS_COLORS, one line:
export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
# Notes on the special type tokens at the front:
# rs=0 reset (delimits coloured regions in a row)
# mh=00 multi-hardlink — empty value = use default
# pi=40;33 pipe / FIFO → black bg, yellow fg
# so=01;35 socket → bold magenta
# do=01;35 Solaris door → bold magenta
# bd=40;33;01 block dev → black bg, bold yellow fg
# cd=40;33;01 char dev → black bg, bold yellow fg
# or=40;31;01 orphan link → black bg, bold red fg
# mi=00 missing target — empty = use default
# su=37;41 setuid → white fg, red bg
# sg=30;43 setgid → black fg, yellow bg
# ca=00 capability — empty = use default (capabilities deprecated)
# tw=30;42 sticky + other-writable → black fg, green bg
# ow=34;42 other-writable → blue fg, green bg
# st=37;44 sticky → white fg, blue bg
# ex=01;32 executable → bold greeneza / exa —— 现代 ls 替代品及其自定义颜色系统
`exa`(已弃用,最后提交 2022)及其活跃维护的派生 **`eza`** 是流行的 `ls` 替代品。为向后兼容它们也读 `LS_COLORS`,但同时支持自己的更丰富按元素颜色环境变量 `EXA_COLORS` / `EZA_COLORS`,包含 GNU `ls` 没有的额外槽位:文件权限(`ur` 用户读、`uw` 用户写、`ux` 用户执行,以及 `gr` `gw` `gx` `tr` `tw` `tx` 组 / 他人)、inode 列(`in`)、大小单位后缀(`sn` 大小数字、`sb` 大小字节单位)、日期列(`da` 重点日期、`df` 未来日期等)、git 状态列(`ga` 新增、`gm` 修改、`gd` 删除、`gn` 重命名、`gv` 更新)。同样的 `key=SGR` 语法。如希望纯自定义调色板,先 `EZA_COLORS=reset` 丢弃默认。
# Minimal eza override — keep LS_COLORS, add eza-specific slots:
export EZA_COLORS='ur=33:uw=31:ux=32:gr=33:gw=31:gx=32:in=38;5;240:sn=38;5;33:sb=38;5;240'
# What each pair means in eza output:
# ur=33 user read → yellow
# uw=31 user write → red
# ux=32 user execute → green
# gr=33 group read → yellow
# gw=31 group write → red
# gx=32 group execute → green
# in=38;5;240 inode column → 256-palette dim grey
# sn=38;5;33 size number → palette blue
# sb=38;5;240 size byte unit → palette dim grey
# eza git-status column slots (only when --git is passed):
export EZA_COLORS='ga=32:gm=33:gd=31:gn=35:gv=36:ga|gm|gd|gn|gv=01'
# ga=32 added → green
# gm=33 modified → yellow
# gd=31 deleted → red
# gn=35 renamed → magenta
# gv=36 updated → cyan
# Reset eza defaults and start from a clean slate:
export EZA_COLORS='reset:ur=33:uw=31:ux=32'
# Same syntax for the older exa binary:
export EXA_COLORS='reset:ur=33:uw=31:ux=32'
# Aliases for ls drop-in:
alias ls='eza --color=auto'
alias ll='eza -l --git --color=auto'
alias la='eza -la --color=auto'
alias tree='eza --tree --color=auto'--color 标志 · NO_COLOR · CLICOLOR · CLICOLOR_FORCE —— 单次调用覆盖
GNU `ls` 接受 `--color={auto,always,never}`。`auto`(多数发行版 `LS_COLORS` 设置后的默认)仅在 TTY 上发出 SGR;`always` 强制颜色即便管道(配合 `less -R` 有用);`never` 禁用。通用 `NO_COLOR` 环境变量(coreutils 8.30 / 2018 起)覆盖一切 —— 等效于 `--color=never`。BSD `ls` 用不同标志:`-G` 启用颜色(默认关)、`CLICOLOR=1` env 等价、`CLICOLOR_FORCE=1` 通过管道强制颜色。`eza` / `exa` 镜像 GNU 的 `--color` 标志且尊重 `NO_COLOR`。提示:只在管道到渲染器(`less -R`、`bat`、`aha`)时用 `--color=always` —— 把颜色管到 `grep` / `wc` 会把 SGR 注入匹配字符串,破坏朴素子串匹配。
# GNU ls — three colour modes:
ls --color=auto # TTY-only (the sensible default)
ls --color=always # force colour through pipes
ls --color=never # disable colour entirely
NO_COLOR=1 ls # universal env opt-out (coreutils 8.30+)
# Pipe coloured listing into a pager that renders SGR:
ls --color=always -la | less -R
# BSD ls — different flag set:
ls -G # one-shot enable (BSD-only flag)
CLICOLOR=1 ls # env equivalent
CLICOLOR_FORCE=1 ls | grep .conf # force through pipe (BSD)
# eza / exa equivalents:
eza --color=always -la | bat
NO_COLOR=1 eza # honoured
# Defeat parent shell's alias for one invocation:
\\ls # bypasses alias, runs the binary directly
command ls --color=never
# Common trap — colour bytes break grep substring matching:
ls --color=always | grep ".conf" # wrong — may miss matches
ls --color=never | grep ".conf" # right — clean bytes
ls --color=always | grep --color=never ".conf" # right — strip in grep
# Verify NO_COLOR is honoured site-wide (coreutils, grep, ripgrep, etc.):
env | grep -i color
NO_COLOR=1 ls && NO_COLOR=1 grep '' file.txt && NO_COLOR=1 rg pattern按 shell 接线 —— bash · zsh · fish · csh
`LS_COLORS` 是普通 env 变量;任何能导出 env 的 shell 都能设置。每个 shell 接线不同。`bash` 与 `zsh` 共享 `eval $(dircolors -b)` 模式。`fish` 更友好 —— `set -gx LS_COLORS …` 直接生效,且 fish 自带每元素颜色,可通过 `set fish_color_*` 配置。`csh` / `tcsh` 需要 `dircolors -c`(csh 语法输出)与 `setenv`。macOS bash 用户会踩双坑:`~/.bashrc` 仅在非登录 shell 运行,但 Terminal.app 启动登录 shell —— env 导出请放 `~/.bash_profile`(macOS 默认 zsh 时放 `~/.zprofile`)。
# ~/.bashrc (Linux) or ~/.bash_profile (macOS Terminal.app):
if [ -r ~/.dir_colors ]; then
eval "$(dircolors -b ~/.dir_colors)"
else
eval "$(dircolors -b)"
fi
alias ls='ls --color=auto'
# ~/.zshrc / ~/.zprofile (macOS default since 10.15):
if (( $+commands[dircolors] )); then
eval "$(dircolors -b ~/.dir_colors 2>/dev/null || dircolors -b)"
fi
alias ls='ls --color=auto'
# ~/.config/fish/config.fish:
if command -q dircolors
eval (dircolors -c ~/.dir_colors 2>/dev/null | sed 's/setenv/set -gx/')
end
alias ls 'ls --color=auto'
# Or use fish's native per-element colours instead of LS_COLORS:
set -gx fish_color_command green
set -gx fish_color_param normal
set -gx fish_color_quote yellow
set -gx fish_color_error red --bold
set -gx fish_color_autosuggestion 8a8a8a
# ~/.cshrc / ~/.tcshrc:
eval \`dircolors -c ~/.dir_colors\`
alias ls 'ls --color=auto'
# macOS double-trap reminder — these only run on LOGIN shell:
# ~/.bash_profile, ~/.zprofile, ~/.profile
# These only run on NON-login (subshell) shell:
# ~/.bashrc, ~/.zshrc
# Terminal.app spawns login shells; iTerm2 + VS Code terminal default
# to non-login. Source one from the other for symmetry:
# echo '[ -r ~/.bashrc ] && . ~/.bashrc' >> ~/.bash_profile相关参考
本站覆盖周边 ANSI / ls / pager 生态的相邻页面。
- Git 颜色配置配套按工具页面 —— git 的 color.ui / 按命令的键 / 槽位调色板 / core.pager + LESS=FRX / --color=always 管道配方。
- 剔除 ANSI 转义码事后剔除已捕获 `ls --color=always` 输出中 SGR 字节的正则 —— 重定向到文件归档时使用。
- ANSI 常见坑点相邻问题的「症状 → 成因 → 修复」—— 颜色字节破坏 grep 子串匹配、GNU vs BSD ls 分歧、NO_COLOR 未被尊重。
- 可访问性与 NO_COLORNO_COLOR / CLICOLOR / FORCE_COLOR 在非 CI 工具间环境变量契约的深入覆盖 —— 屏幕阅读器如何处理带转义的文件列表。