man printf
, info printf
둘 printf --help
다 나에게는 아무 소용이 없습니다. 옵션에 대한 설명이 필요합니다 FORMAT
. 예를 들어 다음을 사용할 수 있습니다.
printf '%s\n' foo bar
출력을 얻습니다.
foo
bar
웹에서 일반적으로 읽은 내용에 따르면 이것이 %s
"구분 기호"와 같은 의미이므로 printf
주어진 각 인수를 개행 문자로 구분하여 인쇄합니다.
또한 여기저기서 참조 자료도 볼 수 %d
있으며 다른 몇 가지 참고 자료도 있습니다(숫자와 관련이 있다고 가정합니까?). 누군가 이러한 서식 옵션에 대한 개요를 제공할 수 있습니까?
답변1
Bash의 경우 주요 리소스는 입니다 man bash
. 특히 내장 기능의 경우 help
내장이 있습니다. 에서 인용한 내용입니다 help printf
.
printf(1) 및 printf(3)에 설명된 표준 형식 사양 외에도 printf는 다음도 해석합니다.
%b expand backslash escape sequences in the corresponding argument %q quote the argument in a way that can be reused as shell input %(fmt)T output the date-time string resulting from using FMT as a format string for strftime(3)
printf(N)
에 사용된 기호는 help printf
괄호 안의 숫자로 표시되는 명령에 대해 매뉴얼 섹션을 참조해야 함을 의미합니다.
특수 %(fmt)T 지정자가 필요한 경우 man 1 printf
, 및 를 참조하세요.man 3 printf
man 3 strftime
문서에는 단순히 "문자열의 경우 %s, 숫자의 경우 %d"가 나열되어 있지 않습니다. 나는 당신이 가장 먼저 요청한 것이 다음과 같다고 믿습니다.변환 사양.
답변2
내가 찾은 최고의 리소스는 다음과 같습니다.bash-hackers.org 위키Bash와 관련된 모든 것. 이것은 탐색하기 어려운 내용이 아닌 매뉴얼 페이지의 모습입니다.
다음을 포함한 특정 테마가 내장되어 있습니다.printf
. 이 페이지는 매우 상세합니다! 여기에는 모든 서식 옵션은 물론 예제와 하단의 토론 섹션도 포함되어 있어 극단적인 경우와 기능 printf
의 미묘한 차이를 구체화하는 데 도움이 됩니다.
나도 쓸 줄 안다printf에 대한 GNU Coreutils 문서, 특히 페이지형식 옵션, 만일의 경우에.
답변3
먼저, printf
다음 세 가지 변종을 구별하는 것이 중요합니다.
printf
카니발로서내장.printf
(Bash-) 외부 실행 파일로, 예를 들어핵심 도구/usr/bin/printf
(which printf
및 참조man 1 printf
).printf(..)
~에서C 표준 라이브러리(도서관) (내 경우에는GNU 프로젝트 glibc구현, 참조man 3 printf
첫 번째 단계는 실행 시 내장 실행 버전을 사용할지 외부 실행 버전을 사용할지 결정하는 것입니다.주문하다 printf '%s\n' foo bar
. 이는 다음을 사용하여 찾을 수 있습니다.type
배쉬 내장사용된 특정 쉘 프롬프트에서:
$ type printf
printf is a shell builtin
이것배쉬 내장 printf
에 기록됨Bash 참조 매뉴얼 - 4.2 Bash 내장 명령:printf
.
Bash 문서에는 %s
아무것도 설명하거나 설명 하지 않지만 %d
다음과 같은 관련 정보가 포함되어 있습니다.
표준 형식 외에도
printf(1)
printf는 다음 확장도 해석합니다. [...]
내 시스템(데비안 11 불스아이) man 1 printf
보여주다printf
실행 가능 파일~에서GNU 핵심 도구.
내장 명령 대신 실행 파일을 사용하여 명령을 실행하려면 다음 명령문 중 하나를 사용하십시오.
env printf '%s\n' foo bar
/usr/bin/printf '%s\n' foo bar
# full path to the printf *executable* found out via command 'which printf'
이것coreutils 실행 파일 printf
에 기록됨GNU Coreutils - 15.2 printf
: 데이터 형식 지정 및 인쇄.
coreutils 문서에는 다음과 같은 관련 정보가 포함되어 있습니다.
printf
인쇄체재문자열은 '%
' 지시문과 ' ' 이스케이프를 해석하여 C ' ' 함수와 거의 동일한 방식\
으로 숫자 및 문자열 인수의 형식을 지정합니다 .printf
바라보다printf
형식 지시어자세한 내용은 GNU C 라이브러리 참조 매뉴얼을 참조하세요. 차이점은 다음과 같습니다. [...]
coreutils 문서에서는 이미 %s
및 에 대한 추가 지침을 제공합니다 %d
.
인용됨GNU C 라이브러리 참조 매뉴얼다음과 같은 관련 섹션이 있습니다 printf(..)
.
- GNU C 라이브러리 참조 매뉴얼 - 12.12 형식화된 출력
- GNU C 라이브러리 참조 매뉴얼 - 12.12.1 형식화된 출력의 기본
- GNU C 라이브러리 참조 매뉴얼 - 12.12.3 출력 변환 테이블
'
%d
', '%i
': 정수를 부호 있는 십진수로 인쇄합니다. 바라보다정수 변환,더 알아보기. [...]
'%s
': 문자열을 인쇄합니다. 바라보다기타 출력 변환. [...] - GNU C 라이브러리 참조 매뉴얼 - 12.12.4 정수 변환
'
%d
' 및 '%i
' 변환 사양은 모두 int 인수를 부호 있는 십진수로 인쇄합니다. - GNU C 라이브러리 참조 매뉴얼 - 12.12.6 기타 출력 변환
'
%s
' 변환은 문자열을 인쇄합니다. ' ' 수정자가 없으면l
해당 매개변수는 유형이어야 합니다char * (or const char *)
. [...] - GNU C 라이브러리 참조 매뉴얼 - 12.12.7 형식화된 출력 함수
기능: int printf(const char *template, ...) [...]
마침내:GNU C 라이브러리(또한) 하나이다구현하다~의C POSIX 라이브러리 기준, 거기에 제공된 사양을 어느 정도 준수합니다.
POSIX정식명칭(최신버전)은POSIX.1-2017, 그리고IEEE 표준 1003.1-2017, 그리고오픈 그룹 기술 표준 기본 사양, 7호. 사양은 printf(..)
"사양에 따라" 작업하는 방법에 대한 "공식적인" 규칙을 제공합니다.
- POSIX.1-2017 사양 홈 페이지
- POSIX.1-2017 - "시스템 인터페이스" 볼륨
- POSIX.1-2017 - dprintf, fprintf, printf, snprintf, sprintf - 인쇄 형식의 출력
[...] 이 참조 페이지에 설명된 기능은 ISO C 표준을 준수합니다. 여기에 설명된 요구 사항과 ISO C 표준 간의 충돌은 의도적인 것이 아닙니다.이 볼륨 POSIX.1-2017은 ISO C 표준을 따릅니다.. [...]
[...] printf() 함수는 표준 출력 스트림 stdout에 출력을 배치해야 합니다.
[...] 이러한 각 함수는 형식 제어에 따라 인수를 변환하고 형식을 지정하고 인쇄합니다. 형식은 초기 이동 상태(있는 경우)로 시작하고 끝나는 문자열입니다. 형식은 0개 이상의 명령어, 즉 일반 문자(단순히 출력 스트림에 복사됨)와 변환 사양(각각 0개 이상의 인수를 얻도록 함)으로 구성됩니다. 형식 매개변수가 충분하지 않으면 결과가 정의되지 않습니다. 형식이 소진되고 인수가 여전히 존재하는 경우 초과 인수를 평가해야 하지만 그렇지 않으면 무시됩니다. [...]
[...] % 형식의 변환 사양이 포함된 형식 문자열에서 각 변환 사양은 인수 목록에서 사용되지 않은 첫 번째 매개 변수를 사용합니다. [...]
[...] 각 변환 사양은 '%' 문자 [...] 다음에 다음 순서가 옵니다. [...] 적용할 변환 유형을 나타내는 변환 지정자 문자입니다. [...]
변환 지정자와 그 의미는 다음과 같습니다.
디,i:int 인수는 "[-]dddd" 스타일의 부호 있는 10진수로 변환되어야 합니다. 정밀도는 발생할 최소 자릿수를 지정합니다. 변환할 값이 더 적은 자릿수로 표시될 수 있는 경우 앞에 0을 붙여 확장해야 합니다. 기본 정밀도는 1입니다. 명시적 정밀도 0을 사용하여 0을 변환한 결과는 문자가 아니어야 합니다.
[...]
에스:인수는 문자 배열에 대한 포인터여야 합니다. 배열의 바이트는 종료 널 바이트를 포함하여 작성됩니다(포함하지 않음). 정밀도가 지정된 경우 기록된 바이트 수는 이 숫자를 초과할 수 없습니다. 정밀도가 지정되지 않거나 배열 크기보다 큰 경우 애플리케이션은 배열에 널 바이트가 포함되어 있는지 확인해야 합니다.
[...]
- POSIX.1-2017 - dprintf, fprintf, printf, snprintf, sprintf - 인쇄 형식의 출력
- POSIX.1-2017 - "시스템 인터페이스" 볼륨
분명히 정의를 완전히 탐구하기 위해 다음 단계는 공식적으로 지정된 "ISO C 표준"("ANSI C"라고도 함)의 적절한 개정판을 살펴보는 것입니다.ISO/IEC 9899, 예를 들어 개정판에서ISO/IEC 9899:2018, 또한 ~으로 알려진C17. ISO C 표준 개정에 대한 공식 전체 사양을 찾는 것은 그리 쉽지 않습니다.이 StackOverflow 질문에 표시된 대로.
그러나 "Bash의 내장 printf
형식 지정 옵션"이 무엇을 의미하고 더 이국적인 변형에 대해 실제로 작동하는지 알아내려면 여러 계층의 구현, 추상화 및 사양을 탐구해야 할 수도 있다는 것만 말하면 충분합니다.
동등한 중요성
이러한 소프트웨어의 버전에 따라 사용 가능한 옵션이 다를 수 있으며 기존 옵션의 의미가 변경될 수 있습니다. 가장 좋은 방법은 사용 중인 버전과 일치하는 수동 버전을 참조하는 것입니다. 예를 들어 GNU C 라이브러리 참조 매뉴얼버전 제어 수동 빌드 제공.