POSIX에서 정의한 파일이 텍스트 파일이 되려면 어떤 조건이 충족되어야합니까?


22

POSIX는 텍스트 파일을 다음과 같이 정의합니다.

0 개 이상의 줄로 구성된 문자가 포함 된 파일입니다. 행은 NUL 문자를 포함하지 않으며 <newline> 문자를 포함하여 길이가 {LINE_MAX} 바이트를 초과 할 수 없습니다. POSIX.1-2017은 텍스트 파일과 이진 파일을 구분하지 않지만 (ISO C 표준 참조) 많은 유틸리티는 텍스트 파일을 조작 할 때 예측 가능하거나 의미있는 출력 만 생성합니다. 이러한 제한이있는 표준 유틸리티는 항상 STDIN 또는 INPUT FILES 섹션에 "텍스트 파일"을 지정합니다.

출처 : http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403

그러나 내가 명확하지 않은 몇 가지가 있습니다.

  1. 텍스트 파일이 일반 파일이어야합니까? 위의 발췌 부분에서 파일은 반드시 일반 파일이어야한다고 명시하지 않습니다

  2. 하나의 문자와 하나의 문자 만 포함하는 경우 파일을 텍스트 파일로 간주 할 수 있습니까 (즉, 줄 바꿈으로 끝나지 않는 단일 문자)? 나는이 질문이 이질적으로 들릴지 모르지만 "하나 이상의 문자"대신 "문자"라는 단어를 사용합니다. 다른 사람들은 동의하지 않을 수 있지만 "하나 이상의 문자"를 의미하는 경우 명시 적으로 말해야한다고 생각합니다

  3. 위의 발췌에서 "줄"을 참조합니다. 이름에 "Empty Line", "Display Line", "Incomplete Line"및 "Line"이라는 네 개의 정의가 있습니다. "빈", "디스플레이"및 "불완전"을 생략하여 "라인"을 의미한다고 추론해야합니까? 또는 위의 발췌에서 한 줄로 간주되는 것으로 정의 된 네 가지 정의가 모두 있습니까?

이 텍스트 블록 뒤에 나오는 모든 질문은 "문자"가 "하나 이상의 문자"를 의미한다고 추론하는 데 달려 있습니다.

  1. 파일이 비어 있으면 파일이 하나 이상의 문자를 포함하지 않기 때문에 텍스트 파일이 아니라고 유추 할 수 있습니까?

이 텍스트 블록 뒤에 나오는 모든 질문은 위의 발췌에서 줄이 "줄"로 정의되고 이름에 "줄"이 포함 된 다른 세 가지 정의는 제외되어야한다는 유추에 따라 다릅니다.

  1. "0 줄 이상"의 "0"은 줄 바꾸기로 끝나지 않은 하나 이상의 문자가 포함 된 파일이 여전히 텍스트 파일로 간주 될 수 있음을 의미합니까?

  2. "0 개 이상의 라인"은 단일 "라인"(0 개 이상의 문자와 종료 개행)이 작동하면 마지막 라인이 "불완전한 라인"(하나 이상의 비-라인)이되는 것이 불법임을 의미합니까? 파일 끝에 줄 바꿈 문자)?

  3. "[줄 바꿈 없음] 길이가 줄 바꿈 문자를 포함하여 {LINE_MAX} 바이트를 초과 할 수 없음"은 텍스트 파일의 지정된 "줄"에 허용되는 문자 수에 제한이 있음을 의미합니다. Ubuntu 18.04 및 FreeBSD 11.1의 LINE_MAX는 "2048"입니까?


좋은 질문입니다, 해롤드! 용어에 대한 훌륭한 토론을 만듭니다. 내가 질문 여분의 시간을 upvote에 수 소원
세르지 Kolodyazhnyy

답변:


