파일 끝에 줄 바꿈을 추가하는 것이 아니라 거기에 있어야하는 줄 바꿈을 제거하지 않는 것입니다.
텍스트 파일 , 유닉스에서의 일련의 구성 라인 로 끝나는, 각각의 개행 문자 ( \n
). 비어 있지 않고 개행 문자로 끝나지 않는 파일은 텍스트 파일이 아닙니다.
텍스트 파일에서 작동해야하는 유틸리티는 줄 바꿈으로 끝나지 않는 파일에는 잘 맞지 않을 수 있습니다. 예를 들어 역사적 유닉스 유틸리티는 마지막 개행 이후의 텍스트를 무시할 수 있습니다. GNU 유틸리티는 텍스트가 아닌 파일과 함께 동작하는 정책을 가지고 있으며, 대부분의 다른 최신 유틸리티도 마찬가지입니다. 그러나 최종 줄 바꿈이없는 파일에는 여전히 이상한 동작이 발생할 수 있습니다 ¹.
GNU diff를 사용하면 비교할 파일 중 하나가 줄 바꿈으로 끝나고 다른 줄은 끝나지 않으면주의해야합니다. diff는 행 지향적이므로 파일 중 하나의 줄 바꿈을 저장하여 다른 줄이 아닌 줄 바꿈을 저장하여이를 나타낼 수는 없습니다 . diff 파일의 각 줄 이 시작하고 끝나는 위치를 나타내는 데 줄 바꿈이 필요합니다 . 따라서 diff는이 특수 텍스트 \ No newline at end of file
를 사용 하여 줄 바꿈으로 끝나지 않은 파일을 수행 한 파일과 구별합니다.
그건 그렇고, C 컨텍스트에서 소스 파일은 유사하게 일련의 라인으로 구성됩니다. 더 정확하게 말하면, 번역 단위는 구현 정의에서 일련의 행으로 볼 수 있으며 각 행은 개행 문자 ( n1256 §5.1.1.1)로 끝나야합니다. 유닉스 시스템에서는 매핑이 간단합니다. DOS 및 Windows에서 각 CR LF 시퀀스 ( \r\n
)는 줄 바꿈에 매핑됩니다 ( \n
;이 OS에서 텍스트로 열린 파일을 읽을 때 항상 발생 함). 개행 문자가 없지만 고정 또는 가변 크기의 레코드가있는 몇 가지 OS가 있습니다. 이러한 시스템에서 파일에서 C 소스로의 맵핑은\n
각 레코드의 끝에서. 이것은 유닉스와 직접 관련이 없지만 마지막 줄 바꿈이없는 C 소스 파일을 레코드 기반 텍스트 파일이있는 시스템에 복사 한 다음 다시 복사하면 불완전하게 끝날 것입니다 초기 변환에서 마지막 줄이 잘 리거나 역 변환 중에 줄 바꿈이 추가되었습니다.
¹
예 : GNU 정렬의 출력은 항상 줄 바꿈으로 끝납니다. 따라서 파일 foo
에 마지막 줄 바꿈이 없으면 . sort foo | wc -c
보다 문자가 하나 더보고 cat foo | wc -c
됩니다.