Llevo años usando cat en el terminal. Lo tengo tan interiorizado que lo escribo sin pensar, igual que respiras. Para leer archivos, para concatenarlos, para redirigir salidas. Es la navaja suiza de los comandos básicos, la que instalas una vez y no vuelves a mirar atrás. Hasta que un día te topas con algo que te hace preguntarte cómo has podido vivir tanto tiempo sin ello. Y eso es exactamente lo que me pasó con bat. Lo tenía apuntado en mi buzón de entrada, esperando, y no le presté atención hasta que me senté a probarlo en serio. Menuda maravilla, no se cómo no he dedicado tiempo antes. bat no es más que cat supervitaminado, un clon con alas (a cat clone with wings), como lo define su creador, y desde la primera vez que lo ejecutas notas la diferencia.

¿Qué es bat?
bat es una herramienta escrita en Rust por sharkdp (David Peter) que hace exactamente lo mismo que cat pero con esteroides. Es un clon directo, puedes usarlo como sustituto inmediato sin cambiar tus hábitos. La diferencia está en lo que ves cuando lo ejecutas.
Mientras que cat te escupe el contenido del archivo en texto plano, sin más, bat te lo muestra con syntax highlighting, números de línea, una cabecera con el nombre del archivo y, si estás en un repositorio Git, marcadores de cambios en la barra lateral. Todo esto sin que tengas que configurar nada. Lo instalas y funciona.
Y no es un truco de magia. Por debajo usa la librería syntect, que a su vez carga las definiciones de sintaxis de Sublime Text. Esto le da soporte para unos 150 lenguajes de programación y marcado, con detección automática por extensión de archivo y por shebang. Si el archivo tiene extensión .py, aplica resaltado de Python. Si el shebang dice #!/usr/bin/env node, aplica JavaScript. Y si no hay manera de saberlo, puedes forzarlo con -l.
El proyecto es uno de los más populares escritos en Rust, con casi 60.000 estrellas en GitHub. Y no es para menos. La versión actual es la 0.26.1, publicada en diciembre de 2025, con la 0.27.0 ya en desarrollo. La licencia es dual MIT / Apache 2.0, así que puedes usarlo donde quieras.
El hecho de que esté escrito en Rust no es un detalle menor. El lenguaje garantiza que no haya fugas de memoria ni comportamientos inesperados, y el rendimiento está muy cerca del de cat para archivos pequeños. Solo notas la diferencia con archivos muy grandes, donde el highlighting tiene un coste, pero en esos casos bat se salta el highlighting automáticamente para líneas de más de 16384 caracteres.
La historia de bat también es curiosa. David Peter creó el proyecto en 2018 como un experimento para aprender Rust y para cubrir una necesidad que tenía: un cat con syntax highlighting que funcionara bien. El proyecto creció rápido, en parte porque ccat (el precursor) estaba abandonado, y en parte porque la calidad del highlighting y la integración con Git eran muy superiores. En apenas dos años ya tenía más de 20.000 estrellas. Ahora, con casi 60.000, es uno de los referentes del ecosistema Rust.
Especificaciones técnicas
| Métrica / Feature | Detalles |
|---|---|
| Versión actual | 0.26.1 (diciembre 2025) |
| Licencia | MIT / Apache 2.0 (dual) |
| Autor | sharkdp (David Peter) |
| Lenguaje | Rust (97.7 %) |
| Estrellas | ~59.8k |
| SOs soportados | Linux, macOS, Windows, BSD |
| Lenguajes con highlighting | ~150 |
| Pager por defecto | less (o pager integrado ‘minus’ con --pager=builtin) |
| Backend Git | gix (gitoxide) desde v0.26.x |
| MSRV | 1.88 (en master) |
Características clave
Syntax highlighting de verdad
Esto es lo que vende bat y lo que marca la diferencia. No estamos hablando de colorear cuatro palabras clave. El highlighting de bat es de la misma calidad que el de un editor de texto moderno, porque usa las mismas definiciones de sintaxis que Sublime Text.
La detección es automática. Si tienes un archivo server.js, bat aplica JavaScript. Si es index.html, aplica HTML. Si es un Dockerfile, aplica la sintaxis de Docker. Y si tienes un archivo sin extensión pero con un shebang como #!/bin/bash, lo detecta igual.
El resultado es que leer código en el terminal deja de ser un suplicio. Las palabras clave aparecen en un color, los strings en otro, los comentarios en un tercero. Es exactamente lo mismo que ves en tu editor, pero en el terminal.
bat server.js bat Dockerfile bat ~/.bashrc
Puedes forzar un lenguaje concreto si la detección falla:
bat -l python archivo_sin_extension bat -l cpp archivo_con_sintaxis_rarita
Integración nativa con Git
Esta es de las funcionalidades que más me gustan. Si el archivo que estás viendo está bajo el control de versiones de Git, bat te muestra en la barra lateral unos marcadores: un + junto a las líneas añadidas, un - junto a las eliminadas. En un vistazo sabes qué ha cambiado sin tener que ejecutar git diff.
# En un repositorio Git, con cambios sin staged bat src/main.py # Verás + y - en la barra lateral izquierda
La integración usa el backend gix (gitoxide) desde la versión 0.26.x, que es una implementación pura en Rust del protocolo Git. Antes usaba libgit2, pero la migración a gix ha mejorado el rendimiento y reduce dependencias.
Paginación inteligente
Si el archivo es más largo que tu terminal, bat paga automáticamente con less. Pero no es un less cualquera: bat pasa opciones específicas para que la experiencia sea fluida, como -R para colores, -F para salir si el contenido cabe en una pantalla, y -X para evitar que el contenido desaparezca al salir.
Puedes controlar el comportamiento con --paging:
# Siempre paginar, incluso si cabe en pantalla bat --paging=always archivo_largo.txt # Nunca paginar (comportamiento como cat) bat --paging=never archivo_grande.txt # Auto (por defecto) bat --paging=auto archivo.txt
Desde la versión 0.26.0 tienes una opción nueva: --pager=builtin. Esto usa el pager integrado llamado minus, que está escrito en Rust y elimina la dependencia de less. Es más rápido en sistemas donde less no está instalado, como en algunos contenedores Docker.
bat --pager=builtin archivo_largo.txt
Estilo y componentes visuales
La barra lateral de bat no es solo para los números de línea. Puedes personalizar cada componente visual con --style. Los componentes disponibles son:
numbers: números de línea en la izquierdachanges: marcadores de Git (+ y -)grid: línea vertical que separa los números del contenidoheader-filename: nombre del archivo en la cabeceraheader-filesize: tamaño del archivo en la cabecerasnip: indicador de líneas omitidas entre archivos al concatenarrule: línea horizontal entre archivos concatenados
Puedes combinarlos con sintaxis aditiva y sustractiva:
# Solo números y cambios Git, sin grid bat --style="numbers,changes" archivo.txt # Estilo completo pero sin grid bat --style=full,-grid archivo.txt # Sin decoraciones, plano bat --style=plain archivo.txt
Caracteres no imprimibles y otras utilidades
bat también puede mostrarte los caracteres no imprimibles, algo muy útil para depurar archivos con problemas de formato:
bat -A archivo.txt
La opción -A o --show-all muestra tabulaciones como ^I, finales de línea como $, y espacios como ·. Te sorprendería la de veces que un archivo aparentemente limpio esconde tabulaciones mezcladas con espacios o caracteres de control invisibles.
Otra opción que uso a menudo es --squeeze-blank o -s, disponible desde la versión 0.25.0. Comprime líneas vacías consecutivas en una sola:
bat -s archivo_con_muchos_saltos.log
Y si trabajas con logs que tienen secuencias ANSI (códigos de color), puedes limpiarlas con --strip-ansi:
some_command_with_colors | bat --strip-ansi -l log
Temas y personalización
bat viene con una colección de temas de syntax highlighting. El tema por defecto es Monokai Extended para fondos oscuros y Monokai Extended Light para fondos claros. Pero tienes muchos más:
# Listar todos los temas disponibles bat --list-themes
Para previsualizar los temas, puedes combinarlo con fzf:
bat --list-themes | fzf --preview="bat --theme={} --color=always /ruta/a/un/archivo"
Algunos de los temas incluidos son:
- Monokai Extended y Monokai Extended Light
- TwoDark
- Catppuccin (nuevo en v0.26.0)
- Gruvbox
- GitHub
- OneHalfDark y OneHalfLight
- Solarized (dark y light)
- ansi, base16, base16-256 (para terminales sin truecolor)
Puedes seleccionar el tema con la variable de entorno BAT_THEME:
export BAT_THEME="TwoDark" export BAT_THEME_DARK="Catppuccin" export BAT_THEME_LIGHT="GitHub"
Desde la versión 0.25.0, bat puede cambiar el tema automáticamente según el modo claro u oscuro de tu sistema:
bat --theme auto:system --theme-dark default --theme-light GitHub archivo.txt
Si quieres añadir temas personalizados, puedes descargar archivos .tmTheme de Sublime Text:
mkdir -p "$(bat --config-dir)/themes" cd "$(bat --config-dir)/themes" git clone https://github.com/greggb/sublime-snazzy bat cache --build
Integración con el ecosistema
bat no es una isla. Se integra con un montón de herramientas que probablemente ya usas. De hecho, una vez que lo pruebas, acabas encontrando formas de usarlo en sitios donde antes usabas cat o less.
Como pager de man:
export MANPAGER="bat -plman" man 2 select
Como previewer de fzf:
fzf --preview "bat --color=always --style=numbers --line-range=:500 {}"
Con fd (del mismo autor, también recomendable):
fd -e rs -X bat
Con find:
find . -name "*.py" -exec bat {} +
Para el --help de cualquier comando:
alias bathelp='bat --plain --language=help' help() { "$@" --help 2>&1 | bathelp; } help git commit help cp
Con tail -f para logs en tiempo real:
tail -f /var/log/pacman.log | bat --paging=never -l log
Instalación
Aquí no hay excusa. bat está disponible en los repositorios de prácticamente todas las distribuciones Linux, en macOS, en Windows, y por supuesto, puedes compilarlo desde código fuente.
Ubuntu y Debian
En versiones recientes (Ubuntu 20.04+, Debian 11+), bat está en los repositorios oficiales:
sudo apt update sudo apt install bat
Atención: En versiones antiguas de Ubuntu y Debian, el paquete se llama bat pero el binario se instala como batcat por un conflicto de nombre con otro paquete. Si al ejecutar bat te da error, seguro que es por esto. La solución es sencilla:
# Crear un symlink mkdir -p ~/.local/bin ln -s /usr/bin/batcat ~/.local/bin/bat # O añadir un alias en ~/.bashrc alias bat="batcat"
Fedora
sudo dnf install bat
Arch Linux
sudo pacman -S bat
Alpine
apk add bat
Gentoo
emerge sys-apps/bat
Nix / NixOS
nix-env -i bat
openSUSE
zypper install bat
FreeBSD y OpenBSD
# FreeBSD pkg install bat # OpenBSD pkg_add bat
macOS
# Con Homebrew brew install bat # Con MacPorts port install bat
Windows
# Con WinGet (recomendado) winget install sharkdp.bat # Con Chocolatey choco install bat # Con Scoop scoop install bat
Desde GitHub Releases
Si quieres la última versión sin depender de los repositorios de tu distribución, puedes descargar los binarios directamente desde GitHub Releases. Allí encontrarás paquetes .deb y .rpm, además de binarios estáticos enlazados con musl (archivos con musl en el nombre).
# Para Debian/Ubuntu wget https://github.com/sharkdp/bat/releases/download/v0.26.1/bat_0.26.1_amd64.deb sudo dpkg -i bat_0.26.1_amd64.deb
Desde crates.io (Rust)
Si tienes Rust instalado, puedes compilarlo desde el código fuente:
cargo install --locked bat
Esto requiere Rust 1.79 o superior. Si compilas desde master, necesitas la 1.88.
Configuración
bat es de esas herramientas que funcionan bien sin tocar nada, pero que si te pones a configurar, no sabes cómo habías estado sin hacerlo.
Variables de entorno
La forma más rápida de configurar bat es a través de variables de entorno. Aquí tienes las más importantes:
| Variable | Descripción | Ejemplo |
|---|---|---|
BAT_THEME |
Tema de highlighting | export BAT_THEME="TwoDark" |
BAT_THEME_DARK |
Tema para modo oscuro | export BAT_THEME_DARK="Catppuccin" |
BAT_THEME_LIGHT |
Tema para modo claro | export BAT_THEME_LIGHT="GitHub" |
BAT_STYLE |
Componentes de estilo | export BAT_STYLE="numbers,changes" |
BAT_PAGER |
Pager a usar | export BAT_PAGER="less -RFK" |
BAT_PAGING |
Cuándo paginar | export BAT_PAGING="never" |
BAT_CONFIG_PATH |
Ruta al archivo de configuración | |
BAT_TABS |
Tamaño de tabulación | export BAT_TABS=2 |
Puedes ponerlas en tu ~/.bashrc o ~/.zshrc para que se carguen automáticamente:
cat >> ~/.bashrc << 'EOF' export BAT_THEME="OneHalfDark" export BAT_STYLE="numbers,changes,header" export BAT_PAGER="less -RFK" EOF
Archivo de configuración
Si prefieres tener la configuración en un archivo, bat usa ~/.config/bat/config. Puedes ver dónde está el tuyo con:
bat --config-file
Y generar un archivo de configuración por defecto con:
bat --generate-config-file
El formato es sencillo: cada línea es un flag de línea de comandos. Aquí tienes un ejemplo de configuración real:
# ~/.config/bat/config # Tema --theme="TwoDark" # Estilo: números de línea, cambios git, cabecera, sin grid --style="numbers,changes,header" # Negro itálico (no todos los terminales lo soportan) --italic-text=always # Asociar extensiones con sintaxis concretas --map-syntax="*.ino:C++" --map-syntax="*.conf:INI" --map-syntax="/etc/nginx/**/*.conf:NGINX"
Las variables de entorno tienen prioridad sobre el archivo de configuración, pero los argumentos de línea de comandos tienen prioridad sobre todo. Puedes pensar en la jerarquía así: argumentos CLI > variables de entorno > archivo de configuración.
Temas personalizados
Si los temas que vienen con bat no te convencen, puedes añadir los tuyos propios. Los temas están en formato .tmTheme, que es el formato de Sublime Text. Hay cientos disponibles en GitHub.
mkdir -p "$(bat --config-dir)/themes" cd "$(bat --config-dir)/themes" git clone https://github.com/greggb/sublime-snazzy bat cache --build
Después de añadir un tema, tienes que reconstruir la caché con bat cache --build. Luego ya puedes seleccionarlo con --theme="Snazzy" o BAT_THEME="Snazzy".
Sintaxis personalizadas
Igual que puedes añadir temas, puedes añadir definiciones de sintaxis para lenguajes que no vienen incluidos. El proceso es el mismo:
mkdir -p "$(bat --config-dir)/syntaxes" cd "$(bat --config-dir)/syntaxes" git clone https://github.com/tellnobody1/sublime-purescript-syntax bat cache --build
Asociar extensiones manualmente
A veces bat no acierta con la sintaxis de un archivo. Puedes forzar la asociación en el archivo de configuración:
# ~/.config/bat/config --map-syntax='*.conf:INI' --map-syntax='*.ignore:Git Ignore' --map-syntax='/etc/nginx/**/*.conf:NGINX' --map-syntax='*.rss:XML'
Casos de uso avanzados
bat como pager de man
Este es de mis favoritos. Las páginas del manual son útiles, pero leerlas en el terminal con el formateo por defecto es un poco… espartano. Con bat como pager de man, obtienes syntax highlighting directamente:
export MANPAGER="bat -plman" man 2 select
La opción -lman le dice a bat que use la sintaxis de man pages. El resultado es que las páginas del manual se ven con colores, mucho más legibles. Pruébalo con man bash y no querrás volver atrás.
bat con fzf
fzf es ese buscador difuso que te permite filtrar archivos, procesos, lo que sea. Combinado con bat como previewer, tienes un explorador de archivos visual en el terminal:
fzf --preview "bat --color=always --style=numbers --line-range=:500 {}"
Cuando navegas con fzf, bat te muestra una previsualización del archivo seleccionado, con highlighting y números de línea, limitado a las primeras 500 líneas para que no sea lento.
batdiff: ver los cambios de Git con highlighting
Una función muy útil para ver los cambios de Git con todo el highlighting de bat:
batdiff() { git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff }
Pruébala después de hacer cambios en un repositorio. La salida de git diff con bat es mucho más legible, con colores que distinguen añadidos, eliminados y modificaciones.
bathelp: highlighting para –help
Este truco te da highlighting para la ayuda de cualquier comando:
alias bathelp='bat --plain --language=help' help() { "$@" --help 2>&1 | bathelp; }
Luego ejecutas:
help git commit help rsync
Y la salida del --help aparece con colores, secciones marcadas, mucho más fácil de escanear visualmente.
bat-extras
El repositorio bat-extras de eth-p contiene un montón de scripts que extienden bat aún más. Los más útiles:
- batgrep: usa
batcomo formateador de resultados deripgrep - batman: lo mismo que el truco de
MANPAGERpero más completo - batdiff: similar a la función de arriba pero con más opciones
- prettybat: formatea código y lo muestra con
bat
# Instalar bat-extras git clone https://github.com/eth-p/bat-extras.git cd bat-extras ./build.sh # Usar batgrep batgrep needle src/
bat en tuberías
bat está diseñado para comportarse de forma inteligente en tuberías. Si detecta que la salida no es un terminal interactivo, se comporta como cat sin highlighting ni decoraciones. Esto es importante para scripting.
# En terminal: highlighting y paginación bat archivo.log # En tubería: sin highlighting, solo texto plano bat archivo.log | grep error
Pros vs Contras
Ninguna herramienta es perfecta. Aquí va mi valoración honesta después de meses usándolo a diario.
| 👍 Ventajas | 👎 Inconvenientes |
|---|---|
Sustitución directa de cat, no cambias hábitos |
Es más lento que cat en archivos grandes |
| Syntax highlighting de alta calidad para ~150 lenguajes | Puede tener problemas con entrada ANSI |
| Integración con Git impecable | Algunas distribuciones Linux empaquetan versiones antiguas |
| Funciona sin configuración, pero es altamente personalizable | En Ubuntu/Debian antiguos el binario se llama batcat |
Se integra con fzf, man, fd, ripgrep |
El highlighting añade latencia en archivos enormes (>10000 líneas) |
| Pager integrado ‘minus’ desde v0.26.0 | |
| Tema automático según modo claro/oscuro | |
| Escrito en Rust, rápido y seguro | |
| Open source, licencia MIT / Apache 2.0 |
Si quieres usar cat para archivos enormes sin perder highlighting, puedes hacer un alias que desactive la paginación:
alias cat='bat --paging=never'
Y para archivos realmente enormes, mejor usa cat directamente. bat está optimizado, pero el highlighting tiene un coste.
Alternativas
bat no es la única opción, aunque para mi es la mejor con diferencia. Aquí tienes un rápido vistazo a las alternativas:
cat: el clásico. Sin highlighting, sin Git, sin paginación. Para lo que nació, funciona.pygments: highlighting de altísima calidad, ~300 lenguajes, pero no es un reemplazo directo decat. Tienes que usarlo con tuberías. Es más lento quebaty no tiene paginación ni integración Git.highlight: similar a pygments, ~200 lenguajes, pero no es drop-in. Tiene más opciones de formato (HTML, RTF, LaTeX) pero no está pensado para el terminal.ccat: fue el precursor debat, pero está abandonado. Solo soporta ~7 lenguajes y no tiene paginación. Si conocistecatporccat,bates el relevo natural.source-highlight: viene preinstalado en muchos sistemas, soporta ~80 lenguajes, pero no es drop-in. Tienes que usarlo en tuberías.delta: no es un reemplazo decat, es un visor de diffs que usasyntect(la misma librería quebat). Muy recomendable si usasgit diffa menudo. De hecho,deltaybatse complementan muy bien.diff-so-fancy: otra opción para diffs, menos potente quedeltapero más ligera.hicat: highlighting en Node.js, ~130 lenguajes, con paginación, pero no es drop-in y requiere Node instalado.
Si quieres ver una comparativa más detallada, el propio proyecto mantiene un documento de alternativas donde se analizan todas las opciones con tablas y ejemplos.
Para mi, bat es la opción correcta en casi todos los casos. Es drop-in, funciona sin configuración, y cuando necesitas más, lo tienes.
Conclusión
Llevo meses usando bat a diario y no concibo volver a cat. No es que cat sea malo, es que bat es mejor en todo lo que importa. Te da syntax highlighting sin que tengas que hacer nada, se integra con Git de forma natural, y cuando necesitas personalizarlo, las opciones están ahí.
La evolución del proyecto ha sido impresionante. Desde la versión 0.24.0, con BAT_PAGING y soporte LESSOPEN, hasta la 0.26.1 con el pager integrado ‘minus’, temas Catppuccin y builds para Windows ARM64. Cada release suma funcionalidades que lo hacen más completo sin perder la esencia: ser un reemplazo directo de cat que funciona desde el primer momento.
Y lo que viene promete. La versión 0.27.0 traerá --sanitize para mitigar ataques Trojan-Source, --wrap=word para ajuste por palabras, --unbuffered para streaming con tail -f, y la migración completa a gitoxide como backend Git. El proyecto no se duerme en los laureles.
Si trabajas en el terminal, aunque sea de vez en cuando, instálalo. Son cinco minutos y la diferencia es abismal. Empieza con alias cat='bat' y ya verás como en una semana no quieres otra cosa.
Y si ya lo usas, cuéntame en los comentarios qué integración te parece más útil. ¿El pager de man? ¿El previewer de fzf? ¿O el batdiff? Yo me quedo con el MANPAGER, no sabes lo que es leer el manual de bash con colores hasta que lo pruebas.
Más información,
- Repositorio oficial de bat
- Releases de bat en GitHub
- CHANGELOG completo de bat
- Documentación en Wiki
- Alternativas comparadas
- bat en crates.io
- bat-extras (herramientas adicionales)
- delta (visor de diffs, usa syntect)
- fzf + bat (previewer)
- fd (alternativa a find, mismo autor)
- NO_COLOR (iniciativa)
- Repology: estado de bat en paquetes