En la lección anterior cerraste el modelo mental del shell: sabes qué ocurre al pulsar Enter, cómo se resuelven los comandos y por qué las variables no sobreviven a un subshell. Queda una habilidad transversal antes de entrar en el arsenal de comandos del Módulo 2, y es probablemente la más rentable de todo el curso: saber resolver dudas por tu cuenta. Ningún profesional recuerda las cuarenta opciones de find, el orden de los campos de un crontab ni las diferencias entre -exec y xargs. Lo que sí sabe es dónde mirarlo en diez segundos y cómo verificar un comando peligroso antes de lanzarlo contra srv-veloz-01. Eso es lo que aprenderás aquí.

Contenido

  1. El ecosistema de documentación en Linux
  2. man: el manual del sistema
  3. Las secciones del manual
  4. Navegar y buscar dentro de una página de manual
  5. Leer un SYNOPSIS: la notación formal
  6. Buscar cuando no sabes el nombre del comando: man -k y apropos
  7. help: los builtins de Bash y por qué man cd falla
  8. --help: la ayuda rápida
  9. info, tldr y cheat
  10. Documentación oficial: manual de Bash y POSIX
  11. Estrategia práctica para resolver dudas
  12. Verificar comandos peligrosos antes de ejecutarlos

  1. El ecosistema de documentación en Linux

Linux es probablemente el sistema mejor documentado que existe, pero la documentación está repartida en varias fuentes con propósitos distintos. Saber cuál consultar en cada momento ahorra muchísimo tiempo.

Fuente Cómo se invoca Cubre Profundidad Cuándo usarla
man man ls Programas externos, formatos de fichero, llamadas al sistema Alta, exhaustiva Referencia completa y fiable
help help cd Builtins de Bash Media cd, export, test, read...
--help ls --help El propio programa Baja, resumen Recordar una opción rápido
info info coreutils Manuales extensos de GNU Muy alta Cuando man remite a info
tldr tldr tar Ejemplos de uso reales Muy baja "¿Cómo se hacía esto?"
Manual de Bash Web o man bash El lenguaje Bash completo Máxima Dudas de sintaxis del shell
POSIX Web El estándar Máxima Portabilidad

La regla mental que debes interiorizar es simple:

  • Si es un programa (ls, grep, tar, find) → man.
  • Si es un builtin de Bash (cd, export, read, test) → help.
  • Si es sintaxis del shell ([[ ]], expansiones, redirecciones) → man bash.
  • Si solo quieres un ejemplotldr.

  1. man: el manual del sistema

man (de manual) es la referencia canónica. Cada programa instalado trae su página, escrita por su autor.

man ls

Se abre un documento con una estructura estandarizada que verás una y otra vez:

Sección Contenido
NAME Nombre y descripción de una línea
SYNOPSIS Forma de invocación con su sintaxis formal
DESCRIPTION Explicación detallada y lista de opciones
OPTIONS Las opciones, si no están en DESCRIPTION
EXIT STATUS Códigos de salida y su significado
ENVIRONMENT Variables de entorno que afectan al programa
FILES Ficheros que usa o lee
EXAMPLES Ejemplos de uso (no todas las páginas los tienen)
SEE ALSO Comandos relacionados
BUGS Limitaciones conocidas

Un extracto real de man ls:

NOMBRE
       ls - lista el contenido de directorios

SINOPSIS
       ls [OPCIÓN]... [ARCHIVO]...

DESCRIPCIÓN
       Lista información sobre los ARCHIVOs (del directorio actual por omisión).
       Ordena las entradas alfabéticamente si no se especifica ninguna de
       -cftuvSUX ni --sort.

       -a, --all
              no oculta las entradas que comienzan por .

       -h, --human-readable
              con -l y/o -s, imprime tamaños legibles (p.ej., 1K 234M 2G)

       -t     ordena por tiempo de modificación, el más nuevo primero

Fíjate en dos cosas que aparecen constantemente:

  • Las opciones con forma corta y larga se listan juntas: -a, --all.
  • Hay dependencias entre opciones: -h dice explícitamente "con -l y/o -s". Es decir, ls -h solo no hace nada visible. Este tipo de matiz solo aparece en el manual, nunca en un tutorial apresurado.

Y la sección VALOR DE SALIDA de man ls confirma lo que vimos en 01-04:

ESTADO DE SALIDA
       0      si todo va bien,
       1      si hay problemas menores (p.ej. no se puede acceder a un subdirectorio),
       2      si hay problemas serios (p.ej. no se puede acceder a un argumento de
              la línea de órdenes).

  1. Las secciones del manual

