web-dev-qa-db-ja.com

zshがprintf '%。s'で文字列全体を出力するのはバグですか?

コマンド printf '%.0s-' `seq 1 30`; echoテストしたすべてのシェルで正常に動作します:

/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       : ------------------------------

Jsh(heirloom Shell)、y2sh Yet another Shell、バージョン2.39 およびlksh(Legacy Korn Shell)を除いて、他のすべては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

しかし、この行:printf '%.s-' `seq 1 30`; echoは(のみ)zshを失敗させます:

/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-

POSIX仕様 は次のように述べています。

精度は、( '。')の後に10進数の文字列が続く形式を取ります。ヌル桁の文字列はゼロとして扱われます。

s形式の仕様に(同じリンクで)記載されている場合でも、次のようになります。

引数から精度を省略した場合は無限大とみなされるため、文字列の末尾までのすべてのバイトが書き込まれます。

「欠落している」精度の数字は「省略」されていないが、「null」に設定されているため、ゼロとして解釈されるべきであると合理的に主張することができます。

Zshにはここにバグがあることになります。

それは正しい説明ですか?

7
user79743

はい、それはバグです(38306)。修正はZsh5.3でリリースされました。

ソース: https://github.com/zsh-users/zsh/commit/e1c745a0dca56afb9cfcace1ef59449152290188

9
DarkHeart