매우 긴 줄이 포함된 텍스트 파일을 작동할 수 없는 최신 Unix 계열 운영 체제에 쉘 유틸리티가 있습니까?

매우 긴 줄이 포함된 텍스트 파일을 작동할 수 없는 최신 Unix 계열 운영 체제에 쉘 유틸리티가 있습니까?

LINE_MAX를 실행하여 얻을 수 있는 값입니다 getconf LINE_MAX. FreeBSD 12와 Ubuntu 18.04(그리고 다른 많은 운영 체제도 의심됩니다)에서 값은 2048바이트입니다.

POSIX 세계에는 텍스트 파일 작업을 위해 특별히 설계된 쉘 유틸리티가 많이 있습니다. 줄 바꿈을 포함하여 바이트보다 긴 줄이 있는 파일은 LINE_MAX텍스트 파일이 아닙니다(어차피 POSIX에서 정의한 대로). 텍스트 파일을 입력으로 사용하도록 설계된 쉘 유틸리티는 이러한 파일을 올바르게 처리할 필요가 없습니다.

실제로 매우 긴 줄이 포함된 텍스트 파일을 처리할 수 없는 유틸리티를 찾을 수 없는 것 같습니다. 내가 아는 한, GNU 유틸리티에는 텍스트 파일의 줄 길이에 대한 실제 제한이 없습니다(FreeBSD에 대해서는 잘 모르겠습니다).

LINE_MAX바이트보다 긴 줄을 차단 하는 현대 또는 준현대 운영 체제의 쉘 유틸리티를 아는 사람이 있습니까 ? 그런데 Perl이나 Python 같은 프로그래밍 언어도 의 값에 영향을 받나요 LINE_MAX?

답변1

LINE_MAX이 사이트에는 최소한 일부 상황에서 이를 고수하는 쉘 유틸리티의 예가 있습니다 .오픈BSDcut;그러나 실제로는 그렇지 않다.초크줄은 이보다 길지만 일부 기능은 LINE_MAX줄의 첫 번째 문자로 제한됩니다.

더 긴 줄을 사용하는 유틸리티를 완전히 거부하는 것 외에도 잠재적으로 바람직하지 않은 동작으로 이어지는 공통 패턴이 있습니다.

fgets(line, sizeof line, fp);

where lineis LINE_MAX- 크기의 문자 배열(예제 참조)pam_localuser). line처리할 때마다 fgetsnon- 이 반환되는 경우 줄이 너무 길면 NULL입력 LINE_MAX이 분할됩니다. 따라서 에서는 pam_localuser길이 /etc/passwd가 1보다 큰 줄은 LINE_MAX두 줄로 처리됩니다.

내가 살펴본 프로그래밍 언어와 파서 생성기에는 참조가 없습니다 LINE_MAX(해당 언어로 작성된 프로그램에서 값을 사용할 수 있도록 전달하는 것 외에는). 여기에는 GCC, Perl, Python 및 Lua가 포함됩니다.

관련 정보