El manual está dividido en secciones numeradas. Es importante porque un mismo nombre puede aparecer en varias.

Sección Contenido Ejemplo
1 Comandos de usuario man 1 crontab → el programa crontab
2 Llamadas al sistema (kernel) man 2 fork
3 Funciones de biblioteca C man 3 printf
4 Ficheros especiales de /dev man 4 null
5 Formatos de fichero y convenciones man 5 crontab → el formato del fichero
6 Juegos man 6 fortune
7 Miscelánea, convenciones, protocolos man 7 regex, man 7 signal
8 Comandos de administración man 8 mount, man 8 cron

Las tres que usarás de verdad son la 1 (comandos), la 5 (formatos de fichero) y la 8 (administración).

El ejemplo canónico de por qué esto importa es crontab, que usaremos en el Módulo 7:

man 1 crontab
CRONTAB(1)                    Órdenes de usuario
NOMBRE
       crontab - manipula las tablas cron de cada usuario
SINOPSIS
       crontab [-u usuario] fichero
       crontab [-u usuario] [-l | -r | -e]
man 5 crontab
CRONTAB(5)                Formatos de fichero
NOMBRE
       crontab - ficheros usados para programar la ejecución de órdenes

DESCRIPCIÓN
       ...
       campo          valores permitidos
       -----          -----------------
       minuto         0-59
       hora           0-23
       día del mes    1-31
       mes            1-12 (o nombres)
       día de semana  0-7 (0 o 7 es domingo, o nombres)

La sección 1 te dice cómo se invoca el programa; la sección 5 te dice cómo se escribe el fichero. Si escribes man crontab a secas, obtienes la 1, que no contiene la tabla de campos. Muchísima gente se atasca aquí y acaba buscando en internet algo que tenía a un comando de distancia.

Para saber en qué secciones existe un nombre:

man -f crontab
crontab (1)          - manipula las tablas cron de cada usuario
crontab (5)          - ficheros usados para programar la ejecución de órdenes

Y para abrir directamente todas, una tras otra:

man -a crontab

  1. Navegar y buscar dentro de una página de manual

man no muestra el texto de golpe: lo pasa a un paginador, normalmente less. Por eso los atajos de man son en realidad los de less, y te servirán también cuando leas logs largos.

Tecla Acción
Espacio / f Avanzar una pantalla
b Retroceder una pantalla
/ j Bajar una línea
/ k Subir una línea
g Ir al principio
G Ir al final
/texto Buscar hacia adelante
?texto Buscar hacia atrás
n Siguiente coincidencia
N Coincidencia anterior
q Salir
h Ayuda del propio paginador

La búsqueda con / es la técnica más importante de esta lección. Una página de manual como la de find tiene más de mil líneas; leerla entera es absurdo. Lo que se hace es buscar.

Ejemplo real: quieres saber cómo hacer que ls ordene por tamaño.

man ls

Dentro, teclea /sort y pulsa Enter. Pulsa n hasta llegar a:

       -S     ordena por tamaño de fichero, el mayor primero

Otro ejemplo aún más útil, buscando una opción concreta. Para localizar la descripción exacta de -t en man ls, la búsqueda /^\s*-t aprovecha que las opciones están indentadas al principio de línea. Las expresiones regulares se estudian en 05-04, pero desde hoy puedes usar el truco de buscar -t, o directamente --sort.

Un consejo de configuración: si prefieres que las búsquedas ignoren mayúsculas, exporta esto en tu ~/.bashrc:

export LESS='-R -i'

-R respeta los colores y -i hace las búsquedas insensibles a mayúsculas salvo que escribas alguna.

  1. Leer un SYNOPSIS: la notación formal

El SYNOPSIS es la parte más densa y la que más gente ignora, cuando en realidad condensa toda la gramática del comando. Usa una notación estándar:

Notación Significado Ejemplo
texto en negrita Escríbelo tal cual ls
TEXTO en cursiva/mayúsculas Sustitúyelo por tu valor ARCHIVO
[ ] Opcional [OPCIÓN]
... Se puede repetir [ARCHIVO]...
| Alternativa: elige una [-l | -r | -e]
{ } Agrupación de alternativas obligatorias {-a | -b}

Analicemos casos reales.

ls [OPCIÓN]... [ARCHIVO]...

Se lee: ls acepta cero o más opciones y cero o más archivos. Ambos son opcionales, por eso ls a secas funciona.

cp [OPCIÓN]... ORIGEN... DIRECTORIO

Se lee: cp acepta opciones (opcionales), uno o más orígenes (obligatorios, sin corchetes) y un directorio de destino (obligatorio, sin puntos suspensivos). La estructura te dice de un vistazo que el último argumento es el destino y que puede haber varios orígenes.

