Ist es ein Fehler, dass zsh die vollständige Zeichenfolge mit printf '% .s' druckt?

7

Der Befehl printf '%.0s-' `seq 1 30`; echofunktioniert 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`; echolä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 sFormatspezifikation 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?


quelle
3
Ich würde "Bug" sagen. "Präzision" bezieht sich sowohl auf die .als auch auf die optionale Ziffernfolge. eine ausgelassene Präzision sieht so aus %s, nicht %.s.
Chepper

Antworten: