본문 바로가기
CS

[CS] CRLF vs LF

by dong_seok 2024. 2. 20.
1. 사건 개요
2. 운영체제별 개행 표현
3. 해결 및 느낀점

1. 사건 개요

프로젝트를 깃랩에서 가져와 VSCode에 클론한 후 도커를 사용하여 이미지를 빌드하고 컨테이너를 생성하여 실행하는 과정에서 문제가 발생했습니다. 이미지와 컨테이너는 build 및 create 명령을 사용하여 성공적으로 생성되었지만, 컨테이너를 실행하면 잠시 실행된 후 Exited(1) 상태가 되며 즉시 종료되었습니다.

 
 

 

이유가 궁금해 Logs를 확인해 보니 "exec ./run.sh: no such file or directory" 라는 문구가 있었습니다.

 

(1주일 전에도 시도했지만 오류를 못찾아서 중도포기하고 다른거하다가 재도전 하였습니다...)

 

오류 메시지 자체는 "run.sh" 파일을 찾을 수 없다는 것으로 해석이 간단했지만, 문제는 그 원인을 파악할 수 없다는 점이었습니다. 그러다 오늘 바로 원인을 찾았습니다. 바로 잘못된 개행 표현 때문이었습니다. 자세한 설명에 앞서 운영체제별 개행 표현에 대해 간략하게 말씀드리도록 하겠습니다.

 

2. 운영체제별 개행 표현

1) 윈도우의 개행(CRLF)

윈도우의 개행 표현방식은 CRLF 입니다. 왼쪽 끝으로 밀어 주는 Carriage Return ( \r ) 과 아래 줄로 이동 하는 Line Feed( \n ) 방식을 합하여 표현했다고 말할 수 있습니다.

 

2) Unix/Mac의 개행(LF)

Unix 기반 운영체제는 윈도우와 달리  Line Feed( \n )만 사용하여 개행을 표현합니다. 

 

바로 이 차이 때문에 생긴 문제였습니다. 제가 깃랩에서 가져온 코드는 Unix 기반 환경에서 작성된 코드였는데 윈도우 데스크톱에서 사용하려니 계속 문제가 생긴 것이었습니다. LF로만 작성된 개행을 CRLF로 읽으면 프로그램이 줄 바꿈을 올바르게 인식하지 못하거나 잘못된 줄 바꿈을 감지하여 파일의 내용이 잘못된 위치에서 끊겨 보일 수 있습니다. 그래서 "run.sh"파일을 찾을 수 없다고 로그가 찍힌 것이었습니다.

 

3. 해결 및 느낀점

VSCode의 경우 사용자에게 표시되지는 않지만, 코드 파일일 저장될 때 줄이 바뀌어야할 곳에 CR, LF, CRLF 를 삽입해 저장합니다. 위에서 말했듯 운영체제에 따라 기본값이 다른데, VSCode는 운영체제 기본값을 따릅니다. 따라서 제 VSCode는 개행표현이 CSLF 방식이었고 이를 LF 방식으로 변경하니 컨테이너가 정상적으로 실행되었습니다. 원인이 간단해서 해결방안을 찾으려는 노력이 조금 허무했지만, 이 경험을 통해 협업을 하면서 개발 환경의 통일이 얼마나 중요한지 다시 한번 깨닫게 되었습니다.

 

참고자료

https://velog.io/@junho5336/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%B3%84-%EA%B0%9C%ED%96%89-%ED%91%9C%ED%98%84%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC-CR-LF#crlf%EC%9D%98-%EC%9C%A0%EB%9E%98

https://blog.naver.com/parosaone/222226392378

'CS' 카테고리의 다른 글

[CS] gensim ImportError  (0) 2024.05.03

댓글