태그 보관물: 개행문자

^M 개행문자로 인한 Shell Script 오류

개요

Windows 환경에서 작성하거나 FTP(Binary 모드)로 전송한 Shell Script를 Linux에서 실행할 때 ^M 개행문자 오류(bad interpreter)가 발생하는 경우가 있습니다. Windows의 줄바꿈 문자는 CRLF(\r\n), Linux는 LF(\n)이며, 변환 없이 전송하면 각 줄 끝에 \r(^M)이 남아 인터프리터 경로가 깨집니다. vim 치환 기능이나 sed 명령으로 간단하게 해결할 수 있습니다.

증상 — Shell Script bad interpreter error

Shell Script를 Linux 환경에서 실행하면 아래와 같이 /bin/bash^M: bad interpreter 에러가 발생합니다.

[root@localhost ~]# ./temp.sh
-bash: ./temp.sh: /bin/bash^M: bad interpreter: No such file or directory

원인 — CRLF vs LF 개행문자 차이

결론적으로 Windows와 Linux의 개행문자 차이로 인해 발생합니다. Binary 타입으로 Windows 에디터에서 저장하거나 FTP로 전송하면 Windows 개행문자 ”
“이 Linux의 ”
“으로 변환되지 않아 각 줄 끝에
(^M)이 남습니다.

LF : Line Feed 커서를 한칸 아래로 이동 = 새로운 행 추가(new line feed)
CR : Carriage Return 커서를 맨왼쪽으로 이동 = 시작위치로 복귀(return)

vim -b(Binary 모드)로 파일을 열면 줄 끝의 ^M 문자를 직접 확인할 수 있습니다.

[root@localhost ~]# vim -b temp.sh

!/bin/bash^M
^M
ls -lh^M

해결 방법

단순히 ^M만 삭제해도 해결되지만 수백 줄 이상의 스크립트에서는 vim 치환 기능이나 sed 명령을 사용합니다. 개행문자 ^M은 “Shift+6”, “Shift+m”이 아닌 “Ctrl+v+m”으로 입력해야 합니다.

방법 1: vim -b 모드에서 :%s 치환 사용

[root@localhost ~]# vim -b temp.sh

:%s/^M//g

방법 2: vim Last Line Mode에서 fileformat 설정 후 저장

[root@localhost ~]# vim temp.sh

:set fileformat=unix
:wq

방법 3: sed 명령 사용 (vim을 사용하기 어려운 환경)

[root@localhost ~]# sed -i -e 's/
$//' temp.sh

# 또는 (^M은 Ctrl+v+m 입력)
[root@localhost ~]# sed -i -e 's/^M$//' temp.sh

dos2unix 유틸리티 사용

vim이나 sed 대신 dos2unix 유틸리티를 사용하면 CRLF → LF 변환을 가장 간단하게 처리할 수 있습니다. 대부분의 리눅스 배포판에서 패키지로 제공되며, 여러 파일을 한 번에 처리하거나 디렉토리 전체를 변환하는 데 유리합니다.

# 설치 (RHEL/CentOS)
yum install dos2unix -y

# 단일 파일 변환 (CRLF → LF)
dos2unix temp.sh

# 여러 파일 일괄 변환
dos2unix *.sh

# 변환 전 파일 타입 확인
file temp.sh
# "ASCII text, with CRLF line terminators" — 변환 필요
# "ASCII text" — 이미 LF, 변환 불필요

반대로 Linux 파일을 Windows 형식(LF → CRLF)으로 변환할 때는 unix2dos 명령을 사용합니다. Git을 사용하는 환경이라면 .gitattributes 파일에 * text=auto를 설정하여 체크아웃 시 자동으로 개행문자를 변환할 수 있습니다.

사전 예방

저장하거나 전송할 때 미리 파일 포맷(Unix LF)을 선택하면 이 문제를 예방할 수 있습니다. Notepad++나 VS Code 같은 Windows 에디터에서 줄바꿈 형식을 LF로 설정하거나, FTP 클라이언트에서 ASCII 모드로 전송하면 자동 변환됩니다.

참고

참고 문서: sed(1) Linux man page · Vim 검색·치환 명령어 문서