CommunityProgramación y desarrollogithub.com

Jamie-BitFlight/bash-51-features

Características y mejoras de Bash 5.1 con ejemplos prácticos. Útil al trabajar con funcionalidades de Bash 5.1, variables de tiempo epoch, mejoras en redirección, o cuando el usuario pregunte sobre cambios, nuevas funciones o capacidades específicas de la versión.

¿Qué es bash-51-features?

Este skill proporciona una guía completa sobre las características y mejoras introducidas en Bash 5.1, lanzado en diciembre de 2020. Está diseñado para desarrolladores y usuarios avanzados que trabajan con shell scripting moderno. Entre sus novedades destacan las variables especiales `EPOCHSECONDS` y `EPOCHREALTIME` para obtener timestamps Unix de alta precisión sin necesidad de comandos externos como `date`, y la variable `SRANDOM` para números aleatorios criptográficamente seguros. También incluye una mejora significativa en la sintaxis de redirección mediante `{varname}`, que permite asignar descriptores de archivo a variables con nombre, facilitando la gestión de múltiples manejadores de archivos. Además, se abordan mejoras en arreglos asociativos, soporte para arreglos multidimensionales, integración con Readline 8.1 para una mejor interacción en línea de comandos, y mejoras en el manejo de señales en subprocesos. El skill es útil para cualquier tarea que requiera aprovechar las capacidades específicas de Bash 5.1, garantizando código más eficiente, legible y seguro.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Jamie-BitFlight/claude_skills/tree/main/plugins/bash-development/skills/bash-51-features

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Características y Mejoras de Bash 5.1

Lanzado en diciembre de 2020, Bash 5.1 introdujo varias características y mejoras notables para la programación moderna de scripts de shell.

Nuevas Variables de Shell

EPOCHSECONDS y EPOCHREALTIME

Dos nuevas variables especiales para acceder a la hora actual:

# Obtener timestamp Unix actual en segundos
echo "Timestamp actual: ${EPOCHSECONDS}"

# Obtener timestamp Unix actual con precisión de microsegundos
echo "Timestamp de alta precisión: ${EPOCHREALTIME}"

# Ejemplo práctico: Benchmarking simple
inicio="${EPOCHREALTIME}"
# ... alguna operación ...
sleep 0.5
fin="${EPOCHREALTIME}"
duracion=$(awk "BEGIN {print ${fin} - ${inicio}}")
echo "La operación tomó ${duracion} segundos"

# Ejemplo: Registro con timestamps precisos
log_message() {
    printf '[%s.%06d] %s\n' \
        "$(date -d "@${EPOCHSECONDS}" '+%Y-%m-%d %H:%M:%S')" \
        "${EPOCHREALTIME#*.}" \
        "$*"
}

log_message "Iniciando proceso"

Casos de uso:

  • Medición precisa de rendimiento
  • Timestamps de alta resolución para registro
  • Evitar llamadas externas al comando date
  • Temporización con precisión de microsegundos en scripts

Variable SRANDOM

Números aleatorios criptográficamente seguros:

# Generar número aleatorio seguro (si está disponible)
if [[ -n "${SRANDOM}" ]]; then
    aleatorio_seguro="${SRANDOM}"
    echo "Aleatorio seguro: ${aleatorio_seguro}"
else
    echo "SRANDOM no disponible (requiere getrandom/getentropy)"
fi

# Ejemplo práctico: Generar archivo temporal con nombre aleatorio seguro
archivo_temp="/tmp/seguro_${SRANDOM}_${EPOCHSECONDS}.tmp"

Nota: SRANDOM requiere soporte del sistema para las llamadas getrandom() o getentropy().

Sintaxis de Redirección Mejorada

Redirección {varname}

Asignar descriptor de archivo a variable para mejor gestión de manejadores:

# Abrir descriptor de archivo y almacenarlo en variable
exec {fd}< entrada.txt
while IFS= read -r -u "${fd}" linea; do
    echo "Leído: ${linea}"
