쉘 스크립트 작성 시 실행이 되지 않을 때 확인 해봐야 할 것들

2018. 8. 11. 12:31IT/Unix

쉘 스크립트 작성 시 실행이 되지 않을 때 확인 해봐야 할 것들


쉘 스크립트 작성 시 실행이 되지 않을 때 확인 해봐야 할 것들


유닉스 계열에서 쉘스크립트를 작성 후 실행이 되지 않는 경우가 종종 발생한다.

업무를 보면서 발생했던 문제들 중 대표적인 몇 가지와 해결방법을 작성하려고 한다.


실행이 되지 않았던 경우는 다음의 경우가 있었다.


1. 상대경로 설정에 따른 라이브러리 및 파일 참조 불가

2. 특수문자 사용 시 \ 미처리

3. 타 문서 복사+붙여넣기에 따른 캐리지리턴(줄바꿈) 문자 삽입

이외에도 여러가지가 많지만, 우선 3가지에 대해 설명하고 해결법을 공유한다.


먼저, 상대경로 설정에 따른 라이브러리 및 파일 참조 불가의 경우는

최상단 인터프리터 또는 외부 라이브러리나 파일을 참조 할 경우 경로를 상대경로로 지정한다는 것이다.

경로를 설정하는 방법에는 상대경로와 절대경로가 있는데,

상대경로는 현재 파일(command 위치)를 기준으로 파일 위치를 찾는다.

즉, 현재 경로가 /tmp 일 경우 /home/test/ap.txt를 열고 싶다면 cat ../home/test/ap.txt과 같은 식으로 찾아가야 한다.

여기서 .. 은 상단 디렉터리를 뜻하며 상대경로는 현재 위치를 기준으로 라이브러리 및 파일을 참조한다.

절대경로는 기준을 정하고 참조한다.

위와 같은 경우 cat /home/test/ap.txt와 같은 식으로 찾는다.


스크립트 작성 시 위와 같은 원리로, 스크립트 파일이 /home/test에 있을 경우

파일을 참조 할 때 절대경로가 아닌 상대경로을 설정하게 되면,

예를 들어 스크립트 안에서 cat으로 test.txt의 있는 내용을 가져다 쓴다고 가정해보자.

그럼 쉘스크립트는 당연히 /home/test 안에 test.txt가 있다고 생각하고 동작하게 된다.

그러므로, 패키징되어 있는 쉘이 아닌 이상, 절대경로로 작성하는 것이 바람직하고 에러포인트를 줄일 수 있다.



다음으로 특수문자 사용 시 \ 미처리 하는 경우가 있다.

무슨 뜻이냐 하면, 스크립트 내부에서 종종 외부 명령어를 가져다 쓰는 경우가 생기는데

`echo "date : `date +'%H%M'` |awk '{print $1}'"`

위과 같은 경우 스크립트내 명령어를 실행하기 위한 backquote로 처리해야하는데 공교롭게도 `` 안에 또 ``이 들어가게 된다.

이때 `앞에 \처리를 해주어야 명령어가 정상적으로 실행 될 수 있다.



마지막으로 타 문서 편집기에서 작업 후 복사+붙여넣기 시 캐리지리턴(엔터) 값이 특수문자 형식으로 들어가는 경우이다.

^M값으로 들어가는데 vi에 -b 옵션을 주면서 파일을 열면 각 라인 끝에 ^M이 들어간 것을 볼 수 있다.

:%s/^M//g

으로 해결 할 수 있는데 끝은 %s 문자를 치환 / ^M를 / 공백으로 / 전체 라고 해석하면 된다.

이때 주의 해야 할 것은 ^M을 직접 입력하면 안되고 Ctrl + VM을 차례로 입력하면 ^M으로 바뀌는 것을 볼 수 있다.

잠시 검색해본 결과 윈도우용 gvim의 경우 Ctrl+V가 붙여넣기로 동작해서 Ctrl+Q로 매핑되어 있다고 한다.

또한 _vimrc 설정 파일에서 behave mswin을 없애면 ^M값을 바꿀 수 있는 것 같다.