Recursos e Melhorias do Bash 5.1
Lançado em dezembro de 2020, o Bash 5.1 introduziu vários recursos e melhorias notáveis para scripts shell modernos.
Novas Variáveis de Shell
EPOCHSECONDS e EPOCHREALTIME
Duas novas variáveis especiais para acessar a hora atual:
# Obtém o timestamp Unix atual em segundos
echo "Timestamp atual: ${EPOCHSECONDS}"
# Obtém o timestamp Unix atual com precisão de microssegundos
echo "Timestamp de alta precisão: ${EPOCHREALTIME}"
# Exemplo prático: Benchmarking simples
inicio="${EPOCHREALTIME}"
# ... alguma operação ...
sleep 0.5
fim="${EPOCHREALTIME}"
duracao=$(awk "BEGIN {print ${fim} - ${inicio}}")
echo "Operação levou ${duracao} segundos"
# Exemplo: Log com timestamps precisos
log_message() {
printf '[%s.%06d] %s\n' \
"$(date -d "@${EPOCHSECONDS}" '+%Y-%m-%d %H:%M:%S')" \
"${EPOCHREALTIME#*.}" \
"$*"
}
log_message "Iniciando processo"
Casos de uso:
- Medição precisa de desempenho
- Timestamps de alta resolução para logs
- Evitar chamadas externas ao comando
date - Temporização com precisão de microssegundos em scripts
Variável SRANDOM
Números aleatórios criptograficamente fortes:
# Gera um número aleatório seguro (se disponível)
if [[ -n "${SRANDOM}" ]]; then
aleatorio_seguro="${SRANDOM}"
echo "Aleatório seguro: ${aleatorio_seguro}"
else
echo "SRANDOM não disponível (requer getrandom/getentropy)"
fi
# Exemplo prático: Gerar arquivo temporário com nome seguro aleatório
arquivo_temp="/tmp/seguro_${SRANDOM}_${EPOCHSECONDS}.tmp"
Nota: SRANDOM requer suporte do sistema para as chamadas de sistema getrandom() ou getentropy().
Sintaxe de Redirecionamento Aprimorada
Redirecionamento {varname}
Atribui descritor de arquivo a uma variável para melhor gerenciamento de handles de arquivo:
# Abre descritor de arquivo e armazena em variável
exec {fd}< input.txt
enquanto IFS= read -r -u "${fd}" linha; faça
echo "Lido: ${linha}"
feito
exec {fd}<&- # Fecha o descritor de arquivo
# Exemplo prático: Múltiplos handles de arquivo
exec {input_fd}< data.txt
exec {output_fd}> resultados.txt
exec {error_fd}> erros.txt
process_data() {
enquanto IFS= read -r -u "${input_fd}" linha; faça
if validate_line "${linha}"; then
echo "Processado: ${linha}" >&"${output_fd}"
else
echo "Erro: ${linha}" >&"${error_fd}"
fi
feito
}
process_data
exec {input_fd}<&-
exec {output_fd}>&-
exec {error_fd}>&-
Benefícios:
- Descritores de arquivo nomeados em vez de números mágicos
- Alocação automática de FD evita conflitos
- Código mais legível e fácil de manter
- Rastreamento mais fácil de handles de arquivo abertos
Aprimoramentos em Arrays
Melhor Manipulação de Arrays Associativos
Melhor suporte para operações complexas com arrays:
# Declara array associativo com typeset
declare -A config=(
[host]="localhost"
[port]="8080"
[debug]="true"
)
# Expansão de arrays aprimorada
para key em "${!config[@]}"; faça
printf '%s=%s\n' "${key}" "${config[${key}]}"
feito
# Exemplo prático: Parser de configuração
parse_config() {
declare -gA app_config
local linha key valor
enquanto IFS='=' read -r key valor; faça
[[ "${key}" =~ ^[[:space:]]*# ]] && continue # Pula comentários
[[ -z "${key}" ]] && continue # Pula linhas vazias
# Remove espaços em branco
key="${key#"${key%%[![:space:]]*}"}"
key="${key%"${key##*[![:space:]]}"}"
valor="${valor#"${valor%%[![:space:]]*}"}"
valor="${valor%"${valor##*[![:space:]]}"}"
app_config["${key}"]="${valor}"
done < config.ini
}
Suporte a Arrays Multidimensionais
Manipulação aprimorada de estruturas de array aninhadas.
Integração com Readline 8.1
Interação aprimorada de edição de texto e linha de comando:
Atalhos de Teclado e Histórico
# Configura readline em ~/.inputrc
# Habilita autocompletar sem diferenciação de maiúsculas/minúsculas
set completion-ignore-case on
# Habilita estatísticas visíveis para autocompletação
set visible-stats on
# Mostra todas as opções de autocompletação imediatamente
set show-all-if-ambiguous on
# Usa cores para correspondência de autocompletação
set colored-completion-prefix on
Busca de Histórico Aprimorada
# No seu script ou .bashrc
# Liga Ctrl+R para busca incremental reversa (padrão, mas aprimorada no 5.1)
bind '"\C-r": reverse-search-history'
# Liga Ctrl+S para busca incremental progressiva
bind '"\C-s": forward-search-history'
# Manipulação de histórico melhorada
shopt -s histappend # Anexa ao histórico
shopt -s cmdhist # Comandos multi-linha como uma entrada
HISTCONTROL=ignoreboth # Ignora duplicatas e espaços iniciais
HISTSIZE=10000
HISTFILESIZE=20000
Melhorias em Tratamento de Sinais
Melhor propagação de sinais em subshells e substituições de processo:
# Tratamento de traps aprimorado em subshells
cleanup() {
echo "Limpando..." >&2
rm -f "${temp_file}"
exit 130 # 128 + SIGINT
}
trap cleanup SIGINT SIGTERM
arquivo_temp=$(mktemp)
# Sinal se propaga corretamente por pipes
tarefa_longas | processar_saida &
pid=$!
# Aguarda job em background com tratamento adequado de sinal
wait "${pid}" 2>/dev/null
codigo_saida=$?
if [[ ${codigo_saida} -gt 128 ]]; then
sinal=$((codigo_saida - 128))
echo "Processo terminado pelo sinal ${sinal}" >&2
fi
Correções de Bugs e Casos Limítrofes
Manipulação de Subshell
Comportamento melhorado ao criar subshells:
# Herança de variável de subshell mais confiável
var_externa="pai"
(
# Subshell agora herda variáveis do pai de forma mais confiável
echo "No subshell: ${var_externa}"
var_interna="filho"
)
# var_externa ainda acessível, var_interna não
echo "Após subshell: ${var_externa}"
Casos Limítrofes em Correspondência de Padrões
Casos limítrofes corrigidos na correspondência de padrões glob:
# Correspondência glob mais confiável com caracteres especiais
shopt -s nullglob # Expansão vazia para globs sem correspondência
shopt -s extglob # Correspondência de padrão estendida
# Exemplo: Corresponder arquivos mas tratar correspondências vazias graciosamente
arquivos=(*.txt)
if [[ ${#arquivos[@]} -eq 0 ]]; then
echo "Nenhum arquivo .txt encontrado"
else
printf 'Encontrado: %s\n' "${arquivos[@]}"
fi
Melhorias de Desempenho
- Expansão de variáveis mais rápida em loops
- Operações de array otimizadas
- Uso reduzido de memória para arrays grandes
- Eficiência melhorada na correspondência de padrões
Notas de Compatibilidade
Atualização do Bash 5.0
A maioria dos scripts é compatível, mas observe:
EPOCHSECONDSeEPOCHREALTIMEsão novos - verifique a existência se visar versões mais antigasSRANDOMpode não estar disponível em todos os sistemas- Alguns casos limítrofes obscuros no comportamento de expansão foram corrigidos
Verificação de Versão
# Verifica a versão do Bash antes de usar recursos 5.1
if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 1 ]]; then
# Seguro usar recursos do Bash 5.1
timestamp="${EPOCHSECONDS}"
else
# Fallback para versões mais antigas
timestamp=$(date +%s)
fi
Referências
- Arquivo NEWS do Bash - Notas de lançamento oficiais
- Lançamento GNU Bash 5.1 - Distribuição fonte
- Página man do Bash:
man bash(seção sobre recursos específicos da versão)
Recursos Adicionais
Para padrões e práticas recomendadas mais amplas de desenvolvimento Bash, consulte:
- ../bash-development/SKILL.md - Padrões principais de desenvolvimento Bash
- ../bash-portability/SKILL.md - Compatibilidade entre versões