crontab [-u usuario] [-l | -r | -e]

Se lee: opcionalmente -u con un nombre de usuario, y opcionalmente una sola de las tres opciones -l, -r, -e. La barra vertical avisa de que son mutuamente excluyentes: crontab -l -e no tiene sentido.

grep [OPCIONES] PATRONES [FICHERO...]

Se lee: el patrón es obligatorio; los ficheros son opcionales y pueden ser varios. Que FICHERO sea opcional es la pista de que, si no lo indicas, grep leerá de la entrada estándar, que es justo lo que permite usarlo en tuberías.

Aprender a leer el SYNOPSIS te permite deducir el comportamiento de un comando sin leer una sola línea de la descripción.

  1. Buscar cuando no sabes el nombre del comando: man -k y apropos

El problema más frecuente no es "¿cómo se usa este comando?", sino "¿qué comando hace esto?". Para eso está la búsqueda por palabra clave en las descripciones.

man -k compress
gzip (1)             - comprime o expande ficheros
bzip2 (1)            - un compresor de ficheros ordenador por bloques
xz (1)               - comprime o descomprime ficheros .xz
zcat (1)             - descomprime ficheros a la salida estándar

apropos es exactamente lo mismo:

apropos "disk space"
df (1)               - informa sobre el espacio de disco ocupado
du (1)               - estima el espacio ocupado por ficheros

Puedes acotar la búsqueda a una sección:

man -k -s 1 "log"

Y combinarla con grep para filtrar más:

man -k file | grep -i "permission"
chmod (1)            - cambia los bits de modo de un fichero
chown (1)            - cambia el propietario y grupo de un fichero

Si man -k devuelve nada apropiado, probablemente la base de datos de índices no está construida. Se arregla con:

sudo mandb

  1. help: los builtins de Bash y por qué man cd falla

Recuperemos algo de la lección 01-04. Prueba esto:

man cd
No hay entrada de manual para cd

La explicación ya la conoces: cd no es un programa, es un builtin de Bash. No existe ningún fichero /usr/bin/cd que pueda traer su propia página de manual. La documentación de los builtins vive dentro del propio Bash, y se consulta con help:

help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
    Cambia el directorio de trabajo del shell.

    Cambia el directorio actual a DIR. DIR por defecto es el valor de la
    variable de shell HOME.

    Opciones:
      -L	fuerza a seguir los enlaces simbólicos: resuelve los enlaces
    		simbólicos en DIR después de procesar las instancias de '..'
      -P	usa la estructura física de directorios sin seguir los enlaces
    		simbólicos: resuelve los enlaces simbólicos en DIR antes de
    		procesar las instancias de '..'

    Estado de salida:
    Devuelve 0 si se cambia el directorio, y si $PWD se establece
    correctamente cuando se usa -P; si no, es distinto de cero.

Comprobación rápida de la regla, apoyándonos en type (01-04):

type -a cd export ls
cd es una orden interna del shell     ← help cd
export es una orden interna del shell ← help export
ls es /usr/bin/ls                     ← man ls

Si type dice "orden interna del shell", usa help. Si te da una ruta, usa man.

Builtins cuya ayuda consultarás a menudo durante este curso:

help test        # comparaciones con [ ... ]
help read        # leer entrada del usuario (03-05)
help declare     # tipos de variables y arrays (04-03)
help printf      # salida formateada
help set         # opciones del shell: set -e, set -u...
help trap        # capturar señales (05-03)

Sin argumentos, help lista todos los builtins disponibles:

help

Y admite patrones:

help 'ex*'
exec: exec [-cl] [-a nombre] [orden [argumentos ...]] [redirección ...]
exit: exit [n]
export: export [-fn] [nombre[=valor] ...] o export -p

Hay un caso especial que conviene conocer. Algunos builtins también existen como programa externo, así que tienen ambas documentaciones:

type -a test
test es una orden interna del shell
test es /usr/bin/test

help test documenta el builtin que realmente se ejecuta; man test documenta el programa de coreutils. Son casi idénticos, pero no del todo. La correcta es help test, porque es la que Bash usa. Lo mismo ocurre con echo, printf, kill y pwd.

Por último, para la sintaxis del propio lenguaje (no un builtin, sino construcciones como [[ ]], ${var%%patrón} o las redirecciones), la fuente es la página de manual de Bash:

man bash

Es enorme (más de 5.000 líneas), así que se navega buscando. Por ejemplo, teclea /Conditional Expressions para llegar a la documentación de [[ ]], o /Parameter Expansion para la de ${...}. Es la referencia definitiva del shell y volverás a ella durante todo el curso.

  1. --help: la ayuda rápida

