printf
POSIX에 따르면 awk 함수를 사용하여 널 바이트를 인쇄하는 것이 합법적입니까? 이것POSIX 표준awk
어느 쪽이든 명시적으로 언급되지 않은 것 같습니다. 실제 구현은 다르게 동작합니다.
+$ gawk 'BEGIN { x = sprintf("\000"); print(length(x)); }'
1
+$ busybox awk 'BEGIN { x = sprintf("\000"); print(length(x)); }'
0
+$
그리고
+$ gawk 'BEGIN { printf("\000"); }' | xxd
00000000: 00 .
+$ busybox awk 'BEGIN { printf("\000"); }' | xxd
+$
표준에 명시되어 있나요? 그렇다면, x = sprintf("\000")
Variable()과 printf()에 필요한 동작이 printf("\000")
동일합니까?
답변1
관련 텍스트가 4개 이상 있습니다.POSIX.2018 사양awk
:
아래에 인용된 모든 텍스트에서 강조(굵은 텍스트)는 제가 한 것입니다.
다음 소스 중 하나의 awk 프로그램에 대한 입력 파일은 다음과 같아야 합니다.텍스트문서
이는 입력에 NUL 문자가 포함되어 있으면(POSIX 텍스트 정의에 따라 텍스트가 아닌 경우) 동작이 지정되지 않음을 의미합니다.
\ddd : <백슬래시> 문자 뒤에 1, 2 또는 3개의 8진수 문자로 구성된 가장 긴 순서가 옵니다(01234567). 모든 숫자가 0(즉, NUL 문자 표현)인 경우 동작은 정의되지 않습니다..
이로 \000
인해 정의되지 않은 동작이 발생합니다.
정규식 일치 관련:
그러나 모든 awk ERE 경기에서는패턴, 입력 레코드 또는 텍스트 문자열에 하나 이상의 NUL 문자를 사용하면 정의되지 않은 결과가 생성됩니다.
에 대한 printf
/ sprintf
:
7. c 변환 지정자의 경우: 인수에 숫자 값이 있으면 해당 값으로 인코딩된 문자가 출력되어야 합니다.값이 0인 경우또는 문자 세트의 문자 인코딩이 아닙니다.동작이 정의되지 않았습니다..
따라서 이는 NUL 문자를 가져오는 또 다른 방법이므로 정의되지 않은 동작이 발생합니다.
요약하면 awk
POSIX는 NUL 문자를 입력, 출력 또는 변수 저장 등 이식성 있게 사용할 수 없음을 알려줍니다.
gawk
(적어도 1989년 2.10 이후, 이는 내가 찾을 수 있는 가장 초기 버전입니다.NUL 지원 문서화) 그리고@토마스디키mawk
(부터버전 20140914)은 NUL을 처리할 수 있는 두 가지 구현입니다.
답변2
awk
C 문자열은 일반적 으로 기본적으로 일종의 C 인터프리터인 nul 바이트를 포함할 수 없습니다 . Null 바이트를 인쇄할 수 있는 POSIX 유틸리티는 POSIX 표준에서 명시적으로 언급되어야 합니다. printf
그러나 awk
그것은 진실이 아니다.
다음 상황은 POSIX에 명시적으로 나열되어 있습니다.
echo 'x\0000y'
printf 'x\000y\n'
printf '%b\n' 'x\0000y'
세 가지 명령 모두 POSIX UNIX 브랜드가 있는 인증된 운영 체제에서 4자를 인쇄합니다.
귀하의 awk
예에서는 지정되지 않은 동작을 사용합니다.