일부 컴파일러(특히 C 또는 C++ 컴파일러)에서는 다음과 같은 경고를 표시합니다.
No new line at end of file
나는 이것이 단지 C 프로그래머의 문제라고 생각했지만 github은 커밋 보기에 다음 메시지를 표시합니다.
\ No newline at end of file
PHP 파일의 경우.
전처리기 설명을 이해했습니다.이 스레드, 그러나 이것이 PHP와 어떤 관련이 있습니까? 동일한 것입니까 아니면 vs 테마와 관련이 있습니까 include()
?\r\n
\n
파일 끝에 새 줄을 추가하는 이유는 무엇입니까?
답변1
이것은 파일 끝에 추가 줄바꿈을 추가하는 것이 아니라 거기에 있어야 하는 줄바꿈을 제거하는 것이 아닙니다.
ㅏ텍스트 파일유닉스에서는 다음과 같은 일련의 요소로 구성됩니다.철사, 각각개행 문자( \n
). 따라서 비어 있지 않고 개행 문자로 끝나지 않는 파일은 텍스트 파일이 아닙니다.
텍스트 파일에서 작동해야 하는 유틸리티는 개행 문자로 끝나지 않는 파일을 잘 처리하지 못할 수 있습니다. 예를 들어, 과거 Unix 유틸리티는 마지막 개행 문자 뒤의 텍스트를 무시할 수 있습니다.암소 비슷한 일종의 영양이 유틸리티에는 대부분의 다른 최신 유틸리티와 마찬가지로 텍스트가 아닌 파일과 잘 작동하는 정책이 있지만 최종 개행 문자가 누락된 파일에서는 여전히 이상한 동작이 발생할 수 있습니다.
GNU diff를 사용하면 비교되는 파일 중 하나가 줄 바꿈 문자로 끝나고 다른 파일은 그렇지 않은 경우 이 사실에 주의하세요. diff는 줄 지향이므로 파일 중 하나에 개행 문자를 저장하고 다른 파일에는 개행 문자를 저장하여 이를 나타낼 수 없습니다. 개행 문자는 각 줄의 위치를 나타내야 합니다.diff 파일에시작과 끝. 따라서 diff는 이 특수 텍스트를 사용하여 \ No newline at end of file
줄바꿈으로 끝나지 않는 파일과 끝나는 파일을 구별합니다.
그런데 C 컨텍스트에서는 소스 파일도 일련의 행으로 구성됩니다. 보다 정확하게는 번역 단위는 구현 시 일련의 줄로 정의되며, 각 줄은 개행 문자(n1256§5.1.1.1). UNIX 시스템에서는 매핑이 간단합니다. DOS 및 Windows에서 각 CR LF 시퀀스( \r\n
)는 개행 문자에 매핑됩니다( \n
이 운영 체제에서 텍스트로 열린 파일을 읽을 때 항상 발생하는 현상). 일부 운영 체제에는 개행 문자가 없지만 고정 또는 가변 크기 레코드가 있습니다. 이러한 시스템에서는 파일에서 C 소스 코드로의 매핑이 \n
각 레코드 끝에 도입됩니다. 이는 유닉스와 직접적인 관련이 없지만, 마지막 개행 문자가 누락된 C 소스 파일을 레코드 기반 텍스트 파일이 있는 시스템에 복사한 다음 다시 복사하면 다음과 같은 오류가 발생한다는 의미입니다. 불완전한 결과. 초기 변환 중에 줄이 잘렸거나 역방향 변환 중에 추가 줄 바꿈이 추가되었습니다.
1예
: 비어 있지 않은 파일의 GNU 출력은 sort
항상 줄바꿈으로 끝납니다. 따라서 파일에 마지막 개행 문자가 없으면 보고서가 내장 반환에 필요한 .need 보다 작다는 foo
것을 알게 됩니다.sort foo | wc -c
cat foo | wc -c
read
sh
잘못된줄 끝에 도달하기 전에 파일 끝에 도달하면 while IFS= read -r line; do ...; done
종료되지 않은 줄을 완전히 건너뛰는 것과 같은 루프가 발생합니다.
답변2
반드시 원인은 아니지만 파일이 새 줄로 끝나지 않는 실제 결과는 다음과 같습니다.
를 사용하려면 다음을 고려하십시오 . 예를 들어 3개 파일의 줄 시작 부분에서 단어를 찾으 cat
려면 다음을 수행하십시오 .foo
cat file1 file2 file3 | grep -e '^foo'
file3의 첫 번째 줄이 다음으로 시작 foo
하지만 file2가 마지막 줄 다음에 끝나지 않는 경우 \n
grep은 file2의 마지막 줄과 file3의 첫 번째 줄을 단일 줄로 처리하기 때문에 이 경우를 찾지 못합니다.
그래서 일관성을 유지하고 놀라움을 피하기 위해 파일이 항상 새 줄로 끝나도록 노력합니다.
답변3
두 가지 측면이 있습니다.
일부 C 컴파일러는 줄 바꿈 문자로 끝나지 않는 마지막 줄을 구문 분석할 수 없습니다. C 표준은 C 파일이 줄 바꿈(C11, 5.1.1.2, 2.)으로 끝나야 하고 줄 바꿈이 없는 마지막 줄은 정의되지 않은 동작(C11, J.2, 항목 2)을 생성하도록 지정합니다. 아마도 역사적인 이유 때문일 것입니다. 첫 번째 표준이 작성되었을 때 그러한 컴파일러의 일부 공급업체가 위원회의 회원이었기 때문입니다. 따라서 GCC의 경고입니다.
diff
프로그램(github 등에서 사용되는 프로그램git diff
)은 파일 간의 차이점을 한 줄씩 표시합니다. 일반적으로 하나의 파일만 개행 문자로 끝나는 경우 메시지를 인쇄합니다. 그렇지 않으면 차이점을 볼 수 없습니다. 예를 들어, 두 파일 사이의 유일한 차이점이 메시지를 표시하지 않고 마지막 개행 문자가 있다는 것이라면 두 파일은 파일의 성공 및 체크섬과 같지 않은 종료 코드를 반환할 때 동일한 것으로 나타납니다(diff
예 :cmp
통과md5sum
)가 일치하지 않습니다.
답변4
diff 기록을 유지하는 것도 중요합니다. 파일 끝에 줄 바꿈 문자가 없으면 파일 끝에 추가된 모든 내용은 diff 유틸리티에서 마지막 줄을 변경하는 것으로 처리됩니다( \n
추가되고 있기 때문입니다).
git blame
이로 인해 및 등의 명령이 원치 않는 결과를 생성할 수 있습니다 hg annotate
.