zshで文字列全体を印刷するためにprintf '%.s'を使用するのは間違いですか?

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(ガボシェル)に加えて、y2sh別のシェル、バージョン2.39そしてlksh(以前のKornシェル)はすべて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 進文字列が続く必要があり、空の数値文字列は 0 として扱われます。

s形式仕様にも以下の内容が記載されています(同じリンクにあります)。

引数で精度が省略された場合は無限に処理する必要があるため、文字列の終わりまでのすべてのバイトを書き込む必要があります。

「欠けている」精度の数字は「省略」ではなく「null」に設定されているので、ゼロと解釈されるべきだと考えるのが合理的です。

zshにバグがあることがわかります。

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

ベストアンサー1

はい、これはバグです(38306)。修正はZsh 5.3でリリースされました。

源泉:https://github.com/zsh-users/zsh/commit/e1c745a0dca56afb9cfcace1ef59449152290188

おすすめ記事