프린트 하기

OS환경 : Oracle Linux 6.8 (64bit)


DB 환경 : Oracle Database 11.2.0.4


에러 : /bin/sh^M: bad interpreter: No such file or directory

쉘파일 실행 시 아래 메세지 발생

1
2
$ ./archiving_audit.sh 
-bash: ./archiving_audit.sh: /bin/sh^M: bad interpreter: No such file or directory



해결 방법 : vi 의 바이너리 모드로 들어간 뒤 윈도우 개행문자(엔터) 삭제

vi 일반모드로 실행

1
2
3
4
5
6
7
8
9
10
11
12
$ vi archiving_audit.sh 
#!/bin/sh
ORACLE_SID=ORCL11
AUDIT_TAR_FILE=${ORACLE_SID}_AUDIT_$(date +"%Y%m%d%H%M%S").tar.gz
AUDIT_TAR_LOG=${ORACLE_SID}_AUDIT_$(date +"%Y%m%d%H%M%S").log
AUDIT_DEST=/oracle/app/oracle/admin/ORCL11/adump
AUDIT_TAR_DEST=/oracle/app/oracle/admin/ORCL11/audit_backup
 
if [ -"$AUDIT_TAR_DEST/$AUDIT_TAR_LOG" ]
then
    rm -"$AUDIT_TAR_DEST/$AUDIT_TAR_LOG"
fi

스크립트상에 아무 문제가 없어보임



방법1.

vi 일반모드로 실행 후 :set fileformat=unix 명령 실행 후 저장

1
2
$ vi archiving_audit.sh 
:set fileformat=unix



스크립트 재실행

1
2
$ ./archiving_audit.sh 
***script complete***

정상적으로 스크립트가 실행됨



방법2.

cat 으로 읽은 뒤 | tr -d '\r' 명령으로 한줄씩 잘라서 새로운 파일에 저장

1
$ cat archiving_audit.sh | tr -'\r' > archiving_audit.sh.new



스크립트 재실행

1
2
$ ./archiving_audit.sh 
***script complete***

정상적으로 스크립트가 실행됨



방법3.

vi 바이너리 모드로 실행(vi -b)

1
2
3
4
5
6
7
8
9
10
11
12
13
$ vi -b archiving_audit.sh 
#!/bin/sh^M
ORACLE_SID=ORCL11^M
AUDIT_TAR_FILE=${ORACLE_SID}_AUDIT_$(date +"%Y%m%d%H%M%S").tar.gz^M
AUDIT_TAR_LOG=${ORACLE_SID}_AUDIT_$(date +"%Y%m%d%H%M%S").log^M
AUDIT_DEST=/oracle/app/oracle/admin/ORCL11/adump^M
AUDIT_TAR_DEST=/oracle/app/oracle/admin/ORCL11/audit_backup^M
^M
if [ -"$AUDIT_TAR_DEST/$AUDIT_TAR_LOG" ]^M
then^M
    rm -"$AUDIT_TAR_DEST/$AUDIT_TAR_LOG"^M
fi^M
^M

^M이 줄마지막마다 다 달려있는 모습을 볼 수 있음



줄마지막마다 달려있는 ^M 삭제 후 저장

1
2
3
4
5
6
7
8
9
10
11
12
$ vi -b archiving_audit.sh 
#!/bin/sh
ORACLE_SID=ORCL11
AUDIT_TAR_FILE=${ORACLE_SID}_AUDIT_$(date +"%Y%m%d%H%M%S").tar.gz
AUDIT_TAR_LOG=${ORACLE_SID}_AUDIT_$(date +"%Y%m%d%H%M%S").log
AUDIT_DEST=/oracle/app/oracle/admin/ORCL11/adump
AUDIT_TAR_DEST=/oracle/app/oracle/admin/ORCL11/audit_backup
 
if [ -"$AUDIT_TAR_DEST/$AUDIT_TAR_LOG" ]
then
    rm -"$AUDIT_TAR_DEST/$AUDIT_TAR_LOG"
fi
1번,2번,3번 방법을 사용했을때 동일하게 vi -b 로 보면 ^M이 사라지는것을 확인할 수 있음



스크립트 재실행

1
2
$ ./archiving_audit.sh 
***script complete***

정상적으로 스크립트가 실행됨



원인 : 윈도우와 linux 간 줄바꿈을 의미하는 개행문자가 달라서 발생하는 문제

윈도우와 linux 간 줄바꿈을 의미하는 개행문자가 달라서 발생하는 문제

윈도우에서 스크립트 파일을 만든 뒤, linux 에서 실행해서 발생한 오류



참조 : 

https://stackoverflow.com/questions/2920416/configure-bin-shm-bad-interpreter

http://chomman.github.io/blog/linux/binshm-bad-interpreter-no-such-file-or-directory-%EC%98%A4%EB%A5%98-%EB%B0%9C%EC%83%9D-%EC%8B%9C/