Shell

zsh 使用 printf ‘%.s’ 列印完整字元串是否是一個錯誤?

  • February 27, 2019

該命令printf '%.0s-' seq 1 30; echo在所有測試的 shell 中都能正常工作:

/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還有另一個 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 規範指出:

精度應採用 (’.’) 後跟十進制數字字元串的形式;空數字字元串被視為零。

即使s格式規範聲明(在同一連結中):

如果參數中省略了精度,則應將其視為無限,因此應寫入直到字元串末尾的所有字節。

有理由認為,“缺失”的精度數字不是“省略”,而是設置為“null”,因此應解釋為 0。

隨之而來的是 zsh 在這裡有一個錯誤。

這是正確的解釋嗎?

是的,這是一個錯誤 (38306)。該修復程序在 Zsh 5.3 中發布。

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

引用自:https://unix.stackexchange.com/questions/302687