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
- El ecosistema de documentación en Linux
man: el manual del sistema- Las secciones del manual
- Navegar y buscar dentro de una página de manual
- Leer un SYNOPSIS: la notación formal
- Buscar cuando no sabes el nombre del comando:
man -kyapropos help: los builtins de Bash y por quéman cdfalla--help: la ayuda rápidainfo,tldrycheat- Documentación oficial: manual de Bash y POSIX
- Estrategia práctica para resolver dudas
- Verificar comandos peligrosos antes de ejecutarlos
- 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 ejemplo →
tldr.
man: el manual del sistema
man: el manual del sistemaman (de manual) es la referencia canónica. Cada programa instalado trae su página, escrita por su autor.
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 primeroFíjate en dos cosas que aparecen constantemente:
- Las opciones con forma corta y larga se listan juntas:
-a, --all. - Hay dependencias entre opciones:
-hdice explícitamente "con-ly/o-s". Es decir,ls -hsolo 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).
- 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:
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]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:
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:
- 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.
Dentro, teclea /sort y pulsa Enter. Pulsa n hasta llegar a:
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:
-R respeta los colores y -i hace las búsquedas insensibles a mayúsculas salvo que escribas alguna.
- 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.
Se lee: ls acepta cero o más opciones y cero o más archivos. Ambos son opcionales, por eso ls a secas funciona.
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.
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.
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.
- Buscar cuando no sabes el nombre del comando:
man -k y apropos
man -k y aproposEl 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.
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:
Puedes acotar la búsqueda a una sección:
Y combinarla con grep para filtrar más:
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:
help: los builtins de Bash y por qué man cd falla
help: los builtins de Bash y por qué man cd fallaRecuperemos algo de la lección 01-04. Prueba esto:
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:
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):
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:
Y admite patrones:
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:
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:
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.
--help: la ayuda rápida
--help: la ayuda rápidaCasi todos los programas aceptan --help y muestran un resumen en pantalla.
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--helpno funciona, prueba-hy luegoman. - Cuidado con los comandos que interpretan
--helpcomo argumento. Un caso famoso: enfind,--helpsí funciona, pero en programas antiguos un argumento desconocido puede provocar comportamientos raros. - Si la salida es larga, canalízala a un paginador:
Un truco muy práctico cuando buscas una opción concreta: filtra la ayuda con grep.
-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 bloquesEn 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.
info, tldr y cheat
info, tldr y cheat9.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".
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.
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:
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.
- 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:
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.
- 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:
- ¿Sé el nombre? Si no,
man -kcon una palabra clave en inglés (las descripciones están en inglés en la mayoría de sistemas). type -a comandopara saber si es builtin, externo o keyword. Esto decide la fuente.- Ayuda rápida primero:
comando --help | grep loQueBusco. Resuelve la mayoría de las consultas en segundos. - Si necesitas detalle,
man comandoy busca dentro con/. No leas de arriba abajo. - Si sigue sin quedar claro,
tldr comandopara ver ejemplos reales, oinfopara las herramientas GNU. - 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.
- 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.
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:
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 |
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:
12.3 Otras precauciones
- Ejecuta primero la parte que solo lee. Antes de
find /srv -name "*.tmp" -delete, ejecutafind /srv -name "*.tmp"y revisa la lista. - Usa
-i(interactivo) en comandos destructivos.rm -ipregunta por cada fichero. - Comprueba dónde estás y quién eres.
pwdywhoamiantes de cualquier borrado. Unrm -rf *en el directorio equivocado es irreversible. - Desconfía de los comandos copiados de internet, sobre todo los que llevan
sudo,curl | bash,rm -rfo rutas absolutas al sistema. Léelos entero, descomponlos y busca enmancada opción que no reconozcas. - En Linux no hay papelera.
rmno se deshace.
Un ejercicio de lectura crítica. Alguien te pasa esta línea "para limpiar logs viejos":
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/mtimeen el manual descubres que+7significa "más de 7 días completos", un matiz que suele malinterpretarse.)-exec rm -f {} \;: ejecutarm -fsobre 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 -deleteEse 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 cdy concluir que la documentación no existe. Es un builtin:help cd. Comprueba siempre contype -aprimero. - Escribir
man crontaby no encontrar el formato del fichero. Necesitas la sección 5:man 5 crontab. Usaman -f nombrepara 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
tldrpara 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.
echodelante, o--dry-run. Siempre, incluso cuando creas que lo tienes claro. - Consejo: si
man -kno devuelve nada, ejecutasudo mandbpara reconstruir el índice. - Consejo:
man manyman bashmerecen 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:
- Qué opción de
lsmuestra el número de inodo de cada fichero. - Qué opción de
lsordena por fecha de modificación de más antigua a más reciente (necesitas combinar dos). - Qué opción de
grepmuestra las 3 líneas siguientes a cada coincidencia. - Qué opción de
grepmuestra solo el nombre de los ficheros que contienen la coincidencia, sin las líneas. - Qué opción de
grepinvierte 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
- Comprueba con
type -asitestes builtin, externo o ambos. - Con
help test, averigua qué hacen los operadores-f,-d,-r,-sy-z. - Averigua también cómo se comprueba si un fichero es más reciente que otro.
- Escribe un comando de una línea que imprima "existe" si
/var/log/veloz/app.logexiste 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":
- Descomponlo consultando
man find, explicando cada parte. - Averigua qué significa exactamente
+30en-mtime(búscalo en el manual, no lo supongas). - Identifica al menos dos riesgos de ejecutarlo tal cual en Veloz Envíos.
- 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.
-i,--inode: imprime el número de índice de cada fichero.-tcombinado con-r:-tordena por fecha con el más nuevo primero, y-rinvierte el orden. Por tantols -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.-A NUM,--after-context=NUM: muestra NUM líneas posteriores. Con-Bse obtienen las anteriores y con-Cambas.-l,--files-with-matches: solo el nombre de los ficheros con coincidencia.-v,--invert-match: selecciona las líneas que no coinciden.
Aplicación a Veloz Envíos:
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
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
-
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 eshelp test. -
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 |
-
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. -
-s FICHEROaplicado a nuestro log de aplicación:
-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:
Solución al Ejercicio 3
- 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 |
- Qué significa
+30. Buscando/mtimeenman findse 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:
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.
-
Riesgos:
- Alcance excesivo: actúa sobre todo
/srv/velozrecursivamente, incluido el subdirectoriohistorico, 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 -fno pregunta ni deja rastro, y en Linux no hay papelera. Si el criterio es incorrecto, los datos se pierden. - Riesgo adicional:
-exec ... \;lanza un procesormpor 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
-deletese evita.
- Alcance excesivo: actúa sobre todo
-
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 -deleteMejoras aplicadas:
-maxdepth 1impide que descienda ahistorico.- El patrón
envios-*.csves más específico y no toca elenvios.csvactivo. - Se ejecuta primero sin acción destructiva para revisar la lista.
-deletesustituye 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
- ¿Qué es Bash?
- Configurando tu Entorno
- Navegación Básica en la Línea de Comandos
- Entendiendo el Shell
- Encontrar Ayuda: man, help y --help
Módulo 2: Comandos Básicos de Bash
- Operaciones con Archivos y Directorios
- Comandos de Procesamiento de Texto
- Permisos y Propiedad de Archivos
- Redirección y Tuberías
- Comodines y Expansión de Rutas
- Historial y Atajos de Teclado
Módulo 3: Fundamentos de Scripting
- Creando y Ejecutando un Script
- Variables y Constantes
- Operadores Básicos
- Sentencias Condicionales
- Argumentos y Entrada del Usuario
- Comillas, Expansión y Sustitución
Módulo 4: Scripting Intermedio
- Bucles en Bash
- Funciones en Bash
- Arrays y Arrays Asociativos
- Manipulación de Cadenas
- La Sentencia case y los Menús Interactivos
- Aritmética y Cálculos Numéricos
Módulo 5: Técnicas Avanzadas de Scripting
- Operaciones Avanzadas con Archivos
- Gestión de Procesos
- Manejo de Errores y Depuración
- Expresiones Regulares
- Entrada/Salida Avanzada: Descriptores y Here-Documents
- Scripts Modulares y Librerías Reutilizables
Módulo 6: Trabajando con Herramientas Externas
Módulo 7: Automatización y Programación
- Trabajos Cron
- Automatizando Tareas
- Scripts de Respaldo y Restauración
- Monitoreo y Registro
- Servicios y Temporizadores con systemd
- Automatización Remota con SSH
Módulo 8: Mejores Prácticas y Optimización
- Escribiendo Código Legible
- Optimizando Scripts en Bash
- Consideraciones de Seguridad
- Control de Versiones con Git
- Análisis Estático con ShellCheck y shfmt
- Pruebas Automatizadas con Bats
- Portabilidad: POSIX sh frente a Bashismos
