^M: bad interpreter: No such file or directory

1 개요[ | ]

^M: bad interpreter: No such file or directory
^M: 불량 인터프리터: 그런 파일이나 디렉토리가 없습니다
  • 윈도우에서 작성한 스크립트를 리눅스에서 실행할 때 발생할 수 있는 오류
  • cat 명령어로 스크립트 내용을 봤을 때는 별다른 특이점이 발견되지 않는다.
  • 또한 bash/python/php 등의 명령어(인터프리터)로 실행할 때는 잘 실행된다.
문제는 리눅스 쉘에서 해쉬뱅 구문(#!)에 따라 인터프리터를 식별할 때 방해가 된다는 점이다.
  • 윈도우에서 사용하는 개행문자 ^M[1]을 제거하면 되는데...
  • 스크립트 파일을 저장할 때 개행문자를 UNIX 형식으로 지정한 후에 해야 한다.
  • 리눅스 쉘에서 바로 파일을 수정하려면 아래의 명령어를 실행하자.
sed -i 's/\r$//' 파일명

2 Bash 예시[ | ]

user01@localhost:~$ cat greet.sh 
#!/bin/bash
echo 'hello'
user01@localhost:~$ xxd greet.sh
00000000: 2321 2f62 696e 2f62 6173 680d 0a65 6368  #!/bin/bash..ech
00000010: 6f20 6865 6c6c 6f0d 0a                   o hello..
user01@localhost:~$ bash greet.sh
hello
user01@localhost:~$ ./greet.sh
-bash: ./greet.sh: /bin/bash^M: bad interpreter: No such file or directory
→ 오류 발생
user01@localhost:~$ sed -i 's/\r$//' greet.sh
user01@localhost:~$ ./greet.sh 
hello
→ 조치 후에는 잘 실행된다.
user01@localhost:~$ xxd greet.sh
00000000: 2321 2f62 696e 2f62 6173 680a 6563 686f  #!/bin/bash.echo
00000010: 2068 656c 6c6f 0a                         hello.
→ 0d(\r)가 제거되고 한바이트씩 당겨진 것

3 Python 예시[ | ]

uset01@localhost:~$ cat greet.py 
#!/usr/bin/python3
print('hello')
user01@localhost:~$ python greet.py 
hello
uset01@localhost:~$ ./greet.py 
-bash: ./greet.py: /usr/bin/python3^M: bad interpreter: No such file or directory
user01@localhost:~$ sed -i 's/\r$//' greet.py
user01@localhost:~$ ./greet.py
hello

4 같이 보기[ | ]

5 참고[ | ]

  1. 캐리지 리턴 = \r = 아스키 코드 13번 = 아스키 코드 0d(16)
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}