Casi todos los programas aceptan --help y muestran un resumen en pantalla.

date --help
Modo de empleo: date [OPCIÓN]... [+FORMATO]
  o bien:  date [-u|--utc|--universal] [MMDDhhmm[[CC]AA][.ss]]
Muestra la fecha actual en el FORMATO dado.

  -d, --date=CADENA          muestra la fecha descrita por CADENA, no «ahora»
  -f, --file=FICHERO_FECHA   como --date, una vez por cada línea de FICHERO_FECHA
  -r, --reference=FICHERO    muestra la última fecha de modificación de FICHERO
  -u, --utc, --universal     muestra o establece el Tiempo Universal Coordinado

CADENAS DE FORMATO:
  %Y   año
  %m   mes (01..12)
  %d   día del mes (01..31)
  %H   hora (00..23)

Ventajas frente a man: es instantáneo, no abre un paginador y suele caber en una pantalla. Es lo que usarás el 80 % de las veces para recordar una opción concreta.

Advertencias importantes:

  • No es universal. Algunos programas usan -h, otros -?, y unos pocos ninguna de las dos. Si --help no funciona, prueba -h y luego man.
  • Cuidado con los comandos que interpretan --help como argumento. Un caso famoso: en find, --help sí funciona, pero en programas antiguos un argumento desconocido puede provocar comportamientos raros.
  • Si la salida es larga, canalízala a un paginador:
find --help | less

Un truco muy práctico cuando buscas una opción concreta: filtra la ayuda con grep.

ls --help | grep -i "size"
  -h, --human-readable       con -l y -s, imprime los tamaños de forma legible
      --block-size=TAMAÑO    con -l, escala los tamaños según TAMAÑO
  -S                         ordena por tamaño de fichero, el mayor primero
      --size, -s             imprime el tamaño asignado de cada fichero, en bloques

En cuatro líneas tienes todas las opciones relacionadas con tamaños. Esta combinación comando --help | grep es un reflejo que adquirirás rápido.

  1. info, tldr y cheat

9.1 info

El proyecto GNU documenta sus herramientas con info, un formato con hipervínculos y estructura de árbol. Muchas páginas man de GNU son en realidad resúmenes y terminan con una nota del tipo "la documentación completa está en el manual info".

info coreutils 'ls invocation'

Navegación básica:

Tecla Acción
Espacio Avanzar
n / p Nodo siguiente / anterior
u Subir un nivel
Enter sobre un enlace Seguirlo
q Salir

info es más completo que man para las coreutils (contiene ejemplos y explicaciones extensas), pero su navegación resulta incómoda para quien no está acostumbrado. Recurre a él cuando man te deje con dudas.

9.2 tldr

