하드웨어 엄마, 소프트웨어 아빠 🛠️💻

[linux] #/bin/bash^M: bad interpreter: No such file or directory 본문

💻 3.앤디라이언의 소프트웨어 (IT재테크)/개발 이야기

[linux] #/bin/bash^M: bad interpreter: No such file or directory

카페이나 (ft. ANDYLION) 2023. 9. 7. 15:45
728x90
반응형

 

개발을 하다 보면 알지 못하던 다양한 문제를 마주하게 된다.

어찌 보면 그 다양한 원인을 해결해 가는 것을 좋아하는 사람들이 개발자가 되는 것이 일반적이다.

이과생들의 특징이 답이 정해져 있는 문제를 풀어가는 과정을 즐기는 것이 아니겠는가?

 

윈도우 환경에서 코드를 작성하고 그것을 리눅스 환경에서 실행하려고 할 때

"^M: bad interpreter: No such file or directory"와 같은 문제가 발생한다.

윈도우에서 사용한 개행 문자가 리눅스에서는 인식되지 못해 발생하는 것이 원인이다.

 

그럼 이 문제는 어떻게 해결할 수 있을까?

 

다양한 방법이 있고, 리눅스 역시 ubuntu / fedora / CentOS 등 다양하기 때문에 모두 같은 방법으로 해결되지 않는다.

그럼 다양한 해결 방법에 대해 하나씩 알아가 보자.

1. vi/vim을 사용하여 ^M 삭제하기

가장 단순하면서 쉬운 방법이다.

  • vi or vim -b [file_name] 
  • 파일을 열었다면 아래와 같이 개행문자들을 볼 수 있다. ^M을 모두 직접 제거한다.
$ vi -b test.sh

#!/bin/bash^M
^M
function_android_func() {^M
          wget -O ${DDK_ROOT_DIR}/local/sdk/sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip^M
          wget -O ${DDK_ROOT_DIR}/local/sdk/android-ndk-linux.zip https://dl.google.com/android/repository/android-ndk-r25-linux.zip^M
          pushd ${DDK_ROOT_DIR}/local/sdk^M
          unzip sdk-tools-linux.zip^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-33" "build-tools;33.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-31" "build-tools;31.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-30" "build-tools;30.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-29" "build-tools;29.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-28" "build-tools;28.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-27" "build-tools;27.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-26" "build-tools;26.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-25" "build-tools;25.0.0"^M
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} platform-tools^M
}^M

 

2. sed 명령어를 사용하여 개행문자 삭제하기

  • sed -i 's/\r$//' [file_name]
  • 아래와 같이 개행문자가 모두 삭제된 것을 확인할 수 있다.
$ sed -i 's/\r$//' test.sh

$ vi -b test.sh
#!/bin/bash

function_android_func() {
          wget -O ${DDK_ROOT_DIR}/local/sdk/sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip
          wget -O ${DDK_ROOT_DIR}/local/sdk/android-ndk-linux.zip https://dl.google.com/android/repository/android-ndk-r25-linux.zip
          pushd ${DDK_ROOT_DIR}/local/sdk
          unzip sdk-tools-linux.zip
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-33" "build-tools;33.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-31" "build-tools;31.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-30" "build-tools;30.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-29" "build-tools;29.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-28" "build-tools;28.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-27" "build-tools;27.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-26" "build-tools;26.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} "platforms;android-25" "build-tools;25.0.0"
          cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK} platform-tools
}

 

3. In vi [file_name], fileformat 설정하기

  • vi [file_name]
  • :set fileformat=unix
  • wq

 

4. 마지막으로 fedora환경에서는 동작하지 않지만 ubuntu 사용자라면 가능한 설정 방법입니다.

  • vi [file_name]
  • :%s/^M//g
  • wq

 

예전에 비해 많이 한가해지다보니 그 동안 해결했던 내용을 하나하나 정리해보고 있는데...

막상 그 때 해결했던 내용들이 기억이 안나네요.

이래서 항상 기록하는 습관이 중요하다는 걸 또 한번 느낍니다.

M: bad i^M: bad interpret

 

 

er: No such file or directorynterpreter: No such file or directory^M: bad interpreter: No such file or directory

 

728x90
반응형
BIG