Das Skript:
#!/bin/bash
declare -a arr=()
echo ${#arr[@]:-}
schlägt auf Arch Linux (bash 4.4.5):
-bash: ${#arr[@]:-}: bad substitution
Während es auf Ubuntu 14.04 (bash 4.3.11) oder Debian 8 (4.3.30) arbeitet .
Das Skript:
#!/bin/bash
declare -a arr=()
echo ${#arr[@]:-}
schlägt auf Arch Linux (bash 4.4.5):
-bash: ${#arr[@]:-}: bad substitution
Während es auf Ubuntu 14.04 (bash 4.3.11) oder Debian 8 (4.3.30) arbeitet .
In valid_array_reference
Funktion in arrayfunc.c
wurde die folgende Kontrolle hinzugefügt:
if (t[len+1] != '\0')
return 0;
Somit wird die Expansion nun an der erwarteten Stelle enden validiert, während der zuvor für ungültig/unerwartete Inhalte nach dem Subskript ignoriert .
Dies ist für 05.06 im CWRU/Changelog-Eintrag wie folgt dokumentiert:
arrayfunc.c
valid_array_reference
: Stellen Sie sicher, dass die Array-Referenz nach dem ersten beendet richtig ist Index; Rückkehr ungültig, wenn etwas nach Abschluss gibt es]
Insbesondere valid_array_reference
von subst.c
in valid_length_expression
genannt wird -, die als Vorläufer für parameter_brace_expand_length
genannt wird, die tatsächlich die Substitution an der Hand führt.
Diese Ersetzung ... macht eigentlich * Sinn * nicht. Warum würdest du erwarten, dass es überhaupt funktioniert? (Und klar sein - wenn etwas nicht dokumentiert ist, um zu funktionieren, dann ist es kein Fehler mehr, in der Zukunft zu arbeiten, sondern nur eine Veränderung im undefinierten Verhalten). –
(Eine Array-Länge kann niemals leer oder null sein, daher ist "Standard leer" nicht sinnvoll). –
Die andere Sache ist, dass das git-Repository für bash eigentlich keine Granularität auf ChangeSet-Ebene hat - Chet macht jedes Mal ein neues Commit, wenn er ein neues Release veröffentlicht, also gibt es nicht genug Informationen, um "X zu ändern" , die mit der Commit-Nachricht Y als Antwort auf den Bug Z gemacht wurde, verursachte dieses Delta im Verhalten ". –