done
exec {fd}<&-  # Cerrar el descriptor de archivo

# Ejemplo práctico: Múltiples manejadores de archivos
exec {fd_entrada}< datos.txt
exec {fd_salida}> resultados.txt
exec {fd_error}> errores.txt

procesar_datos() {
    while IFS= read -r -u "${fd_entrada}" linea; do
        if validar_linea "${linea}"; then
            echo "Procesado: ${linea}" >&"${fd_salida}"
        else
            echo "Error: ${linea}" >&"${fd_error}"
        fi
    done
}

procesar_datos
exec {fd_entrada}<&-
exec {fd_salida}>&-
exec {fd_error}>&-

Beneficios:

  • Descriptores de archivo con nombre en lugar de números mágicos
  • Asignación automática de FD evita conflictos
  • Código más legible y mantenible
  • Seguimiento más fácil de manejadores de archivos abiertos

Mejoras en Arreglos

Manejo Mejorado de Arreglos Asociativos

Mejor soporte para operaciones complejas con arreglos:

# Declarar arreglo asociativo con typeset
declare -A config=(
    [host]="localhost"
    [port]="8080"
    [debug]="true"
)

# Expansión mejorada de arreglos
for key in "${!config[@]}"; do
    printf '%s=%s\n' "${key}" "${config[${key}]}"
done