tldr (too long; didn't read) es un proyecto comunitario que ofrece solo ejemplos prácticos. Es el complemento perfecto de man: este te dice qué hace cada opción, aquel te dice cómo se usa de verdad.

sudo apt install tldr    # Debian/Ubuntu
tldr tar
tar

Utilidad de archivado, a menudo combinada con compresión.

- Crear un archivo comprimido:
  tar czf ruta/al/archivo.tar.gz ruta/a/ficheros

- Extraer un archivo comprimido:
  tar xzf ruta/al/archivo.tar.gz

- Listar el contenido sin extraer:
  tar tvf ruta/al/archivo.tar

Compara: man tar tiene más de 1.200 líneas; tldr tar cabe en media pantalla y resuelve el 90 % de los casos. Para comandos con sintaxis intrincada (tar, find, ffmpeg, awk) es una bendición.

9.3 cheat

cheat es similar pero permite crear tus propias chuletas, lo que encaja muy bien con un toolkit como veloz-ops:

cheat -e veloz-ops

Se abre tu editor y puedes guardar tus propias notas, que después consultas con cheat veloz-ops. Es una forma excelente de documentar convenciones internas del equipo.

Una advertencia sobre tldr y cheat: son contenido comunitario, no oficial. Están muy bien para recordar, pero cuando algo sea crítico o el comportamiento no coincida, la verdad está en man.

  1. Documentación oficial: manual de Bash y POSIX

Hay dos referencias escritas que todo profesional de Bash debe conocer.

10.1 El Manual de Referencia de Bash

Es el documento oficial del proyecto GNU, mantenido por Chet Ramey. Cubre el lenguaje completo: gramática, expansiones, builtins, control de trabajos, edición de línea. Está disponible en la web de GNU y, en local, con:

info bash
man bash

Es la fuente que zanja cualquier discusión sobre el comportamiento de Bash. Cuando en el Módulo 3 nos preguntemos exactamente en qué orden ocurren las expansiones, la respuesta está en su sección EXPANSION.

10.2 El estándar POSIX

POSIX (Portable Operating System Interface) es el estándar que define el comportamiento mínimo común de los shells Unix. Lo publica The Open Group y es la referencia para escribir scripts portables.

Su utilidad práctica es responder a la pregunta: "¿esto que estoy usando es de Bash o es estándar?". Si es solo de Bash, tu script no funcionará en dash, en Alpine ni en un BSD. La documentación de Bash marca sus extensiones, y en la lección 08-07 trabajaremos la portabilidad en detalle.

10.3 ShellCheck (mención)

ShellCheck es un analizador estático que detecta errores en scripts de shell antes de ejecutarlos: variables sin comillas, comparaciones mal escritas, usos que provocan comportamientos inesperados. Cada aviso lleva un código SCxxxx (por ejemplo, SC2086 para "las comillas dobles evitan la división de palabras"), y la wiki del proyecto explica cada uno con ejemplos de qué falla y cómo corregirlo.

Lo mencionamos aquí porque es documentación: la wiki de ShellCheck es una de las mejores fuentes para entender los errores clásicos de Bash. Su instalación y uso los veremos en la lección 08-05; por ahora, quédate con el nombre.

  1. Estrategia práctica para resolver dudas

Con tantas fuentes, conviene tener un procedimiento. Este es el que funciona.

graph TD
    A["Tengo una duda"] --> B{"¿Sé el nombre<br/>del comando?"}
    B -->|No| C["man -k palabra clave<br/>apropos"]
    C --> D
    B -->|Sí| D{"type -a comando"}
    D -->|"Orden interna"| E["help comando"]
    D -->|"Ruta a fichero"| F{"¿Necesito una opción<br/>o el detalle completo?"}
    F -->|"Solo una opción"| G["comando --help filtrado con grep"]
    F -->|"Detalle"| H["man comando<br/>+ / para buscar"]
    D -->|"Es sintaxis del shell"| I["man bash + /sección"]
    E --> J{"¿Resuelto?"}
    G --> J
    H --> J
    I --> J
    J -->|No| K["tldr comando<br/>info comando<br/>manual oficial"]
    J -->|Sí| L["Verificar antes de ejecutar"]
    K --> L

Traducido a pasos concretos:

  1. ¿Sé el nombre? Si no, man -k con una palabra clave en inglés (las descripciones están en inglés en la mayoría de sistemas).
  2. type -a comando para saber si es builtin, externo o keyword. Esto decide la fuente.
  3. Ayuda rápida primero: comando --help | grep loQueBusco. Resuelve la mayoría de las consultas en segundos.
  4. Si necesitas detalle, man comando y busca dentro con /. No leas de arriba abajo.
  5. Si sigue sin quedar claro, tldr comando para ver ejemplos reales, o info para las herramientas GNU.
  6. Verifica antes de ejecutar (siguiente sección). Este paso no es opcional en un servidor de producción.

Un consejo de método que marca la diferencia: cuando aprendas algo consultando el manual, anótalo. Un fichero ~/veloz-ops/etc/notas.md con las opciones que has necesitado convierte cada búsqueda en conocimiento acumulado en lugar de en una consulta repetida.

  1. Verificar comandos peligrosos antes de ejecutarlos

Esta sección puede ahorrarte un incidente grave. En srv-veloz-01 hay datos de producción; un comando mal entendido puede borrar los envíos de un mes.

12.1 Poner echo delante

La técnica más simple y más eficaz: antepón echo y mira qué se habría ejecutado realmente. Recuerda de la lección 01-04 que las expansiones ocurren antes de ejecutar el comando, así que echo te enseña el resultado exacto de esas expansiones.

cd /var/log/veloz
echo rm acceso.log.*
rm acceso.log.1 acceso.log.2 acceso.log.3

Ahora ves con precisión qué ficheros afectaría. Si la lista es la que esperabas, quita el echo y ejecuta. Si aparece algo inesperado, acabas de evitar un problema.

El caso donde esto salva de verdad:

echo rm -rf /srv/veloz/datos /historico
rm -rf /srv/veloz/datos /historico

El espacio accidental antes de /historico convierte una ruta en dos argumentos independientes. Con echo lo ves; sin echo, habrías borrado dos árboles distintos.

12.2 Usar --dry-run cuando exista

Muchos comandos ofrecen un modo de simulación:

Comando Opción de simulación
rsync -n, --dry-run
apt --dry-run, -s
make -n, --just-print
git clean -n
find ... -delete Quitar -delete y ver la lista primero
sed -i Ejecutar sin -i y ver la salida
rsync -avn /srv/veloz/datos/ /mnt/backup/datos/

La n de --dry-run hace que rsync liste exactamente lo que copiaría, sin copiar nada. En la lección 07-03, cuando construyamos el sistema de respaldo de veloz-ops, este será el primer paso obligatorio de cada prueba.

Cómo descubrir si un comando tiene modo simulación:

rsync --help | grep -i "dry"
 -n, --dry-run               realiza una ejecución de prueba sin hacer cambios

12.3 Otras precauciones

  • Ejecuta primero la parte que solo lee. Antes de find /srv -name "*.tmp" -delete, ejecuta find /srv -name "*.tmp" y revisa la lista.
  • Usa -i (interactivo) en comandos destructivos. rm -i pregunta por cada fichero.
  • Comprueba dónde estás y quién eres. pwd y whoami antes de cualquier borrado. Un rm -rf * en el directorio equivocado es irreversible.
  • Desconfía de los comandos copiados de internet, sobre todo los que llevan sudo, curl | bash, rm -rf o rutas absolutas al sistema. Léelos entero, descomponlos y busca en man cada opción que no reconozcas.
  • En Linux no hay papelera. rm no se deshace.

Un ejercicio de lectura crítica. Alguien te pasa esta línea "para limpiar logs viejos":

find /var/log -name "*.log" -mtime +7 -exec rm -f {} \;

Antes de ejecutarla, la descompones consultando man find:

  • -name "*.log": ficheros terminados en .log.
  • -mtime +7: modificados hace más de 7 días. (Buscando /mtime en el manual descubres que +7 significa "más de 7 días completos", un matiz que suele malinterpretarse.)
  • -exec rm -f {} \;: ejecuta rm -f sobre cada resultado.

Y detectas el problema: actúa sobre todo /var/log, no solo sobre /var/log/veloz. Borraría también los logs del sistema y de nginx. La versión segura sería:

# Primero mirar, sin borrar nada
find /var/log/veloz -name "*.log.*" -mtime +7

# Solo si la lista es correcta
find /var/log/veloz -name "*.log.*" -mtime +7 -delete

Ese hábito —descomponer, consultar, listar, y solo entonces ejecutar— es lo que separa a un profesional de alguien que un día tiene un muy mal día.

Errores Comunes y Consejos

  • Buscar man cd y concluir que la documentación no existe. Es un builtin: help cd. Comprueba siempre con type -a primero.
  • Escribir man crontab y no encontrar el formato del fichero. Necesitas la sección 5: man 5 crontab. Usa man -f nombre para ver en qué secciones existe.
  • Leer una página de manual de arriba abajo. Son documentos de referencia, no tutoriales. Entra y busca con /.
  • Confiar en tldr para algo crítico. Es contenido comunitario y puede estar desactualizado. Para decisiones importantes, man.
  • Ignorar la sección SEE ALSO. Suele contener justo el comando que necesitabas y no sabías que existía.
  • No leer EXIT STATUS. Si vas a usar un comando dentro de un script, sus códigos de salida son tan importantes como sus opciones.
  • Ejecutar comandos destructivos sin verificar. echo delante, o --dry-run. Siempre, incluso cuando creas que lo tienes claro.
  • Consejo: si man -k no devuelve nada, ejecuta sudo mandb para reconstruir el índice.
  • Consejo: man man y man bash merecen una lectura pausada al menos una vez en la vida. No para memorizarlas, sino para saber qué contienen.
  • Consejo: cuando un manual esté en inglés y te cueste, recuerda que los términos son siempre los mismos (pattern, recursive, verbose, overwrite, suppress). En una semana los reconoces todos.

Ejercicios

Ejercicio 1: Buscar opciones reales en man ls y man grep

Usando exclusivamente las páginas de manual (nada de buscadores web), averigua:

  1. Qué opción de ls muestra el número de inodo de cada fichero.
  2. Qué opción de ls ordena por fecha de modificación de más antigua a más reciente (necesitas combinar dos).
  3. Qué opción de grep muestra las 3 líneas siguientes a cada coincidencia.
  4. Qué opción de grep muestra solo el nombre de los ficheros que contienen la coincidencia, sin las líneas.
  5. Qué opción de grep invierte la búsqueda, mostrando las líneas que no coinciden.

Después, aplica lo aprendido a un caso de Veloz Envíos: muestra los ficheros de /var/log/veloz ordenados de más antiguo a más reciente, y localiza en app.log cada ERROR con sus 3 líneas de contexto posterior.

Ejercicio 2: help test y los builtins

  1. Comprueba con type -a si test es builtin, externo o ambos.
  2. Con help test, averigua qué hacen los operadores -f, -d, -r, -s y -z.
  3. Averigua también cómo se comprueba si un fichero es más reciente que otro.
  4. Escribe un comando de una línea que imprima "existe" si /var/log/veloz/app.log existe y tiene contenido.

Ejercicio 3: Verificación de un comando peligroso

Un compañero te envía este comando "para liberar espacio en el servidor":

find /srv/veloz -type f -name "*.csv" -mtime +30 -exec rm -f {} \;
  1. Descomponlo consultando man find, explicando cada parte.
  2. Averigua qué significa exactamente +30 en -mtime (búscalo en el manual, no lo supongas).
  3. Identifica al menos dos riesgos de ejecutarlo tal cual en Veloz Envíos.
  4. Propón una versión verificable y más segura.

Soluciones

Solución al Ejercicio 1

Procedimiento: man ls, luego /inode, /sort, etc. Alternativa rápida: ls --help | grep -i inode.

  1. -i, --inode: imprime el número de índice de cada fichero.
  2. -t combinado con -r: -t ordena por fecha con el más nuevo primero, y -r invierte el orden. Por tanto ls -ltr. Es una de las combinaciones más usadas en administración de sistemas: deja lo más reciente abajo del todo, justo encima del prompt, que es donde miras.
  3. -A NUM, --after-context=NUM: muestra NUM líneas posteriores. Con -B se obtienen las anteriores y con -C ambas.
  4. -l, --files-with-matches: solo el nombre de los ficheros con coincidencia.
  5. -v, --invert-match: selecciona las líneas que no coinciden.

Aplicación a Veloz Envíos:

ls -ltr /var/log/veloz
total 47M
-rw-r--r-- 1 veloz    veloz 2,1M ago  2 23:59 app.log.1
-rw-r--r-- 1 www-data adm   9,4M ago  2 23:59 acceso.log.1
-rw-r--r-- 1 veloz    veloz 1,3M ago  3 09:02 veloz-api.log
-rw-r--r-- 1 www-data adm    28M ago  3 10:14 acceso.log
-rw-r--r-- 1 veloz    veloz 6,0M ago  3 10:15 app.log
grep -A 3 'ERROR' /var/log/veloz/app.log | head -20
2026-08-03 10:12:04 [ERROR] Timeout al conectar con pasarela de pago (envio E-4471)
2026-08-03 10:12:05 [INFO] Reintento 1 de 3 para envio E-4471
2026-08-03 10:12:09 [INFO] Reintento 2 de 3 para envio E-4471
2026-08-03 10:12:14 [WARN] Reintento agotado, marcando E-4471 como incidencia
--
2026-08-03 10:14:31 [ERROR] No se pudo escribir en /srv/veloz/datos/envios.csv

El contexto posterior es justo lo que necesitas para entender un error: la línea del ERROR dice qué falló, y las siguientes dicen cómo reaccionó la aplicación. Las separaciones -- marcan bloques no contiguos.

Solución al Ejercicio 2

type -a test
test es una orden interna del shell
test es /usr/bin/test
  1. Es ambas cosas: existe como builtin de Bash y como programa de coreutils. Bash usa el builtin (los builtins tienen prioridad sobre el PATH, como vimos en 01-04), así que la documentación relevante es help test.

  2. Consultando help test:

Operador Verdadero si...
-f FICHERO Existe y es un fichero regular
-d FICHERO Existe y es un directorio
-r FICHERO Existe y tienes permiso de lectura
-s FICHERO Existe y su tamaño es mayor que cero
-z CADENA La cadena tiene longitud cero
  1. FICHERO1 -nt FICHERO2 (newer than): verdadero si FICHERO1 es más reciente, según la fecha de modificación, que FICHERO2. También existe -ot (older than) y -ef (mismo dispositivo e inodo). Este operador nos será muy útil en el Módulo 7 para saber si un backup está al día.

  2. -s FICHERO aplicado a nuestro log de aplicación:

test -s /var/log/veloz/app.log && echo "existe"
existe

-s es más apropiado que -f aquí, porque comprueba a la vez que existe y que no está vacío. El operador && ejecuta la segunda parte solo si la primera devolvió código 0; es una aplicación directa de los códigos de salida de la lección 01-04 y se formaliza en 03-03. Escrito con la sintaxis moderna sería:

[[ -s /var/log/veloz/app.log ]] && echo "existe"

Solución al Ejercicio 3

  1. Descomposición (consultando man find):
Parte Significado
/srv/veloz Directorio donde empieza la búsqueda, recursiva por defecto
-type f Solo ficheros regulares (no directorios ni enlaces)
-name "*.csv" Cuyo nombre termine en .csv
-mtime +30 Modificados hace más de 30 días
-exec rm -f {} \; Ejecuta rm -f sobre cada resultado; {} se sustituye por el nombre y \; cierra el -exec
  1. Qué significa +30. Buscando /mtime en man find se encuentra:
       -mtime n
              El fichero fue modificado por última vez hace n*24 horas.
              Cuando find calcula cuántos períodos de 24 horas hace,
              cualquier parte fraccionaria se ignora...

Y en la sección previa sobre argumentos numéricos:

       +n     para mayor que n,
       -n     para menor que n,
       n      para exactamente n.

Por tanto +30 significa modificado hace más de 30 períodos completos de 24 horas. El matiz importante es que la parte fraccionaria se descarta: un fichero de 30 días y 20 horas cuenta como 30, no como 31, y no sería seleccionado. Este comportamiento sorprende a mucha gente y solo está escrito en el manual.

  1. Riesgos:

    • Alcance excesivo: actúa sobre todo /srv/veloz recursivamente, incluido el subdirectorio historico, que precisamente contiene ficheros antiguos que se guardan a propósito. Borraría el archivo histórico de envíos.
    • Irreversibilidad sin verificación: rm -f no pregunta ni deja rastro, y en Linux no hay papelera. Si el criterio es incorrecto, los datos se pierden.
    • Riesgo adicional: -exec ... \; lanza un proceso rm por fichero, lo que con miles de ficheros es muy lento y puede saturar el servidor. La forma eficiente es -exec rm -f {} + o -delete.
    • Riesgo con nombres raros: si algún fichero tuviera un nombre con caracteres especiales, ciertas variantes de este patrón fallan. Con -delete se evita.
  2. Versión segura y verificable:

# Paso 1: ver exactamente qué se seleccionaría, acotando el alcance
find /srv/veloz/datos -maxdepth 1 -type f -name "envios-*.csv" -mtime +30

# Paso 2: revisar la lista con detalle (tamaño y fecha)
find /srv/veloz/datos -maxdepth 1 -type f -name "envios-*.csv" -mtime +30 -ls

# Paso 3: si y solo si la lista es correcta, borrar
find /srv/veloz/datos -maxdepth 1 -type f -name "envios-*.csv" -mtime +30 -delete

Mejoras aplicadas:

  • -maxdepth 1 impide que descienda a historico.
  • El patrón envios-*.csv es más específico y no toca el envios.csv activo.
  • Se ejecuta primero sin acción destructiva para revisar la lista.
  • -delete sustituye a -exec rm, es más rápido y seguro.

La versión definitiva para veloz-ops incluiría además mover a un directorio de cuarentena en lugar de borrar, pero eso llegará en la lección 07-03.

Conclusión

Con esta lección cierras el Módulo 1 y, con él, los cimientos del curso. Ya sabes qué es Bash y qué papel juega en tu trabajo; tienes un entorno moderno montado con ~/veloz-ops en el PATH; te mueves por el sistema de ficheros de srv-veloz-01 con criterio; entiendes qué ocurre por dentro cuando pulsas Enter; y ahora, además, eres autosuficiente para resolver dudas: sabes cuándo usar man y cuándo help, cómo elegir la sección correcta, cómo buscar dentro de una página con /, cómo descifrar un SYNOPSIS, cómo encontrar un comando que no conoces con man -k, y —lo más importante en un servidor de producción— cómo verificar un comando peligroso antes de ejecutarlo.

Este último punto es el que más veces te salvará. Toda la potencia que vas a adquirir en los próximos módulos es también potencia para destruir, y la diferencia está en el hábito de comprobar antes de actuar.

En el Módulo 2 empieza el trabajo de verdad con las herramientas: aprenderás a crear, copiar, mover y eliminar ficheros; a procesar texto con cat, head, tail, grep, sort y wc; a entender y modificar permisos; a encadenar comandos con redirecciones y tuberías; a usar comodines; y a moverte por la línea de comandos a la velocidad de un profesional. A partir de ahí, todo lo que aprendas irá directo a construir veloz-ops.

Curso de Programación en Bash

Módulo 1: Introducción a Bash

Módulo 2: Comandos Básicos de Bash

Módulo 3: Fundamentos de Scripting

Módulo 4: Scripting Intermedio

Módulo 5: Técnicas Avanzadas de Scripting

Módulo 6: Trabajando con Herramientas Externas

Módulo 7: Automatización y Programación

Módulo 8: Mejores Prácticas y Optimización

Módulo 9: Proyectos del Mundo Real

© Copyright 2026. Todos los derechos reservados