개발 이야기

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

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
반응형
SMALL