본문 바로가기

DEVELOPER/Programming

[빌드] ./gradlew: /bin/sh^m: bad interpreter: no such file or directory 오류 발생 그리고 해결

반응형

안녕하세요😎 백엔드 개발자 제임스입니다 :)

오늘은 제가 프로젝트를 진행하던 도중 겪었던 에러와 이를 어떻게 해결 해결했는지 공유하도록 하겠습니다. 

상황은 AWS EC2의 인스턴스를 통해서 jar 서버를 배포하려던 중이었습니다. 우리 팀은 gradlew를 통해 build 하여 jar파일을 만들려고 했습니다. 하지만 ubuntu [Linux] 환경인 인스턴스에서 gradlew 파일을 찾지 못한다는 에러를 접하게 되었습니다. 전에 실습할 때는 겪어보지 못했던 문제여서 당황했습니다.

문제


./gradlew: /bin/sh^m: bad interpreter: no such file or directory

 

원인 분석


해당 문제는 운영체제 Linux에서 스크립트를 실행할 때 발생할 수 있는 에러입니다. 자세하게는 스크립트에 사용되는 개행문자가 달라서 발생하는 문제입니다. 가령 Window에서 개발 프로젝트 안에 스크립트 파일을 만든 뒤, Linux에서 실행한다면 문제가 발생합니다.

에러 메시지에 ^M은 줄바꿈을 의미하는 개행 문자입니다. 윈도우에서 스크립트가 작성되어 ^M 문자가 사용되었으나, Linux에서는 이를 읽지 못한 것입니다.

 

해결을 위한 고민


1) 중복으로 생성되어 있는 Server 경로

 

보다시피 프로젝트 폴더에 동일한 이름에 경로가 있습니다. 중요한 것은 server라는 이름인데요. 최상 경로의 Server는 Client 폴더와 구별하기 위한 이름이었습니다. 하나의 폴더 안에 Client와 Server 프로그램이 있기 때문에 이와 같이 이름을 작성했었습니다. 하위 경로의 server는 큰 이유 없이 경로 이름을 server라고 지정했습니다.

gradlew가 server라는 경로를 찾고 빌드한다는 내용을 어디선가 본 기억이 있습니다. 따라서 이것이 문제일까라고 생각했습니다. 그렇게 하위 경로의 server 이름을 api로 바꿨습니다. 하지만 gradlew를 찾을 수 없다는 에러는 해결하지 못했습니다.

2) gitignore 설정

다음은 (불필요한 파일은 원격으로 올리지 않기 위해 설정했던) gitignore에 중요한 경로까지 건드렸을지 의심했습니다. 따라서 gitignore에 작성된 내용을 모두 지우고, 다시 push 하여 배포를 진행했으나 문제를 해결하진 못했습니다.

3) 스크립트 안으로 들어가서 개행문자를 제거

다음은 타 블로그를 통해 알게된 방법입니다.

Linux 환경에 Ubuntu에서 vi라는 명령어를 작성하면 스크립트 안으로 들어갈 수 있습니다. 이때 -b 라는 명령어를 추가하여 바이너리 모드로 스크립트에 들어간다면, 조금 더 편하게 볼 수 있습니다.

vi -b /bin/sh

실행 결과..

키보드의 어떤 키 입력도 먹히지 않는 이상한 창이 열립니다... 어떠한 조작도 할 수 없어서 결국 해결하지 못했습니다.

 

해결


1) dos2unix 설치

AWS EC2 인스턴스와 연결된 Ubuntu에서 아래 명령어를 통해 dos2unix를 설치합니다.

dos2unix는 window 텍스트를 Linux의 텍스트 형태로 변환해주는 Linux util입니다.
sudo apt install dos2unix

2) 설치한 dos2unix를 통해서 gradlew 파일 format

이후 다시 빌드하면, 에러 없이 진행되는 것을 확인할 수 있습니다.

반응형