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"로 설정되었으므로 0으로 해석되어야 한다고 생각하는 것이 합리적입니다.

zsh에 버그가 있음을 알 수 있습니다.

이것이 올바른 설명인가요?

답변1

예, 이것은 버그입니다(38306). 수정 사항은 Zsh 5.3에서 릴리스되었습니다.

원천:https://github.com/zsh-users/zsh/commit/e1c745a0dca56afb9cfcace1ef59449152290188

관련 정보