/bin/sh^M: bad interpreter 해결 방법

Linux에서 Shell Script를 실행 할때, “/bin/sh^M: bad interpreter”라는 오류가 발생할 때가 있다. 그리고 오류 내용은 입력하지도 않은 ‘^M’이란 문자때문에 오류가 발생한 것으로 나온다.

작성한 Shell Script를 열어 내용을 아무리 살펴보아도 ‘^M’이 입력된 부분이 있다거나 잘 못 작성된 부분이 있는 것을 찾기 힘들어 엄청 열 받을 것이다.

먼저, 이 오류에 대부분의 원인에 대해서 말하자면 Windows에서 작성한 Script를 Linux에서 바로 실행 하려고 하면 나타나는 현상인데, Windows와 Linux의 개행문자를 표현 하는 방식이 다르기 때문이다.

개행문자란 무엇인가?

개행문자(혹은 Enter)는 대부분의 편집 툴에서 편집 작업시 눈에 보이지는 않지만 줄바꿈이 있을 때마다 자동으로 입력되는 문자이다. 그리고 개행문자는 앞서 언급했듯이 운영체제 별로 표현법이 다르다.

Windows에서는 CRLF(\r\n)으로 표현하는데 그 의미는 다음과 같다.

CR(Carriage Return, \r)은 새로운 행을 추가하고 LF(Line Feed, \n)는 시작위치로 돌아간다는 의미이다.

반면에, Linux에서는 LF(\n)으로만 표현하도록 되어 있다.

때문에 Windows에서 작성한 문서를 Linux에서 보면 CR이 개행문자로 인식되지 못하고 ‘^M’으로 인식 되어 버린다. 그리고 이런한 이유로 오류가 발생하게 된다.

그럼 어떻게 보이지도 않는 “^M” 문자를 처리해야 하는가?

해결법은 간단하다. VI 편집기를 사용할때 옵션 [-b]를 다음과 같이 사용하여 실행하면 바이너리 모드로 문서를 볼 수 있는데 확인해 보면 모든 줄 끝에 ‘^M’문자가 들어간 것을 확인 할 수 있다.

$ vi -b [수정 할 문서 이름]
Windows에서 작성한 문서를 Linux에서 바이너리 모드로 오픈한 화면

모든 줄마다 붙어있는 ‘^M’ 문자를 모두 삭제해 하고 다시 실행해보면 “/bin/sh^M: bad interpreter” 오류는 해결 될 것이다.

WSL(Windows Subsystem for Linux) Ubuntu GUI 환경 구성

WSL에는 기본적으로 GUI 환경을 제공하지 않는다. 대부분의 경우 터미널로 출력되는 결과물만으로도 작업하는데 별다른 문제가 없지만 간혹 GUI가 꼭 필할 때도 있다.

리눅스의 GUI환경(X-window)은 처음부터 원격실행을 고려하여 Server-Client 구조로 분리하여 설계되었다. 이러한 이유로 GUI를 제공하지 않는 WSL에서도 X-window Server-Client통신에 사용되는 X11이라는 프로토콜을 이용하면 원격으로 GUI환경을 사용할 수 있다.

X-Window 기본개념

원격지가 X-Client가 되고 원격지의 화면을 받는 곳이 X-Server가 된다. 원격지의 실행되는 GUI 프로그램이 X-Client를 통해서 X-Server에게 화면정보를 요청보내면 X-Server는 요청온 정보를 받아 화면을 그려준다.

WSL GUI 환경을 구성하기 위해서는 첫번째로 Windows 10에 X-Window Server로 동작할 Xming 서버를 설치해야 한다.

설치를 완료하고 Xming을 실행하면 시스템 트레이에서 다음과 같이 아이콘을 확인 할 수 있다.

Windows 10 System Tray

다음으로 WSL에 X-Client를 구성해야 한다. 먼저, Machine ID를 생성한다.

$ sudo systemd-machine-id-setup
$ sudo dbus-uuidgen --ensure

ID가 잘 만들어 졌는지 확인해보자.

$ cat /etc/machine-id

잘 만들어 졌다면, 이제 X-Window 패키지와 구성 요소들을 설치한다.

$ sudo apt-get install x11-apps xfonts-base xfonts-100dpi xfonts-75dpi xfonts-cyrillic

마지막으로 GUI 프로그램이 실행될때 그래픽을 출력할 수 있도록 디스플레이 환경변수를 다음과 같이 “.bashrc”에 설정 한다.

$ export DISPLAY=:0
$ source ~/.bashrc

이제 모든 준비가 되었다. WSL GUI 환경이 잘 구성 되었는지 확인하기 위해서 다음과 같이 WSL Shell에 다음과 같이 명령을 실행해 본다.

$ xeyes

잘 구성 되었다면, 다음과 같이 웃기게 생긴 눈달린 창이 나와서 마우스를 따라서 시선을 움직일 것이다.

WSL Ubuntu GUI 환경 구성

이제, WSL에서도 GUI 프로그램을 사용해 보자.

Swap메모리 추가하기

메모리가 부족할 경우 시스템이 멈추거나 장애가 생긴다.
Ubuntu의 경우 Bus error이라는 메시지가 나오는 경우 보통 메모리 문제인데
이경우 Swap 메모리를 늘려주면 해결된다.

1. Swap 메모리를 늘리기 위해서는 root유저로 로그인 해야한다.

$ su - OR $ sudo -s

2. Swap메모리로 사용될 가상 파일을 생성해준다.

$ dd if=/dev/zero of=/swapfile bs=1024 count=3145728
#(**여기서 3145728는 1024*1024*3으로 나온것이며 3GB를 나타낸다**)

그러면 약 2~3분후 다음과 같이 결과가 나온다.

3145728+0 records in
3145728+0 records out
3221225472 bytes (3.2 GB) copied, 504.698 s, 6.4 MB/s

3. 만들어진 Swap 파일을 리눅스에서 사용할수 있는 메모리 형태로 만들어 주어야 한다.

$ mkswap /swapfile

그러면 Swap 메모리가 만들어진다.

Setting up swapspace version 1, size = 3145724 KiB
no label, UUID=cb9b919d-dfa9-406f-99e3-9717b7c96b51

4. 이제 만들어진 Swap 파일을 Swap 메모리 영역에 올려주면 된다.

$ swapon /swapfile

5. free명령어로 확인하면 가상메모리 (Swap)영역이 증가한 것을 확인 할 수있다.

         total      used    free    shared      buffers  cached
Mem:    738540    731124    7416         0         5828  371416
-/+ buffers/cache:353880  384660
Swap:  3145724         0 3145724