리눅스에서 쉡 스크립트를 실행하려고 하다보면 아래와 같은 에러가 발생하는 경우가 있다.
$'\r': command not found
스크립트를 열어보면 다른 특수문자나 오타는 없는데 이러한 에러가 나는 것이 이상했다. 검색해보니 윈도우와 리눅스에서 사용하는 개행문자와 관련된 형식의 차이로 발생하는 문제였다. 이와 관련해서 이 글에서 정리해본다.
1. CR + LF
CRLF 는 Carriage Return (CR) 과 Line Feed (LF) 두가지 단어를 합친 용어이다. 이 용어들은 예전 타자기에서 유래한 단어로 타자기에서 한 줄을 다 친 후 종이를 한 줄 간격만큼 올려주는 행위 (LF, Line Feed) 와 커서를 맨 앞으로 돌리는 행위 (Carriage Return) 에서 기반한 용어이다.
프로그래밍 언어에서 CR 은 '\r' 로 LF 는 우리가 잘 아는 개행문자인 '\n' 으로 사용된다.
2. CRLF vs LF
새로운 행으로 이동할 때, 과거의 타자기와 달리 프로그래밍 언어에서는 커서를 맨 앞으로 되돌릴 필요가 없다. 이때문에 Unix 기반 OS 들은 개행 문자로 LF (\n) 만을 사용한다. 반면에 Windows OS 는 전통적인 방식 그래도 CRLF (\r\n) 을 사용한다.
이때문에 윈도우에서 작성한 스크립트를 그대로 리눅스에서 사용하면 \r\n 중에서 \n 만 개행문자로 인식된다. 그렇다면 남은 \r 은 특정한 명령어로 인식되는데 이에 매핑되는 명령어가 없기 때문에 글의 서두와 같이 'command not found' 에러가 발생하는 것이다.
- 해결법
문제를 해결하는 방법은 간단하다. 의미없는 CR 문자인 '\r' 을 모두 제거하면 되는 것이다. 해결법은 크게 다음의 2가지가 있다.
1) sed 로 \r 치환
$ sed -i 's/\r$//' {파일명}
Linux 에서 위의 명령어를 사용하여 '\r' 문자를 모두 치환해주어 문제를 해결한다.
2) dos2unix
$ sudo apt-get install dos2unix
$ dos2unix {파일명}
Windows 에서 작성한 텍스트 파일을 Unix 기반에서 사용 가능 하도록 변환해주는 유틸 패키지를 사용하는 방법도 있다. dos2unix 를 설치 후, 변환하고자 하는 파일에 사용하면 대상 파일을 Unix 파일 포맷으로 변경해준다.
[Reference]
- https://m.blog.naver.com/taeil34/221325864981
CR(\r), LF(\n)이란 무엇인가?
프로그래밍을 하다 보면 문자열의 줄 내림을 위해서 \n을 쓰는 경우가 있을 것이다. 그런데 윈도우즈에서 ...
blog.naver.com
- https://hbcho-coding.tistory.com/5
$'\r': command not found 에러 해결법 (리눅스)
윈도우에서 스크립트를 작성하고 리눅스에 실행하면 아래와 같은 에려가 발생한다. $'\r': command not found 위 에러는 윈도우와 리눅스의 개행문자 (New line)가 달라서 생기는 문제이다. 윈도우에서는
hbcho-coding.tistory.com
'Computer Science > OS' 카테고리의 다른 글
[Linux] systemd, service, systemctl (0) | 2025.03.27 |
---|---|
[OS] Memory Management (0) | 2021.10.23 |
[OS] Thread & Multithreading (0) | 2021.10.22 |
[OS] Process Synchronization (0) | 2021.10.22 |
[OS] CPU scheduling (0) | 2021.10.21 |