zsh 用 printf '%.s' 打印完整字符串是一个错误吗?

zsh 用 printf '%.s' 打印完整字符串是一个错误吗?

该命令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(传家宝 shell)、y2sh另一个 shell,版本 2.39和 lksh(旧版 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格式规范声明(在同一链接中):

如果参数中省略精度,则应将其视为无限,因此应写入直到字符串末尾的所有字节。

可以合理地认为,“丢失”的精度数字不是“省略”的,而是已设置为“空”,因此应解释为零。

由此可见 zsh 这里有一个 bug。

这是正确的解释吗?

答案1

是的,这是一个错误(38306)。该修复已在 Zsh 5.3 中发布。

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

相关内容