该命令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 : ------------------------------
Run Code Online (Sandbox Code Playgroud)
除了 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
Run Code Online (Sandbox Code Playgroud)
但是这一行: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-
Run Code Online (Sandbox Code Playgroud)
该POSIX规范规定:
精度应采用 ( '.' ) 后跟十进制数字字符串的形式;空数字字符串被视为零。
即使s格式规范指出(在同一个链接中):
如果参数中省略了精度,则应将其视为无限,因此应写入到字符串末尾的所有字节。
可以合理地认为“缺失”的精度数字不是“省略”而是被设置为“空”,因此应该被解释为零。
随之而来的是 zsh 在这里有一个错误。
这是正确的解释吗?
小智 9
是的,这是一个错误 (38306)。该修复程序已在 Zsh 5.3 中发布。
来源:https : //github.com/zsh-users/zsh/commit/e1c745a0dca56afb9cfcace1ef59449152290188