파일 끝에 Newline이 필요한 이유와 VSC로 해결하는 방법
No newline at end of file 이라고? newline 없는게 왜?🤷
Table Of Contents
0. 들어가기
GitHub에 파일을 푸시하면 한번씩 이런 경고 받지 않아?
No newline at end of file
해석해 보자면 "파일 끝에 newline이 없다"는 뜻이다.
해결법도 정말 간단하다. 파일 마지막에 newline이 없으니 새로 빈 줄을 하나 추가하면 된다.
그런데 왜 파일 마지막에 newline을 넣어야 하는걸까?
1. UNIX 정의
파일 마지막에 newline이 있어야 한다는 규칙은 Unix 표준에서부터 왔다고 한다.
정확한 서술은 못 찾았지만 다들 그렇게 말하더라고...
Unix란?
일단 Unix가 무엇인냐 하면, 운영 체제이다.
그리고 Linux, macOS처럼 현재 사용하는 대부분의 운영 체제는 Unix를 기반으로 만들어졌다.
Text File/Line이란?
서로 다른 Unix OS에서 공통된 API를 IEEE에서 정리한 표준을 POSIX(Portable Operating System Interface)이라고 하는데, POSIX docs에서 Text File의 정의를 찾을 수 있다.
3.403 Text File
A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the character. (후략)
3.403 Text File
문자들이 0개 이상의 행(line)으로 배열된 파일이다. 행은 NUL 문자를 포함하지 않고, 문자를 포함해 {LINE_MAX} 바이트를 넘을 수 없다. (후략)
즉, 텍스트 파일이란 0개 이상의 line으로 구성된 파일이다. Line의 정의는 이렇다.
3.206 Line A sequence of zero or more non-
<newline>
characters plus a terminating<newline>
character.
3.206 Line
<newline>
이 아닌 문자 0개 이상으로 이루어진 연속된 문자열과, 이들을 끝내는<newline>
문자이다.
참고로 빈 행(Empty LIne)에 대한 정의도 있다. 빈 행은 <newline>
하나만을 포함하는 행이다.
결국 파일이란 0개 이상의 행으로 이루어지는데, 이 행들은 모두 마지막에 <newline>
을 포함해야 하는 것이다.
2. newline
, 왜 필요한가?
그렇다면 왜 파일 끝에 <newline>
이 있어야 할까?
사실 이 문제에 대한 답은 나도 못 찾았다😭
대신에 <newline>
이 있으면 좋은 점을 소개하고자 한다.
Unix에서는 cat
, sed
, awk
같은 명령어를 이용해서 텍스트 파일을 다룰 수 있다. 만약 파일 마지막에 newline이 없다면, 이런 명령어들이 파일의 마지막 줄을 올바르게 처리하지 못한다.
예시
아래와 같은 test.txt 파일이 존재한다고 가정하자.
hello
cat
명령어를 통해 파일의 내용을 출력해보자.
$ cat test.txt test.txt hellohello
<newline>
이 없다면, 이렇게 파일이 어디에서 끝나는지 명확히 알기 어려워진다.
3. VSCode에서 자동으로 <newline>
추가하기
일일이 newline을 추가하는 것도 좋지만, vscode 설정을 통해 자동으로 newline을 넣어줄 수 있다.
이렇게 해당 옵션에 체크하면 저장할 때마다 파일 끝에 newline이 있는지 검사하고, 없다면 자동으로 newline이 추가된다!
setting.json
파일에 "files.insertFinalNewline": true
옵션을 추가하는 것도 동일한 효과를 얻을 수 있다.