윈도우와 리눅스, 맥 환경을 번갈아가면서 사용하다보면 줄바꿈 문자와 관련된 문제를 자주 접하게 된다. 예를 들어 윈도우에서 작성된 파이썬 스크립트를 github에 커밋해두고 리눅스나 맥에서 실행할 때 다음 에러를 보게 되는 경우가 있다.
/usr/bin/env: ‘python3\r’: No such file or directory
셔뱅으로 파이썬3를 지정해둔 첫 번째 라인을 읽다가 에러가 발생한다. python3 뒤에 \r 문자가 붙어 있는 것을 볼 수 있다.
윈도우에서는 줄바꿈을 캐리지 리턴(CR)과 라인피드(LF)를 함께 사용한다. 반면 유닉스 계열에서는 라인피드(LF)만 사용한다. 때문에 윈도우에서 작성된 텍스트 파일을 유닉스 계열의 운영체제에서 열어볼 경우 캐리지 리턴 문자가 이상하게 표시되거나 일반 문자처럼 해석된다.
이 경우도 캐리지 리턴 문자인 \r 문자를 파이썬 스크립트 셔뱅에서 사용하는 바이너리 이름의 일부로 해석해서 발생하는 문제다.
해결방법 - git 설정
문제를 해결하는 가장 좋은 방법은 git에 커밋하고 push 할 때 일관된 형태로 코드를 저장하는 것이다. git 설정 중 core.eol 설정과 core.autocrlf 설정을 해서 일관된 라인 종료 문자로 관리하는게 가장 좋다.
해결방법 - dos2unix, unix2dos
\r 문자가 살아있는 파일을 유닉스 계열에서 제대로 해석하기 위해서는 라인 종료 문자로 사용된 캐리지 리턴 문자를 지워줘야 한다. 텍스트 파일이 작다면 큰 문제는 없지만 긴 스크립트 파일인 경우 번거롭다. 이럴 때 쓰라고 만들어 둔 명령이 dos2unix다. (반대의 경우 unix2dos)
dos2unix 명령을 사용하려면 일단 설치해야한다.
$ apt install dos2unix
$ brew install dos2unix
$ yum install dos2unix
패키지 관리자로 쉽게 설치 할 수 있다.
dos2unix 명령의 옵션은 다음과 같다.
옵션 | 설명 |
-h, --help | 도움말 출력 |
-k, --keepdate | 출력 파일의 날짜 정보를 입력 파일과 동일하게 유지 |
-q, --quiet | 경고 메시지를 표시하지 않음 |
-V | 버전 정보를 표시 |
-c, --convmode <mode> | 변환 모드 설정 (SunOS에서 dos2unix를 시뮬레이션) (모드 : ASCII, 7bit, ISO, Mac, default to ASCII) |
-o, --oldfile <files> | 이전 파일 모드. 입력 파일에 결과를 씀 |
-n, --newfile <inFile> <outFile> | 새 파일 모드, 입력 파일의 내용을 변환해서 출력 파일로 씀 |
사용법은 간단히 변환할 파일을 인자로 주면 된다.
댓글