본문 바로가기

서버 등 운영체제(OS)/Linux

-bash: ./test.sh: /bin/bash^M: bad interpreter: 그런 파일이나 디렉토리가 없음

반응형

-bash: ./test.sh: /bin/bash^M: bad interpreter: 그런 파일이나 디렉토리가 없음


실제로 리눅스에서 웹호스팅을 사용하시다 보면,  윈도우에서 에디터플러스와 같은 편집기를
사용해서 파일을 업로드 한뒤, 리눅스로 SSH 나 Telnet 으로 접근을 해서 vi 같은 편집기로 열어
보시면 라인의 마지막에 항상 ^M 가 붙어 나오는 현상을 보실수 있을겁니다. 이는 리눅스와 윈도우
의 파일을 저장하는 형식이 달라서 생기는 현상입니다.

물론, 실제로 웹서비스를 하는데 큰 영향은 가지는 않는경우가 대부분입니다.

하지만, 예를 들어, 윈도우에서 작성을 한 Perl, Bash, Python 등의 스크립트인 경우 쉘에서 직접
실행할 경우도 존재합니다. 이때에는 파일형식이 윈도우이기때문에 실행이 되지 않습니다.

아래의 예처럼 ^M 문자 때문에 bad interpreter 라는 오류가 나오게 됩니다.
-bash: ./test.sh: /bin/bash^M: bad interpreter: 그런 파일이나 디렉토리가 없음

이때에 이 문제를 해결하실수 있는 몇가지 방법을 제시하도록 하겠습니다.


ㅁ 텍스트문에서 ^M자 없애기    

  1. vi 에서 ( vim 아닙니다. )
     명령어 모드
     :%s/^M//g

     %s는 치환명령 입니다
     %s///mode

     위에서 mode에 g를 썼는데, 이것은 global의 약자로 파일 전체에 모두 적용하는 mode 입니다.

     :%s/^M 만 해도 됩니다.
     ^M 은 Ctrl+V+M or Ctrl+V+Enter

  2. vim 에서
     vim에서는 dos mode의 화일을 읽어도 화면에 ^M을 표시하지 않습니다.
     대신 밑에 [dos] 라고 나타납니다.
     다음과 같이 해서 unix mode로.. 즉 ^M을 빼는것입니다.

     :set fileformat=unix

     반대로 unix mode에서 dos mode로 바꾸고 싶다면

     :set fileformat=dos


  3. cat과 tr 사용
     cat은 파일의 내용을 stdout 으로 출력하고, tr은 특정 캐릭터를 바꾸거나 없애는것입니다.
    
     예를 들어 file1.txt 가 dos mode 라면

     # cat file1.txt | tr -d ^M > file2.txt

     이렇게 하면 ^M만 제거된 새로운 file2.txt가 생깁니다.
     이때 주의할 것은 절대로 위의 두 화일명을 같게 하면 안된다는 것입니다.

  4. dos2unix
      dos2unix 명령어는 위의 1,2,3 과 동일한 역할을 하지만, 단순한 명령도구 입니다.

      아래는 윈도우 파일 형식을 유닉스(리눅스) 형식으로 변환하는 명령입니다.
      [root@www ~]# dos2unix file1.txt
      dos2unix: converting file file1.txt to UNIX format ...

      반대로 아래와 같이 유닉스(리눅스) 형식의 파일을 윈도우 형식으로 변환 또한 가능합니다.
      [root@www ~]# unix2dos file1.txt
      unix2dos: converting file file1.txt to DOS format ...

 

출처:http://mydoc.digimoon.net/board/skin/ggambo7002_board/print.php?id=board&no=228

반응형