Der Befehl printf '%.0s-' `seq 1 30`; echo
funktioniert in allen getesteten Shells einwandfrei:
/bin/jsh : ------------------------------
/bin/attsh : ------------------------------
/bin/y2sh : ------------------------------
/bin/ash : ------------------------------
/bin/dash : ------------------------------
/bin/b203sh : ------------------------------
/bin/b43sh : ------------------------------
/bin/b44sh : ------------------------------
/bin/bash : ------------------------------
/bin/ksh : ------------------------------
/bin/ksh93 : ------------------------------
/bin/lksh : ------------------------------
/bin/mksh : ------------------------------
/bin/zsh : ------------------------------
/bin/zsh4 : ------------------------------
Mit Ausnahme von jsh (Erbstück-Shell), y2sh implementieren noch eine weitere Shell, Version 2.39 und lksh (Legacy Korn-Shell), alle ein eingebautes printf:
/bin/attsh : printf is a shell builtin
/bin/ash : printf is a shell builtin
/bin/dash : printf is a shell builtin
/bin/b203sh : printf is a shell builtin
/bin/b43sh : printf is a shell builtin
/bin/b44sh : printf is a shell builtin
/bin/bash : printf is a shell builtin
/bin/ksh : printf is a shell builtin
/bin/ksh93 : printf is a shell builtin
/bin/mksh : printf is a shell builtin
/bin/zsh : printf is a shell builtin
/bin/zsh4 : printf is a shell builtin
Aber diese Zeile: printf '%.s-' `seq 1 30`; echo
lässt (nur) zsh scheitern:
/bin/attsh : ------------------------------
/bin/ash : ------------------------------
/bin/dash : ------------------------------
/bin/b203sh : ------------------------------
/bin/b43sh : ------------------------------
/bin/b44sh : ------------------------------
/bin/bash : ------------------------------
/bin/ksh : ------------------------------
/bin/ksh93 : ------------------------------
/bin/mksh : ------------------------------
/bin/zsh : 1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-
/bin/zsh4 : 1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-
Die POSIX-Spezifikation besagt Folgendes:
Die Genauigkeit muss in Form eines ('.') Gefolgt von einer Dezimalzeichenfolge erfolgen. Eine nullstellige Zeichenfolge wird als Null behandelt.
Auch wenn in der s
Formatspezifikation angegeben ist (im selben Link):
Wenn die Genauigkeit im Argument weggelassen wird, wird davon ausgegangen, dass sie unendlich ist, sodass alle Bytes bis zum Ende der Zeichenfolge geschrieben werden.
Es könnte vernünftig argumentiert werden, dass eine "fehlende" Präzisionsziffer nicht "weggelassen" wird, sondern auf "null" gesetzt wurde und daher als Null interpretiert werden sollte.
Daraus folgt, dass zsh hier einen Fehler hat.
Ist das die richtige Erklärung?
.
als auch auf die optionale Ziffernfolge. eine ausgelassene Präzision sieht so aus%s
, nicht%.s
.Antworten:
Ja, es ist ein Fehler (38306). Das Update wurde in Zsh 5.3 veröffentlicht.
Quelle: https://github.com/zsh-users/zsh/commit/e1c745a0dca56afb9cfcace1ef59449152290188
quelle