23
  1. 텍스트 파일이 일반 파일이어야합니까? 위의 발췌 부분에서 파일은 반드시 일반 파일이어야한다고 명시하지 않습니다

    아니; 발췌문은 표준 입력을 잠재적 텍스트 파일로 구체적으로 언급합니다. 같은 다른 표준 유틸리티는 make, 특별히 사용 문자 특수 파일을 /dev/null 텍스트 파일로 .

  2. 하나의 문자와 하나의 문자 만 포함하는 경우 파일을 텍스트 파일로 간주 할 수 있습니까 (즉, 줄 바꿈으로 끝나지 않는 단일 문자)?

    해당 문자는 <newline>이어야합니다. 그렇지 않으면 이것은 line 이 아니므로 파일이 텍스트 파일이 아닙니다. 정확히 바이트 0A를 포함하는 파일은 한 줄짜리 텍스트 파일입니다. 빈 줄은 유효한 줄입니다.

  3. 위의 발췌에서 "줄"을 참조합니다. 이름에 "Empty Line", "Display Line", "Incomplete Line"및 "Line"이라는 네 개의 정의가 있습니다. "빈", "디스플레이"및 "불완전한"생략으로 인해 "라인"을 의미한다고 추론해야합니다.

    그것은 실제로 추론이 아니며 단지 그것이 말하는 것입니다. "line" 이라는 단어 는 상황에 맞는 정의를 받았으므로 그것이 말하는 것입니다.

  4. 파일이 비어 있으면 파일이 하나 이상의 문자를 포함하지 않기 때문에 텍스트 파일이 아니라고 유추 할 수 있습니까?

    빈 파일은 0 개 이상의 줄로 구성되어 텍스트 파일입니다.

  5. "0 줄 이상"의 "0"은 줄 바꾸기로 끝나지 않은 하나 이상의 문자가 포함 된 파일이 여전히 텍스트 파일로 간주 될 수 있음을 의미합니까?

    아니요, 이러한 문자는 줄로 구성되지 않습니다.

  6. "0 개 이상의 라인"은 단일 "라인"(0 개 이상의 문자와 종료 개행)이 작동하면 마지막 라인이 "불완전한 라인"(하나 이상의 비-라인)이되는 것이 불법임을 의미합니까? 파일 끝에 줄 바꿈 문자)?

    그것은 아니다 불법 그냥 텍스트 파일이 아니다. 텍스트 파일을 제공해야하는 유틸리티 해당 파일을 대신 제공하면 불리하게 작동 할 수 있습니다 .

  7. "[줄 없음] 길이가 줄 바꿈 문자를 포함하여 {LINE_MAX} 바이트를 초과 할 수 없음"은 텍스트 파일의 지정된 "줄"에 허용되는 문자 수에 제한이 있음을 의미합니다

    예.

이 정의는 텍스트 기반 유틸리티 ( grep :)가 확실히 받아 들일 항목에 대한 한계를 설정하려고합니다 . 그들은 또한 자유로이 사물을 더 자유롭게 받아 들일 수 있으며, 종종 실제로 실천합니다. 행을 처리하기 위해 고정 크기 버퍼를 사용하고, 새 행이 가득 찰 때까지 새 행이 나타나는 것으로 가정 할 수 있습니다. 내용을 너무 많이 읽고있을 수 있습니다.


1
포인트 2에 대해 확실합니까? 이 표준에는 " 0 개 이상의 라인"이 명시 적으로 명시되어 있습니다 . 따라서 printf "a" > file해당 정의에 따라 텍스트 파일을 작성합니다. 4에 대한 답변은 2와 5에 대한 답변과 모순되는 것처럼 보입니다 . 그렇지 않으면 touch file텍스트 파일 을 만드는 것이 좋습니다 printf "a" > file.
terdon

