경로도 맞고, 파일도 분명히 존재하는데 쉘 스크립트 실행 시 아래와 같은 오류가 발생하는 경우가 있다.
✅ 오류 상황
bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory
또는
test.sh: not found
✅ 1단계 : 실행 권한 확인
실행 권한 확인
ls -l FILE_NAME.sh
실행 권한 부여
chmod +x FILE_NAME.sh
# 권한 부여 전
-rw-r--r-- 1 user user 42 Apr 6 10:00 test.sh
# chmod +x 후
-rwxr-xr-x 1 user user 42 Apr 6 10:00 test.sh*
파일명 끝에 * 가 붙고, 권한 부분이 rwx 로 바뀌었다면 실행 권한이 정상적으로 부여된 것이다.
💡 * 표시는 "실행 가능한 파일" 이라는 의미이다. 터미널 설정에 따라 * 대신 초록색으로만 표시되는 경우도 있다.
실행 권한을 부여한 뒤 다시 실행해 보았으나, 동일한 오류가 발생하여 나는 2단계까지 진행하였다.
✅ 2단계 : Windows 개행 문자(CRLF) 확인
권한 문제가 아닌데도 not found 오류가 계속 난다면, Windows 환경에서 작성한 파일일 가능성이 높다.
Windows 메모장이나 일부 에디터에서 작성한 파일은 줄 끝에 ^M (CR, 캐리지리턴) 문자가 숨어 있다.
리눅스는 이 문자를 인식하지 못해 명령어를 찾지 못하는 오류를 발생시킨다.
🔍 확인 방법
cat -A FILE_NAME.sh | head
출력 결과에서 줄 끝에 ^M$ 이 보이면 바로 이 문제이다.
# 문제 있는 경우 (^M$ 로 끝남)
#!/bin/bash^M$
echo "hello"^M$
# 정상인 경우 ($ 로만 끝남)
#!/bin/bash$
echo "hello"$
🔧 해결 방법
방법 1. dos2unix 명령어 사용 (권장)
dos2unix FILE_NAME.sh
방법 2. dos2unix가 설치되지 않은 경우 sed 사용
sed -i 's/\r$//' FILE_NAME.sh
두 방법 모두 줄 끝에 붙어 있던 ^M(CR, 캐리지리턴) 문자를 제거해주며 $ 표시만 남음.
✔ 해결 후 확인
다시 cat -A 로 확인했을 때 줄 끝이 $ 로만 표시되면 정상적으로 변환된 것이다.
cat -A FILE_NAME.sh | head
#!/bin/bash$ ← 정상
echo "hello"$ ← 정상
이후 스크립트를 재실행하면 문제없이 동작한다! 🎉
💡 예방 팁
- VS Code 사용 시 우측 하단에서 CRLF → LF 로 변경 후 저장하면 이 문제를 사전에 방지할 수 있다.
- 리눅스 서버에서 직접 vi 또는 nano 로 작성하는 것이 가장 안전하다.
'Backend > Linux' 카테고리의 다른 글
| 리눅스 명령어 알아보자 - Crontab 편 (0) | 2026.04.06 |
|---|---|
| 리눅스 명령어로 현재 폴더 또는 특정 폴더의 파일 수 세기 (0) | 2026.04.04 |