# Ejemplo práctico: Analizador de configuración
parsear_config() {
    declare -gA app_config
    local linea key value

    while IFS='=' read -r key value; do
        [[ "${key}" =~ ^[[:space:]]*# ]] && continue  # Saltar comentarios
        [[ -z "${key}" ]] && continue                  # Saltar líneas vacías

        # Recortar espacios en blanco
        key="${key#"${key%%[![:space:]]*}"}"
        key="${key%"${key##*[![:space:]]}"}"
        value="${value#"${value%%[![:space:]]*}"}"
        value="${value%"${value##*[![:space:]]}"}"

        app_config["${key}"]="${value}"
    done < config.ini
}

Soporte para Arreglos Multidimensionales

Manejo mejorado de estructuras de arreglos anidados.

Ejemplos de código

Integración con Readline 8.1

Interacción mejorada de edición de texto y línea de comandos:

Enlaces de Teclas e Historial

# Configurar readline en ~/.inputrc
# Habilitar finalización sin distinción de mayúsculas/minúsculas
set completion-ignore-case on

# Habilitar estadísticas visibles para finalizaciones
set visible-stats on

# Mostrar todas las finalizaciones inmediatamente
set show-all-if-ambiguous on

# Usar colores para el prefijo de finalización
set colored-completion-prefix on

Búsqueda Mejorada en el Historial

# En tu script o .bashrc
# Vincular Ctrl+R para búsqueda incremental inversa (predeterminado, mejorado en 5.1)
bind '"\C-r": reverse-search-history'

# Vincular Ctrl+S para búsqueda incremental hacia adelante
bind '"\C-s": forward-search-history'

# Manejo mejorado del historial
shopt -s histappend           # Añadir al historial
shopt -s cmdhist              # Comandos multilínea como una entrada
HISTCONTROL=ignoreboth        # Ignorar duplicados y espacios iniciales
HISTSIZE=10000
HISTFILESIZE=20000

Mejoras en el Manejo de Señales

Mejor propagación de señales en subprocesos y sustituciones de procesos:

# Manejo mejorado de traps en subprocesos
limpiar() {
    echo "Limpiando..." >&2
    rm -f "${archivo_temp}"
    exit 130  # 128 + SIGINT
}

trap limpiar SIGINT SIGTERM

archivo_temp=$(mktemp)

# La señal se propaga correctamente a través de tuberías
tarea_larga | procesar_salida &
pid=$!

# Esperar trabajo en segundo plano con manejo adecuado de señales
wait "${pid}" 2>/dev/null
codigo_salida=$?

if [[ ${codigo_salida} -gt 128 ]]; then
    senal=$((codigo_salida - 128))
    echo "Proceso terminado por señal ${senal}" >&2
fi

Corrección de Errores y Casos Límite

Manejo de Subprocesos

Comportamiento mejorado al crear subprocesos:

# Herencia de variables de subproceso más confiable
variable_externa="padre"

(
    # El subproceso ahora hereda las variables del padre de forma más confiable
    echo "En subproceso: ${variable_externa}"
    variable_interna="hijo"
)

# variable_externa sigue accesible, variable_interna no
 echo "Después del subproceso: ${variable_externa}"

Casos Límite en Coincidencia de Patrones

Casos límite corregidos en coincidencia de patrones glob:

# Coincidencia glob más confiable con caracteres especiales
shopt -s nullglob  # Expansión vacía para globs sin coincidencias
shopt -s extglob   # Coincidencia de patrones extendida

# Ejemplo: Coincidir archivos pero manejar sin coincidencias elegantemente
archivos=(*.txt)
if [[ ${#archivos[@]} -eq 0 ]]; then
    echo "No se encontraron archivos .txt"
else
    printf 'Encontrados: %s\n' "${archivos[@]}"
fi

Mejoras de Rendimiento

  • Expansión de variables más rápida en bucles
  • Operaciones de arreglos optimizadas
  • Uso reducido de memoria para arreglos grandes
  • Eficiencia mejorada en coincidencia de patrones

Notas de Compatibilidad

Actualización desde Bash 5.0

La mayoría de los scripts son compatibles, pero tenga en cuenta:

  • EPOCHSECONDS y EPOCHREALTIME son nuevos; verifique su existencia si se dirige a versiones anteriores
  • SRANDOM puede no estar disponible en todos los sistemas
  • Se corrigieron algunos casos límite oscuros en el comportamiento de expansión

Verificación de Versión

# Verificar versión de Bash antes de usar características 5.1
if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 1 ]]; then
    # Seguro usar características de Bash 5.1
    timestamp="${EPOCHSECONDS}"
else
    # Reversión para versiones anteriores
    timestamp=$(date +%s)
fi

Referencias

Recursos Adicionales

Para patrones más amplios de desarrollo en Bash y mejores prácticas, consulte:

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

Jamie-BitFlight/agentskill-kaizen-meta-docs

Agentskill kaizen plugin documentation index. Load when needing to read about cross-platform notes, improvement plans, or DuckDB integration.

Jamie-BitFlight/bash-52-features

Bash 5.2 release features and improvements with practical examples. Use when working with Bash 5.2 features, variable handling enhancements, readline improvements, or when user asks about Bash 5.2 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-53-features

Bash 5.3 release features and improvements with practical examples. Use when working with Bash 5.3 features, new command substitution, GLOBSORT, loadable builtins, or when user asks about Bash 5.3 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-development

This skill should be used when the user asks to "write a bash script", "create a shell script", "implement bash function", "parse arguments in bash", "handle errors in bash", or mentions bash development, shell scripting, script templates, or modern bash patterns.

Jamie-BitFlight/bash-lint

This skill should be used when the user asks to "lint bash script", "run shellcheck", "format shell script", "use shfmt", "fix shellcheck errors", or mentions shell script linting, formatting, code quality, or pre-commit hooks for bash.

Jamie-BitFlight/bash-logging

This skill should be used when the user asks to "add logging to bash script", "colorize output", "implement log levels", "CI/CD sections", "terminal colors in bash", or mentions logging functions, emoji output, collapsible CI sections, or shlocksmith.

Jamie-BitFlight/bash-portability

This skill should be used when the user asks about "POSIX compatibility", "portable shell scripts", "cross-shell compatibility", "bashisms", "shebang selection", or mentions writing scripts that work on different shells (bash, sh, dash, zsh) or different systems.

Jamie-BitFlight/bash-testing

This skill should be used when the user asks to "test bash script", "write shell tests", "use shunit2", "use shellspec", "create test suite for bash", or mentions unit testing, test frameworks, mocking, or test-driven development for shell scripts.

Jamie-BitFlight/brainstorming-skill

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or when users request help with ideation, marketing, and strategic planning. Explores user intent, requirements, and design before implementation using research-validated prompt patterns.

Jamie-BitFlight/clang-format

Configure clang-format code formatting. Use when: user mentions clang-format or .clang-format, analyzing code style/patterns, creating/modifying formatting config, troubleshooting formatting, brace styles/indentation/spacing/alignment/pointer alignment, or codifying conventions.

Jamie-BitFlight/commitlint

When setting up commit message validation for a project. When project has commitlint.config.js or .commitlintrc files. When configuring CI/CD to enforce commit format. When extracting commit rules for LLM prompt generation. When debugging commit message rejection errors.

Jamie-BitFlight/conventional-commits

When writing a git commit message. When task completes and changes need committing. When project uses semantic-release, commitizen, git-cliff. When choosing between feat/fix/chore/docs types. When indicating breaking changes. When generating changelogs from commit history.

Jamie-BitFlight/dasel-reference

Use when querying, modifying, or converting JSON, YAML, TOML, XML, CSV, HCL, or INI with dasel v3. Complete reference for selectors, functions, conditionals, variables, spread operator, type casting, and format-specific patterns.

Jamie-BitFlight/data-exploration

Use when exploring unknown structured data files with dasel v3 — discover schema, list keys, find nested values, sample arrays, identify data types across JSON, YAML, TOML, XML, CSV, HCL, INI formats

Jamie-BitFlight/data-transformation

Use when modifying, converting, or transforming structured data with dasel v3 — in-place mutations, format conversion, batch operations, array manipulation, object construction, and merge patterns across JSON, YAML, TOML, XML, CSV, HCL, INI

Jamie-BitFlight/delegate

Decompose substantive work into phases, dispatch each phase to a sub-agent, and adjudicate what comes back. Use whenever a request asks for implementation, investigation, a fix, a review, or any change to files — including small ones — and whenever you are about to read source or run a diagnostic yourself instead of handing it off. Also use when a report from a sub-agent needs judging, when a phase needs re-dispatching, or when a user names one instance of a pattern. Does not apply when your own prompt begins "Your ROLE_TYPE is sub-agent." — then follow references/sub-agent-contract.md instead.

Jamie-BitFlight/enterprise-hibernate-hbm

Dasel v3 query patterns for Hibernate .hbm.xml mapping files — entity-table binding, Java property-to-column extraction, one-to-many set/list/bag relationship tracing, many-to-one foreign key discovery, batch scanning across 60+ HBM files. Use when querying Hibernate ORM class mappings, extracting schema metadata from Java persistence layer, or auditing entity-column relationships in enterprise legacy codebases.

Jamie-BitFlight/enterprise-installanywhere

Dasel v3 query patterns for InstallAnywhere .iap_xml installer definitions — use when querying action sequences, discovering variables, resolving platform conditions, navigating panels, or comparing installer variants. Files are 2.5+ MB, 65,000+ lines — too large for context reads, requires structural dasel queries.

Jamie-BitFlight/enterprise-maven-pom

Dasel v3 selector patterns for Maven POM XML files — use when querying dependency versions, filtering by groupId or scope, extracting module hierarchy from parent POMs, or detecting version conflicts across enterprise multi-module Java projects. Load this skill when working with pom.xml files using dasel.

Jamie-BitFlight/enterprise-spring-xml

Dasel v3 selectors for Spring bean factory XML — use when querying any Spring ApplicationContext XML for bean discovery, dependency wiring, JMS destination mapping, property injection extraction, or cross-bean reference tracing. Load this skill before writing dasel selectors against Spring bean XML files (applicationContext.xml, *_beans.xml, spring-*.xml).

Skills relacionados