4
@ terdon : Michael의 대답에는 모순이 없습니다. 기본적으로 POSIX 텍스트 파일은 내용이 정규 표현식과 일치하는 파일 (.{0,M}\n)*(암시 적 앵커 및 양쪽 끝)이며 \n줄 바꿈과 .일치하며 줄 바꿈이 아닌 모든 문자 와 일치 M하며 숫자 값의 자리 표시 자입니다 LINE_MAX-1. 특히 이것은 빈 파일이 0 줄로 구성된 유효한 텍스트 파일이지만 비어 있지 않은 텍스트 파일은 줄 바꿈으로 끝나야 함을 의미합니다 (그렇지 않으면 불완전한 줄을 포함하고 불완전한 줄은 줄이 아님) ).
Ilmari Karonen

@Michael Homer 일반 파일과 관련하여 / dev / null 외에 다른 예가 있습니까? 하나 이상의 널 문자를 포함하므로 실제로 텍스트 파일이 아닙니다.
해롤드 피셔

1
@HaroldFischer /dev/null는 빈 파일입니다. 당신은 생각하고 /dev/zero있습니다.
Michael Homer

@HaroldFischer는 /dev/null읽을 때 데이터가없는 것처럼 비어있는 것으로 읽습니다. 비정규 파일을 고려하는 것이 이치에 맞지 않습니다. 많은 파일이 본질적으로 동적이기 때문입니다. 여기에는 기본적으로 다른 엔티티와 인터페이스를 전송하는 파이프, 소켓, char 장치가 포함됩니다. 정적 데이터 세트를 보유하지 않으므로 파일 의 속성 대신 전송 된 데이터의 속성을 고려하는 것이 더 합리적 입니다.
ilkkachu

7

POSIX에서 정의한대로 :

예, 텍스트 파일은 (기본적으로)

0 개 이상의 줄로 구성된 문자가 포함 된 파일입니다.

이 정의도 포함하는 것이 유용합니다.

3.92 문자열

첫 번째 null 바이트로 끝나고 포함 된 연속 된 문자 시퀀스입니다.

불완전한 라인

파일 끝에서 하나 이상의 <newline> 문자 시퀀스.

3.206 라인

0 개 이상의 비 <newline> 문자와 종료 <newline> 문자 순서.

3.243 줄 바꿈 문자 (<newline>)

출력 스트림에서 문자는 다음 행의 시작 부분에서 인쇄를 시작해야 함을 나타냅니다. C 언어에서 '\ n'으로 지정된 문자입니다. 이 문자가 다음 라인으로의 이동을 달성하기 위해 시스템에 의해 출력 장치로 전송 된 정확한 순서인지 여부는 지정되지 않습니다.

3.247 널

모든 비트가 0으로 설정된 문자.

"텍스트 파일" 은 NUL 바이트를 포함 하지 않아야 합니다.


