bat el cat con alas que revoluciona tu terminal

Vistas: 18577
bat el cat con alas que revoluciona tu terminal

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.

bat un cat con alas
bat un cat con alas

¿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 izquierda
  • changes: marcadores de Git (+ y -)
  • grid: línea vertical que separa los números del contenido
  • header-filename: nombre del archivo en la cabecera
  • header-filesize: tamaño del archivo en la cabecera
  • snip: indicador de líneas omitidas entre archivos al concatenar
  • rule: 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 bat como formateador de resultados de ripgrep
  • batman: lo mismo que el truco de MANPAGER pero 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 de cat. Tienes que usarlo con tuberías. Es más lento que bat y 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 de bat, pero está abandonado. Solo soporta ~7 lenguajes y no tiene paginación. Si conociste cat por ccat, bat es 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 de cat, es un visor de diffs que usa syntect (la misma librería que bat). Muy recomendable si usas git diff a menudo. De hecho, delta y bat se complementan muy bien.
  • diff-so-fancy: otra opción para diffs, menos potente que delta pero 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,

Deja una respuesta