Linux에 CRLF 개행 문제가 있습니까?

Linux에 CRLF 개행 문제가 있습니까?

저는 이 문제에 대해 항상 팀원들과 토론합니다. 개발에서는 Windows(CRLF)를 사용하고 서버에서는 Linux(LF)를 사용합니다.

Linux에서 CRLF 개행 문자가 포함된 파일을 보면 문제가 있습니까? Git이 이 상황을 파일을 통해 처리해야 할까요 .gitattributes?

답변1

대부분의 경우 서버에 파일을 업로드할 때 Linux 커널 자체는 줄 끝을 모르거나 신경 쓰지 않습니다. 비록무루 노트CRLF는 엉망이 될 것이다셰르본.

그러나 Linux에는 텍스트 파일의 모든 줄이 단일 LF로 끝나는 관례가 있습니다. 많은 도구가 CR을 읽고 이를 다른 도구처럼 취급합니다.일반 문자(a, b, c,...). 이것은에서 비롯됩니다텍스트 파일의 POSIX 정의.

이것할 수 있는쉘 스크립트(sh, bash, zsh, ksh...)와 같은 일부 언어에서 문제를 일으킵니다. 운이 좋다면, 가짜 추가 매개변수로 인해 구문 오류가 발생하여 스크립트가 실패할 것입니다. 그러나 나쁜 경우에는 파일 내용과 파일 이름이 손상될 수 있습니다.

이는 주로 Linux/Unix에서만 실행되도록 설계된 도구 및 언어의 문제입니다. 플랫폼 독립적인 많은 언어와 도구가 자동으로 적응됩니다. 따라서 문제가 발생할 가능성이 적습니다.통합 개발 환경, 또는 코드 편집기.


따라서 동료와의 논쟁을 끝내기 위해 Linux에서는 CRLF 라인 엔딩에 문제가 없습니다. 하지만특정 도구와 언어는 그대로 두면 숨이 막히거나 이상한 일을 할 수 있습니다.

Linux/Unix 플랫폼에서 실행할 코드를 작성하는 경우 일반적으로 LF 줄 끝만 남기고 CR 문자를 제거하도록 git을 구성하는 것이 더 쉽습니다.

답변2

일반적으로 POSIX는 텍스트 파일을 줄이 LF로 끝나는 파일로 정의합니다. 따라서 대부분의 POSIX 유틸리티는 CRLF를 일반 문자로 처리되는 CR로 끝나는 일반 라인으로 끝나는 라인으로 처리합니다.

이것이 허용되는지 여부는 귀하의 필요에 따라 다릅니다. 예를 들어 wc단어 수를 계산할 때 CR에 크게 신경 쓰지 않을 수 있으며, 특정 필드를 사용하거나 cut선택 awk하면 예상하지 못한 CR이 출력될 수도 있습니다. 다른 사람들이 지적했듯이 대부분의 POSIX 호환 쉘(Windows에서도)은 CR을 좋아하지 않으며 단순히 구문 오류 처리를 거부합니다.

플랫폼에 관계없이 대부분의 텍스트 편집기는 CRLF 및 LF 끝을 처리할 수 있으며 일부는 이전 MacOS(예: MacOS 9 이하) CR 줄 끝도 처리할 수 있습니다. 따라서 어떤 줄 끝을 사용해야 하는지는 개인 취향, 사용 중인 플랫폼, 사용 중인 도구에 따라 크게 달라집니다.

Git을 사용하는 경우 가장 좋은 방법은 Git에게 특정 파일이 텍스트 파일임을 알리는 것입니다(즉, 줄 끝을 변환해야 함). 이렇게 하면 Git이 LF로 끝나는 파일을 내부적으로 저장한 다음 필요한 경우 체크아웃 시 변환합니다. .gitattributes저장소의 파일 에 다음과 같은 내용을 추가하면 됩니다 .

*.c text
*.h text
*.sh text eol=lf
*.ps1 text eol=crlf
*.jpg -text

이는 .c파일이 .h텍스트이고, 사용자가 구성한 설정에 따라 줄 끝으로 체크아웃할 수 있으며, LF 끝으로 저장소에 기록되도록 지정합니다. .sh저장소와 작업 트리 모두 파일에 대해 LF 엔딩을 갖고, 저장소 .ps1에는 파일에 대해 LF 엔딩을 가지며, 작업 트리는 플랫폼에 관계없이 항상 CRLF 엔딩을 갖습니다. .jpg파일은 줄 끝 변환을 전혀 거치지 않습니다.

각 파일 유형을 지정하지 않으려면 다음과 같이 간단히 작성할 수 있습니다.

* text=auto

Git은 자동으로 올바른 일을 하려고 노력할 것입니다.

답변3

Linux 애플리케이션 및 애플리케이션 라이브러리최대CRLF(MS-DOS, Windows) 또는 LF(Unix, Linux) 를 포함한 모든 유형의 개행을 원활하게 처리합니다 . 아무것도 변경하거나 지정할 필요가 없습니다. 오래된권위 있는애플 시스템(아니요최신 MacOS X)은 CR이러한 파일을 사용하면 올바르게 처리되지 않습니다(모든 것이 한 줄로 표시됩니다).

경우에 따라 문제가 발생할 수 있지만 CR사례별로 문제를 해결할 수 있습니다.

$ wc -l /tmp/test-*
 2 /tmp/test-dos.txt
 0 /tmp/test-mac.txt
 2 /tmp/test-unix.txt
 4 total

CR 삭제 도구는 다음과 같습니다 dos2unix.

tr -d '\r' < input > output

또는sed

sed -i 's/\r$//g' file

관련 정보