그래서:

  1. 텍스트 파일이 일반 파일이어야합니까?
    아니요, 그럴 필요는 없습니다. "텍스트 파일"은 읽을 때 포함 된 내용으로 정의됩니다. 파일에 "0 줄 이상"이 포함되어 있으면 텍스트 파일입니다. 와 같은 일부 파일 /dev/stdin에는 한 번에 읽을 경우 다음에 읽을 때는 텍스트 파일이 없을 수 있습니다.
  2. 하나의 문자와 하나의 문자 만 포함하면 파일을 텍스트 파일로 간주 할 수 있습니까?
    아니요, 불완전한 줄입니다 (3.195).
    텍스트 파일에는 "불완전한 줄"만 있어야합니다.
  3. 나는 그들이 "라인"을 의미한다고 추론해야합니까…?
    그렇습니다.
  4. 파일이 비어 있으면 텍스트 파일이 아니라고 안전하게 추측 할 수 있습니까?
    아니요, 빈 파일 (0 자)은 유효한 "텍스트 파일"입니다.
    위 : ... 0 개 이상의 라인 ... . 제로 라인 (제로 문자)은 유효한 "텍스트 파일"입니다.
  5. … 개행 문자로 끝나지 않은 하나 이상의 문자가 포함 된 텍스트 파일로 간주됩니까?
    아니요, "불완전한 줄"은 (기술적으로) 유효한 "줄"이 아닙니다.
  6. "0 줄 이상"의 "0"은 줄 바꾸기로 끝나지 않은 하나 이상의 문자가 포함 된 파일이 여전히 텍스트 파일로 간주 될 수 있음을 의미합니까?
    불완전한 라인은 "라인"이 아닙니다. 텍스트 파일은해야 하지 불완전 라인을 가지고있다.

  7. … 텍스트 파일에서 주어진 "줄"에 허용되는 문자 수에는 제한이 있습니다.
    예, 유효한 "텍스트 파일"의 주어진 행에 {LINE_MAX} 바이트 (문자와 반대)를 초과 해서는 안됩니다.
    {LINE_MAX}의 값은 <limits.h> 파일에 제공됩니다
    ( C에서 감지 가능한 라인 버퍼 크기? ).

    {LINE_MAX}
    달리 명시되지 않는 한, 유틸리티가 텍스트 파일 처리로 설명 될 때 유틸리티 입력 행 (표준 입력 또는 다른 파일)의 최대 길이 (바이트)입니다. 길이는 후행을위한 공간을 포함합니다.
    허용되는 최소값 : {_POSIX2_LINE_MAX}

    GNU 기반 시스템의 경우 설정된 제한없습니다 (메모리 제외) .

    매크로 : int LINE_MAX
    텍스트 지향 POSIX.2 유틸리티가 지원할 수있는 가장 큰 텍스트 줄입니다. (이러한 유틸리티의 GNU 버전을 사용하는 경우 사용 가능한 가상 메모리에 의해 부과 된 것 외에는 실제 제한이 없지만 라이브러리가이를 알려줄 수있는 방법은 없습니다.)

    posix_lim.h2048 로 정의 된 것으로 보입니다 (적어도 64 비트 Linux GNU 시스템의 경우).

    $ grep -ri 'POSIX2_LINE_MAX' /usr/include/ 
    
    /usr/include/x86_64-linux-gnu/bits/xopen_lim.h:#define NL_LANGMAX       _POSIX2_LINE_MAX
    /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define _POSIX2_LINE_MAX                2048
    /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define LINE_MAX                _POSIX2_LINE_MAX
    

    POSIX 유틸리티 getconf를 사용하여 찾을 수도 있습니다 .

    $ getconf LINE_MAX
    2048
    

관련 : 왜 줄 바꿈을 가진 파일의 끝을 텍스트해야합니까?


2
이 답변은 대부분 정확하지만“텍스트 파일을 일반 파일이어야 함”에 대한 정답은 no 입니다. 모든 종류의 파일은 텍스트 파일 일 수 있으며, 내용의 문제이며, 파일 형식은 관련이 없습니다. 이 file유틸리티는 특수 파일에 대한 파일 유형 만보고하지만 유틸리티가 작동하는 방식 file - <…이거나 또는 (Linux) file -s …를 사용 하여 특수 파일의 파일 내용에 대한 휴리스틱을 확인합니다. 특수 파일은 파일을 열 때마다 다른 내용을 가질 수 있으므로 매번 텍스트 파일이거나 파일 일 수 있습니다. /dev/null내용은 항상 텍스트 파일이므로 항상 텍스트 파일입니다.
Gilles 'SO- 악마 그만해'

1
grep파일을 사용 하는 대신 getconf시스템 conf 값을 얻는 데 사용할 수 있습니다. 예를 들어 getconf LINE_MAX내 시스템 (Ubuntu 16.04)에서 2048 (바이트)을 반환합니다.
heemayl

변수가 정의 된 파일을 찾고 싶었으므로 grep이 필요했으며 작업을 신속하게 수행했습니다. 그러나 예, getconfconfig의 현재 값을 읽을 수 있습니다.
Isaac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.