Bash 5.1 – Funktionen und Verbesserungen
Bash 5.1, veröffentlicht im Dezember 2020, führte mehrere bemerkenswerte Funktionen und Verbesserungen für modernes Shell-Scripting ein.
Neue Shell-Variablen
EPOCHSECONDS und EPOCHREALTIME
Zwei neue spezielle Variablen, um die aktuelle Zeit abzurufen:
# Aktuellen Unix-Zeitstempel in Sekunden abrufen
echo "Aktueller Zeitstempel: ${EPOCHSECONDS}"
# Aktuellen Unix-Zeitstempel mit Mikrosekundengenauigkeit abrufen
echo "Hochpräziser Zeitstempel: ${EPOCHREALTIME}"
# Praktisches Beispiel: Einfacher Benchmark
start="${EPOCHREALTIME}"
# ... einige Operationen ...
sleep 0.5
end="${EPOCHREALTIME}"
dauer=$(awk "BEGIN {print ${end} - ${start}}")
echo "Operation dauerte ${dauer} Sekunden"
# Beispiel: Loggen mit präzisen Zeitstempeln
log_message() {
printf '[%s.%06d] %s\n' \
"$(date -d "@${EPOCHSECONDS}" '+%Y-%m-%d %H:%M:%S')" \
"${EPOCHREALTIME#*.}" \
"$*"
}
log_message "Starte Prozess"
Anwendungsfälle:
- Präzise Leistungsmessung
- Hochauflösende Zeitstempel für Logs
- Vermeidung externer
date-Aufrufe - Zeitmessung mit Mikrosekundengenauigkeit in Skripten
SRANDOM-Variable
Kryptografisch starke Zufallszahlen:
# Sichere Zufallszahl generieren (wenn verfügbar)
if [[ -n "${SRANDOM}" ]]; then
secure_random="${SRANDOM}"
echo "Sichere Zufallszahl: ${secure_random}"
else
echo "SRANDOM nicht verfügbar (erfordert getrandom/getentropy)"
fi
# Praktisches Beispiel: Temporäre Datei mit sicherem Zufallsnamen erzeugen
temp_file="/tmp/secure_${SRANDOM}_${EPOCHSECONDS}.tmp"
Hinweis: SRANDOM erfordert Systemunterstützung für die Systemaufrufe getrandom() oder getentropy().
Verbesserte Umleitungssyntax
{varname}-Umleitung
Dateideskriptor einer Variablen zuweisen für bessere Dateihand-Verwaltung:
# Dateideskriptor öffnen und in Variable speichern
exec {fd}< eingabe.txt
while IFS= read -r -u "${fd}" zeile; do
echo "Gelesen: ${zeile}"
done
exec {fd}<&- # Dateideskriptor schließen
# Praktisches Beispiel: Mehrere Dateihandles
exec {input_fd}< daten.txt
exec {output_fd}> ergebnisse.txt
exec {error_fd}> fehler.txt
process_data() {
while IFS= read -r -u "${input_fd}" zeile; do
if validate_line "${zeile}"; then
echo "Verarbeitet: ${zeile}" >&"${output_fd}"
else
echo "Fehler: ${zeile}" >&"${error_fd}"
fi
done
}
process_data
exec {input_fd}<&-
exec {output_fd}>&-
exec {error_fd}>&-
Vorteile:
- Benannte Dateideskriptoren statt magischer Zahlen
- Automatische FD-Vergabe vermeidet Konflikte
- Lesbarerer und wartbarerer Code
- Einfachere Nachverfolgung offener Dateihandles
Array-Verbesserungen
Verbesserte assoziative Array-Verarbeitung
Bessere Unterstützung für komplexe Array-Operationen:
# Assoziatives Array mit typeset deklarieren
declare -A konfiguration=(
[host]="localhost"
[port]="8080"
[debug]="true"
)
# Erweiterte Array-Expansion
for schluessel in "${!konfiguration[@]}"; do
printf '%s=%s\n' "${schluessel}" "${konfiguration[${schluessel}]}"
done
# Praktisches Beispiel: Konfigurationsparser
parse_config() {
declare -gA app_config
local zeile schluessel wert
while IFS='=' read -r schluessel wert; do
[[ "${schluessel}" =~ ^[[:space:]]*# ]] && continue # Kommentare überspringen
[[ -z "${schluessel}" ]] && continue # Leere Zeilen überspringen
# Leerzeichen entfernen
schluessel="${schluessel#"${schluessel%%[![:space:]]*}"}"
schluessel="${schluessel%"${schluessel##*[![:space:]]}"}"
wert="${wert#"${wert%%[![:space:]]*}"}"
wert="${wert%"${wert##*[![:space:]]}"}"
app_config["${schluessel}"]="${wert}"
done < config.ini
}
Unterstützung für mehrdimensionale Arrays
Verbesserte Handhabung von verschachtelten Array-Strukturen.
Readline 8.1-Integration
Erweiterte Textbearbeitung und Befehlszeilen-Interaktion:
Tastenkombinationen und Verlauf
# Readline in ~/.inputrc konfigurieren
# Groß-/Kleinschreibung ignorieren bei Vervollständigung
set completion-ignore-case on
# Sichtbare Statistiken für Vervollständigungen aktivieren
set visible-stats on
# Alle Vervollständigungen sofort anzeigen
set show-all-if-ambiguous on
# Farben für Vervollständigungsübereinstimmungen verwenden
set colored-completion-prefix on
Verbesserte Verlaufssuche
# In Ihrem Skript oder .bashrc
# Strg+R für umgekehrte inkrementelle Suche (Standard, aber in 5.1 verbessert)
bind '"\C-r": reverse-search-history'
# Strg+S für vorwärts gerichtete inkrementelle Suche
bind '"\C-s": forward-search-history'
# Verbesserte Verlaufshandhabung
shopt -s histappend # Verlauf anhängen
shopt -s cmdhist # Mehrzeilige Befehle als ein Eintrag
HISTCONTROL=ignoreboth # Duplikate und führende Leerzeichen ignorieren
HISTSIZE=10000
HISTFILESIZE=20000
Verbesserungen der Signalbehandlung
Bessere Signalweitergabe in Subshells und Prozesssubstitutionen:
# Verbesserte Trap-Behandlung in Subshells
cleanup() {
echo "Räume auf..." >&2
rm -f "${temp_file}"
exit 130 # 128 + SIGINT
}
trap cleanup SIGINT SIGTERM
temp_file=$(mktemp)
# Signal wird korrekt durch Pipelines weitergegeben
langlaufende_aufgabe | ausgabe_verarbeiten &
pid=$!
# Auf Hintergrund-Job mit korrekter Signalbehandlung warten
wait "${pid}" 2>/dev/null
exit_code=$?
if [[ ${exit_code} -gt 128 ]]; then
signal=$((exit_code - 128))
echo "Prozess durch Signal ${signal} beendet" >&2
fi
Fehlerbehebungen und Randfälle
Subshell-Verarbeitung
Verbessertes Verhalten beim Erzeugen von Subshells:
# Zuverlässigere Vererbung von Variablen in Subshells
outer_var="Eltern"
(
# Subshell erbt jetzt zuverlässiger Elternvariablen
echo "In Subshell: ${outer_var}"
inner_var="Kind"
)
# outer_var ist weiterhin zugänglich, inner_var nicht
echo "Nach Subshell: ${outer_var}"
Randfälle bei der Mustererkennung
Behobene Randfälle beim Globbing:
# Zuverlässigerer Glob-Abgleich mit Sonderzeichen
shopt -s nullglob # Leere Expansion für nicht passende Globs
shopt -s extglob # Erweiterte Mustererkennung
# Beispiel: Dateien abgleichen, aber keine Übereinstimmungen elegant behandeln
dateien=(*.txt)
if [[ ${#dateien[@]} -eq 0 ]]; then
echo "Keine .txt-Dateien gefunden"
else
printf 'Gefunden: %s\n' "${dateien[@]}"
fi
Leistungsverbesserungen
- Schnellere Variablenexpansion in Schleifen
- Optimierte Array-Operationen
- Reduzierter Speicherverbrauch für große Arrays
- Verbesserte Effizienz bei der Mustererkennung
Kompatibilitätshinweise
Upgrade von Bash 5.0
Die meisten Skripte sind kompatibel, aber beachten Sie:
EPOCHSECONDSundEPOCHREALTIMEsind neu – prüfen Sie die Existenz, wenn Sie ältere Versionen unterstützen müssenSRANDOMist möglicherweise nicht auf allen Systemen verfügbar- Einige obskure Randfälle im Expansionsverhalten wurden behoben
Versionsprüfung
# Bash-Version prüfen, bevor 5.1-Funktionen verwendet werden
if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 1 ]]; then
# Bash 5.1-Funktionen können sicher verwendet werden
timestamp="${EPOCHSECONDS}"
else
# Fallback für ältere Versionen
timestamp=$(date +%s)
fi
Referenzen
- Bash NEWS-Datei – Offizielle Versionshinweise
- GNU Bash 5.1-Veröffentlichung – Quellverteilung
- Bash-Manpage:
man bash(Abschnitt zu versionsspezifischen Funktionen)
Zusätzliche Ressourcen
Für umfassendere Bash-Entwicklungsmuster und Best Practices siehe:
- ../bash-development/SKILL.md – Kern-Bash-Entwicklungsmuster
- ../bash-portability/SKILL.md – Versionsübergreifende Kompatibilität