정말 긴 줄이 있는 텍스트 파일에서 작동할 수 없는 최신 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);

크기가 지정된 문자 배열은 어디에 line있습니까 LINE_MAX(예를 들어 참조)pam_localuser). 가 non- 을 반환할 line때마다 처리되는 경우 입력이 너무 길면 줄이 분할되어 처리됩니다. 따라서 에서는 보다 긴 줄이 두 줄로 처리됩니다.fgetsNULLLINE_MAXpam_localuser/etc/passwdLINE_MAX

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

관련 정보