Shell
13 minutos de lectura
- Introducción- Historia de los shells en Unix- Bourne Shell (sh), csh y ksh
- Bash: origen, GNU y licenciamiento
- POSIX Shell: estandarización y portabilidad
- Evolución de Bash 1.x → 2.x → 3.x → 4.x → 5.x
- Línea temporal de características (arrays, asociativos, coproc, globstar)
- Comunidad, mantenimiento y políticas de releases
 
- Shells y compatibilidad- sh vs bash vs dash vs ksh vs zsh
- Conformidad POSIX y “bashismos”
- Detección de shell activo y versión ($SHELL,bash --version)
- Portabilidad entre distribuciones y BSD/macOS
- BusyBox/Almquist (ash) y entornos mínimos
- Limitaciones en sistemas embebidos
 
- Instalación y actualización de Bash- Distribuciones Linux (apt, dnf, pacman, zypper)
- macOS (Homebrew, MacPorts)
- Windows (WSL, MSYS2, Git Bash, Cygwin)
- Compilación desde fuente y opciones comunes
- Selección de shell por defecto (chsh,/etc/shells)
- Verificación de instalación y PATH
 
- Ejecutar el shell y scripts- Sesión interactiva vs no interactiva
- Shebangs (#!/bin/sh,#!/usr/bin/env bash)
- Ejecución directa, bash script.sh, permisos ychmod +x
- source/- .vs ejecución en subshell
- Flags y modos (-c,-i,-l,-O,-o,-v,-x)
- Entrada/salida estándar, tuberías y redirecciones básicas
 
- Terminales y línea de comandos- TTY vs PTY
- Emuladores de terminal (GNOME Terminal, iTerm2, Windows Terminal, kitty, Alacritty)
- Multiplexores (tmux, screen)
- Readline, historial y edición de línea
- Autocompletado y bash-completion
- Copiado/pegado, mouse reporting y scrollback
 
- Editores y herramientas de desarrollo- Vim, Neovim, Emacs, Nano, VS Code
- LSP/“language server” para shell (bash-language-server)
- Formateadores y linters (shfmt, ShellCheck)
- Integración con depuradores y perfiles de ejecución
- Fragmentos, plantillas y snippets de scripts
- Proyectos de ejemplos y repos de referencia
 
 
- Historia de los shells en Unix
- Fundamentos- Conceptos básicos del shell- Comandos, argumentos y opciones
- Estado de salida y semántica de éxito/fracaso
- Rutas absolutas vs relativas
- PATH, búsqueda de comandos y hashing de rutas
- Builtins vs ejecutables externos
- Separadores, espacios y saltos de línea
 
- Variables y entorno- Definición, asignación y alcance
- Exportación al entorno (export)
- Variables de entorno comunes (PATH, HOME, USER, SHELL)
- Variables locales vs globales
- env,- printenvy archivos de entorno
- Convenciones de nombres y mayúsculas
 
- Tipos de datos prácticos- Cadenas y evaluación de palabras
- Números en aritmética de shell
- Arrays indexados (bash)
- Arrays asociativos (bash)
- Valores nulos y no definidos
- Lectura segura de datos con IFS
 
- Citas y expansión- Comillas simples vs dobles
- Escape con barra invertida
- Expansión de variables
- Sustitución de comandos
- Expansión aritmética
- Orden de expansiones y efectos colaterales
 
- Globbing y patrones- Patrón *,?,[]
- extgloby patrones extendidos
- globstary coincidencia recursiva
- nullglob,- failglob,- nocaseglob
- Diferencias con expresiones regulares
- Interacciones con IFS y splitting
 
- Patrón 
- Operadores- Aritméticos en (( ))
- Comparación en [ ]y[[ ]]
- Operadores de archivo (-e,-f,-d,-r,-w,-x)
- Operadores de cadena (=,!=,<,>,=~)
- Asignación compuesta y let
- Precedencia práctica en shell
 
- Aritméticos en 
- Control de flujo- if,- elif,- else
- casecon patrones
- forclásico y- for … in
- whiley- until
- break,- continue,- exit,- return
- Sentencias condicionales cortas con &&y||
 
- Funciones- Definición y llamada
- Parámetros posicionales y $#,$*,$@,$?,$$,$!
- localy sombras de variables
- Valores de retorno y echo/stdout
- Bibliotecas de funciones y source
- Namespacing por convención
 
- Estado de salida y manejo de errores- Códigos de retorno y set -e
- pipefaily errores en tuberías
- set -uy variables no definidas
- trapy captura de señales
- Limpieza y funciones cleanup
- Diseño de scripts “fail-fast”
 
- Códigos de retorno y 
- Opciones del shell
- setpara opciones POSIX
- shoptpara opciones específicas de bash
- Modo POSIX vs modo bash
- Opciones de globbing y expansión
- Ajustes de historia y readline
- Persistencia en dotfiles
 
- Conceptos básicos del shell
- Estructuras y manipulación de datos- Cadenas en shell- Longitud, subcadenas y sustituciones
- Borrado de prefijos/sufijos con patrones
- Sustitución global de patrones
- Conversión de mayúsculas/minúsculas
- Manejo de caracteres especiales y binarios
- Normalización de fin de línea y codificaciones
 
- Arrays indexados- Declaración, inicialización y expansión
- Acceso por índice y rebanado
- Iteración sobre índices y valores
- Operaciones de inserción y borrado
- Longitud y expansión segura con [@]
- Errores comunes con IFS y splitting
 
- Arrays asociativos- Declaración y asignación de claves
- Iteración por clave y valor
- Existencia de claves y pruebas
- Copias y referencias
- Serialización simple de mapas
- Limitaciones de portabilidad
 
- Lectura y parsing- readseguro con- -ry- IFS
- mapfile/- readarray
- Lectura de campos, CSV y delimitadores
- getoptspara opciones cortas
- getopt/GNU para opciones largas
- Validación de entrada y mensajes de ayuda
 
- Expresiones regulares y patrones- [[ string =~ regex ]]en bash
- grep básico, ERE y PCRE según herramienta
- sed para sustituciones en flujo
- awk para campos y registros
- Limitaciones de regex en [[ ]]
- Casos de uso mezcla regex/patrones
 
- Archivos y directorios- Comprobaciones de archivo y directorio
- Metadatos y permisos
- Timestamps y touch
- Listados y filtros
- Búsqueda con find
- Trabajo seguro con nombres con espacios y saltos de línea
 
- Redirecciones y descriptores- >,- >>,- <,- 2>,- &>,- <>
- execpara reasignar FDs
- teey duplicación de salida
- noclobbery- set -C
- Here-docs (<<,<<-) y here-strings (<<<)
- Pseudodispositivos y /dev/null
 
- Tuberías y procesos- Piping entre múltiples comandos
- Efectos de subshell en (...)
- Agrupación { ...; }
- xargsy- -0con- -print0
- parallelpara concurrencia
- Consideraciones de rendimiento
 
- Sustituciones y procesos especiales- Sustitución de comandos $( )
- Sustitución de procesos <( )y>( )
- Co-procesos coproc
- Nombres de tuberías mkfifo
- /dev/tcpy- /dev/udpen bash
- Captura de stderr por separado
 
- Sustitución de comandos 
 
- Cadenas en shell
- Programación estructurada y modular- Organización de scripts- Estructura de carpetas y convenciones
- Cabeceras, licencia y metadatos
- Funciones reutilizables y bibliotecas
- “Main” y flujo de ejecución
- Gestión de errores y logging
- Salidas y códigos de retorno
 
- Interfaz de línea de comandos- Diseño de --helpy--version
- Subcomandos por convención
- Validación de parámetros y contratos
- Mensajes de uso y ejemplos
- Colores y TTY detección
- Compatibilidad con sudo
 
- Diseño de 
- Configuración y entorno- Archivos .envydotenvCLI
- Variables de entorno y precedencia
- Archivos INI/TOML/YAML con grep/sed/awk/jq/yq
- Plantillas con here-doc y placeholders
- Rutas relativas y absolutas robustas
- Detección de sistema y distros
 
- Archivos 
- Sourcing y módulos- sourcede librerías internas
- Control de colisiones de nombres
- Variables readonlyy constantes
- Carga condicional y “guardas”
- Versión mínima de bash y chequeos
- Dependencias de herramientas externas
 
- Estilo y calidad- Guías de estilo (Google Shell Style Guide)
- ShellCheck: categorías y reglas comunes
- shfmt: indentación y formato
- Nombres de funciones y variables
- Comentarios y secciones
- Revisiones y code review
 
- Documentación- Cabeceras con descripción y uso
- --helpautogenerado por funciones
- Manuales manmínimos conronn/pandoc
- README de CLI
- Ejemplos reproducibles
- Notas de compatibilidad
 
- Pruebas- bats-core: estructura y aserciones
- shUnit2: suites y fixtures
- cram/tap: pruebas de línea de comandos
- Mocks de comandos con PATH y wrappers
- Tests de integración con contenedores
- Cobertura y medición de rutas de error
 
- Depuración- set -xy PS4
- bash -xy trazas
- set -vy eco de entradas
- trap ERRy diagnósticos
- printf/- echodirigidos a stderr
- Reproducibilidad de fallos
 
- Rendimiento y benchmarking- timey- /usr/bin/time
- hyperfinepara CLIs
- Minimización de subshells
- Sustituciones eficientes vs pipelines
- Uso de awk/sed/perlcuando corresponda
- Perfilado con strace/dtruss(lectura de alto nivel)
 
 
- Organización de scripts
- Texto, datos y utilidades de Unix- Búsqueda y filtrado- grep,- egrep,- ripgrep
- head,- tail,- sedfiltros básicos
- awkpara columnas y agregaciones
- cut,- paste,- tr
- sort,- uniq,- comm,- join
- nl,- wc,- fold,- fmt
 
- Estructuras y formatos- CSV robusto con delimitadores
- TSV y cut --output-delimiter
- JSON con jq
- YAML con yq
- INI con awk/greppatrones
- Binarios y xxd/hexdump
 
- Archivos y compresión- tary variantes de compresión
- gzip,- bzip2,- xz,- zstd
- zip/- unzip
- Extracción selectiva y streaming
- Integridad y checksums (md5sum,sha256sum)
- Archivos temporales con mktemp
 
- Sistema de archivos- stat,- lsy formatos
- chmod,- chown,- umask
- df,- duy cuotas
- Enlaces duros y simbólicos
- Montajes y puntos de montaje
- lsofy archivos abiertos
 
- Búsqueda y ejecución- findcon pruebas de tiempo y tamaño
- -execy- -print0
- xargsparalelo y seguro
- Limitación de profundidad
- Selección por permiso/usuario/grupo
- Eliminación segura y confirmación
 
- Flujo y transformación- teepara bifurcar
- Filtros composables
- Tratamiento de errores en pipelines
- awkcomo “mini lenguaje”
- sedmulti-línea y hold space
- Mantenimiento de orden estable
 
 
- Búsqueda y filtrado
- Concurrencia, procesos y sistema- Procesos y jobs- Ejecución en background &
- jobs,- fg,- bg
- waity recolección
- disowny longevidad
- nohupy sesiones
- Subshells vs shell actual
 
- Ejecución en background 
- Señales y trap- SIGINT, SIGTERM, SIGHUP
- Limpieza de recursos
- Trampas para EXITyERR
- Reintentos exponenciales
- Ventanas de carrera y bloqueos
- flocky exclusión mutua
 
- Paralelismo práctico- xargs -Py límites
- GNU parallel
- Coprocesos coproc
- Paralelismo por archivos y sharding
- Estrategias de backoff
- Observabilidad básica
 
- xargs 
- Tiempo y temporización- datey formatos portables
- sleep,- usleep(según SO)
- timeouty cancelación
- Medición con timeySECONDS
- Zonas horarias y TZ
- Rounding y diferencias de tiempo
 
- Programación y scheduling- cron y crontab
- anacron
- systemd timers
- at/batch
- systemd-run para tareas únicas
- Logs y rotación con logrotate
 
- Recursos del sistema- ulimity límites de FDs
- nicey- renice
- Afinidad y taskset(Linux)
- Memoria y free/vm_stat
- CPU y mpstat/top/htop
- I/O y iostat/dstat
 
 
- Procesos y jobs
- Redes y comunicación- Transferencias- curly- wget
- scp,- sftp,- rsync
- Autenticación con claves
- Verificación de certificados
- Reanudación y --continue-at
- Throttling de ancho de banda
 
- Conectividad- ping,- ping6
- traceroute/- mtr
- dig/- host
- nc/netcat y puertos
- /dev/tcppara testing
- Proxies y variables de entorno
 
- SSH y automatización- sshy opciones de control
- ~/.ssh/configy multiplexación
- Agentes ssh-agent/gpg-agent
- Ejecución remota paralela
- Transferencias atómicas con rsync
- Túneles y port forwarding
 
- APIs y formatos- curlcon JSON
- jqpara parseo y filtros
- Autenticación por tokens
- Retries y backoff
- Logging de peticiones y respuestas
- Sanitización de secretos en logs
 
 
- Transferencias
- Entorno, dotfiles y personalización- Inicio de sesión y perfiles- Shell de login vs no login
- .bashrc,- .bash_profile,- .profile
- Orden de carga y herencia
- Distinciones macOS/Linux
- Scripts globales en /etc
- Depuración de inicio con set -x
 
- Prompt y estética- PS1, PS2, PS4
- Colores ANSI y escapes
- Información de git y estado
- Prompts por contexto (root, prod)
- Separadores unicode y símbolos
- Detección de TTY para colores
 
- Historial y productividad- HISTFILE, HISTSIZE, HISTCONTROL
- historyy expansión- !
- Búsqueda incremental con Readline
- Atajos de edición (emacs/vi mode)
- fcy edición del último comando
- Deduplicación de comandos
 
- Autocompletado- bash-completionpaquetes
- Completados personalizados
- Context-aware completion
- Cache y rendimiento
- Compatibilidad entre distros
- Mantenimiento de scripts de completion
 
- Gestión del entorno- Variables por proyecto
- direnvy hooks
- Versionado de herramientas (asdf,mise)
- Nix y shells reproducibles
- Plantillas de perfiles
- Seguridad de archivos de inicio
 
 
- Inicio de sesión y perfiles
- Seguridad en shell- Principios básicos- Citar siempre las variables
- Evitar word splitting accidental
- Manejo de IFS seguro
- set -Eeuo pipefailen scripts críticos
- umasky permisos por defecto
- noclobbery sobrescrituras
 
- Inyección y sanitización- Construcción segura de comandos
- Evitar eval
- Validación de rutas y nombres
- Filtrado de entrada y listas blancas
- Limitación de globbing inesperado
- Escapes al invocar herramientas
 
- Archivos temporales- mktempy directorios dedicados
- Limpieza con trap
- Colisiones y condiciones de carrera
- Nombres predecibles a evitar
- tmpfs y consideraciones de rendimiento
- Permisos y herencia en TMPDIR
 
- Secretos y credenciales- Variables de entorno sensibles
- Archivos .netrcy permisos
- Pass/Keychain/GPG
- Redacción de logs
- Integración con gestores de secretos
- Expiración y rotación
 
- Casos conocidos- Shellshock y funciones en entorno
- PATHenvenenado
- Scripts sudoinseguros
- sshsin restricción de comandos
- tary paths relativos
- find -execy comodines
 
 
- Principios básicos
- Portabilidad y diferencias de plataformas- GNU vs BSD- sed -iy compatibilidad
- datey formatos
- xargsflags por defecto
- taropciones divergentes
- readlinky- realpath
- statcampos y sintaxis
 
- Linux vs macOS vs *BSD- Utilidades de red
- Directorios del sistema
- Enlaces simbólicos y Finder
- Lanzadores y launchd
- Homebrew y rutas en ARM
- Frameworks y restricciones SIP
 
- Entornos mínimos- BusyBox/ash
- Alpine y musl
- Imágenes scratch/distroless
- Docker entrypoints en sh
- Shells en initramfs
- Limitaciones de locales
 
- Windows y POSIX- WSL y interoperabilidad
- MSYS2/Cygwin
- CRLF vs LF
- Rutas y letras de unidad
- Procesos y señales
- Permissions y ACLs
 
 
- GNU vs BSD
- Integración con ecosistema y empaquetado- Gestores de paquetes del sistema- apt, dnf/yum, pacman, zypper
- brew, port
- nix/guix
- snap/flatpak para CLIs
- Repos privados y mirrors
- Cachés y proxies
 
- Distribución de scripts- Instalación en /usr/local/bin
- Paquetización DEB/RPM básica
- Publicación via tarballs
- Checksums y firmas
- Versionado semántico por convención
- Changelogs y notas de versión
 
- Instalación en 
- Contenedores- Dockerfiles con sh/bash
- Entrypoint vs CMD
- Señales y PID 1
- Imágenes multi-stage
- Salud y readiness checks
- Logs y STDOUT/STDERR
 
- Dockerfiles con 
- CI/CD- Ejecutores y runners
- Caching de dependencias
- Matrices y paralelismo
- Artefactos y reportes
- Lint/test en pipelines
- Firmas y supply chain
 
- Interoperabilidad- Makefiles y targets
- Invocación desde otros lenguajes
- Subprocesos y códigos de retorno
- IPC simple con FIFOs
- JSON/YAML como interfaz
- CLI contract-first
 
 
- Gestores de paquetes del sistema
- Redes, servicios y sistemas- Gestión de servicios- systemd y systemctl
- SysV init scripts
- Launchd en macOS
- Supervisores (supervisord, s6)
- Logs de sistema y journalctl
- Rotación y retención
 
- systemd y 
- Almacenamiento y backups- rsyncavanzado
- Snapshots y LVM/ZFS (conceptos)
- Verificación de integridad
- Backups diferenciales/incrementales
- Restores y pruebas periódicas
- Cifrado en repositorios
 
- Observabilidad- top,- htop,- atop
- vmstat,- iostat,- dstat
- lsofy fugas de descriptores
- ss/- netstat
- Logging estructurado con jq
- Exportadores y métricas simples
 
- Seguridad operativa- sudopolíticas y NOPASSWD
- pamy restricciones
- faillock/- fail2banbásicos
- Chequeos de permisos en scripts
- Listas de control y setcap
- Auditoría de comandos críticos
 
 
- Gestión de servicios
- Casos de uso y patrones- Procesamiento masivo de archivos- Canonización de nombres
- Renombrado seguro
- Extracción y partición
- Validaciones de estructura
- Resúmenes y reportes
- Reintentos de operaciones fallidas
 
- Pipelines de datos- Extracción → Transformación → Carga
- Logs y métricas por etapa
- Paralelismo por particiones
- Reprocesamiento idempotente
- Control de versiones de pipeline
- Almacenamiento temporal y limpieza
 
- CLI de utilería- Plantillas --help
- Comandos anidados
- Config por archivo y env
- Verbosidad y --quiet
- Códigos de retorno estandarizados
- Tests de humo automáticos
 
- Plantillas 
- Automatización de despliegues- Construcción y empaquetado
- Publicación artefactos
- Migraciones y rollbacks
- Checks de salud post-deploy
- Canary y gradual rollouts
- Auditoría y trazabilidad
 
- Mantenimiento y tareas programadas- Limpieza de caches
- Rotación de logs
- Verificación de espacio
- Renovación de certificados
- Respaldo y rotación
- Alertas y notificaciones
 
 
- Procesamiento masivo de archivos
- Lectura, escritura y formatos específicos- CSV/TSV robusto- Delimitadores y comillas
- Filtrado por columnas
- Uniones y mezclas
- Limpieza de encabezados
- Detección de codificaciones
- Conversión a JSON/YAML
 
- JSON- Extracción y transformación con jq
- Validación y esquema básico
- Merge y patch
- Orden y pretty-print
- Streams y SLURP
- Filtrado por claves
 
- Extracción y transformación con 
- YAML- yqpara consultas
- Conversión YAML↔JSON
- Anclas y alias (operativo)
- Plantillas con here-doc
- Splits por documentos
- Validación básica
 
- Texto y codificaciones- UTF-8 por defecto
- Eliminación de BOM
- Normalización de saltos de línea
- Reemplazos seguros de binarios
- Detección con file
- Reglas de localización
 
 
- CSV/TSV robusto
- Internos del shell- Ciclo de vida de un comando- Tokenización y parsing
- Expansiones en orden
- Globbing y splitting
- Redirecciones y FDs
- Fork/exec y espera
- Recolección del estado
 
- Builtins esenciales- cd,- echo,- printf
- test/- [,- [[
- read,- mapfile
- set,- shopt
- exec,- eval(con cautela)
- trap,- ulimit
 
- Readline y edición- .inputrcy bindings
- Modos emacs/vi
- Macros simples
- Compleciones dinámicas
- Historial y expansión !
- Control de mayúsculas/minúsculas
 
- Opciones y comportamiento- POSIX mode
- Emulación de sh
- Opciones heredadas
- Variables especiales de bash
- Límite de recursión de funciones
- Máximos de longitud de línea/argv
 
 
- Ciclo de vida de un comando
- Internacionalización y locales- Locales del sistema- LC_ALL, LANG, LC_* variables
- Efectos en sort/grep/awk
- Estabilidad con LC_ALL=C
- Fechas, números y collations
- Conversión de charset
- Scripts reproducibles y locales fijas
 
- Mensajes y traducción (nivel operativo)- Mensajes de ayuda neutrales
- Señales y textos estándar
- Salidas parsables vs human-friendly
- Documentación bilingüe por convención
- Evitar dependencias regionales
- Pruebas con locales variados
 
 
- Locales del sistema
- Buenas prácticas y antipatrones- Citar siempre expansiones
- Evitar for x in $(cmd)para líneas
- Preferir read -rcon IFS controlado
- Manejo de errores explícito
- No abusar de subshells innecesarios
- Reemplazar catinútil (UUOC)
- grep -qpara pruebas silenciosas
- set -Eeuo pipefailcuando aplique
- Validar entradas externas
- Registrar acciones críticas
 
- Migración y compatibilidad- De bash a POSIX sh
- Detección y eliminación de bashismos
- Sustituciones de [[→[cuando sea posible
- mapfile/arrays en entornos sin bash
- extgloby alternativas
- Pruebas cruzadas en shells comunes
 
- Catálogo de recetas frecuentes- Parseo robusto de flags con getopts
- Leer fichero línea a línea seguro
- Procesar grandes árboles con find -print0
- Pipelines con manejo de errores
- Retries con backoff exponencial
- Locking con flock
- Logging con niveles y timestamps
- Rotación de logs por tamaño
- Descargas con checksum y verificación
- Recolección y limpieza a la salida
 
- Parseo robusto de flags con 
- Referencias y ecosistema- Manuales (man bash, POSIX)
- Guías de estilo reconocidas
- Proyectos ejemplo y plantillas
- Herramientas de verificación (ShellCheck, shfmt)
- Conjuntos de pruebas (bats, shUnit2)
- Comunidades y recursos de aprendizaje
 
- Manuales (