쉘 스크립트 순차 실행 - swel seukeulibteu suncha silhaeng

개요

안녕하세요 피터입니다.

오늘은 Bash 쉘로 만들어진 프로그램(보통 스크립트-script라고 말합니다) 실행하는 방법을 설명드리겠습니다.

가장 기본적인 형태의 bash 스크립트는 여러개의 명령어를 나열한 것입니다.

그러면 명령어를 매번 하나하나 입력할 필요 없이 스크립트 파일을 실행하는 것으로 시간을 절약할 수 있습니다.

마치 windows의 배치(batch) 파일과 같죠.

좀 더 복잡한 스크립트를 만들기 위해서는 쉘 내부 지시자를 사용해야 하는데 그러기 위해서는 맨 첫줄에 #! 로 시작하는 매직 코드(magic code)가 필요합니다.

#! 두 바이트는 이 파일이 어떤 명령어 해석기의 집합인지 시스템에 알려주는 역할으르 합니다.

즉, 실행 가능한 스크립트라는 것을 나타내는 특별한 표시자인 것이죠.

#!/bin/sh
#!/bin/bash

#! 뒤에 나오는 경로는 스크립트의 명령어를 해석할 프로그램의 위치를 나타냅니다.

/bin/sh 으로 작성하게 되면 기본쉘(리눅스에서는 bash)로 동작을 하게 됩니다.

기본쉘이 본쉘인 다른 유닉스 계열의 OS 에서는 /bin/bash 로 해야 bash 에서 사용되는 내부 명령어들을 사용할 수 있습니다.

리눅스에서는 /bin/sh/bin/bash 를 호출하기 때문에 같은 결과가 됩니다.

스크립트 작성

간단하게 log file을 정리하는 스크립트를 작성해보겠습니다.

file: cleanup.sh

#!/bin/sh

print_usage()
{
  echo "Usage: $0 filename lines"
  exit 2
}

if [ -n "$1" ]; then
  logfile=$1
else
  print_usage
fi

if [ -n "$2" ]; then
  lines=$2
else
  lines=100
fi

tail -$lines $logfile > log.tmp
/bin/mv log.tmp $logfile

echo "Clean up success"

exit 0

명령어 인수(argument)로 파일명과 정리후 남길 라인수를 입력하면 파일을 정리하는 스크립트 입니다.

명령어 인수에 파일명을 입력하지 않으면 Usage를 출력합니다.

라인수를 입력하지 않으면 기본값으로 100줄만 남기도록 동작합니다.

tail 명령어는 지정된 라인만큼만 출력하는 명령어입니다.

이 명령어의 결과를 재지향(redirect) 하여 log.tmp 파일로 저장한 뒤

원본에 덮어써서 로그를 정리하는 것입니다.

[참고]

[Linux] tail 로 실시간 로그 보기

[Linux] 재지향(Redirection)에 대한 이해

스크립트 실행

자 그럼 스크립트를 실행해볼까요?

아래와 같이 입력하면 스크립트를 실행할 수 있습니다.

sh cleanup.sh

또는

bash cleanup.sh

[root@peterdev sh]# ls -l
total 8
-rwxr-xr-x 1 root root  267 Jun  4 14:16 cleanup.sh

이렇게 실행권한이 부여된 상태에서 아래와 같이 실행할 수 있습니다.

[root@peterdev sh]# ./cleanup.sh
Usage: ./cleanup.sh filename lines

명령어 인수를 입력하지 않아서 Usage 가 출력되었군요.

스크립트를 작성할 때 사용자가 올바르게 사용할 수 있도록 이렇게 장치를 마련해놓는 것이 좋습니다.

[root@peterdev sh]# ./cleanup.sh /var/log/messages 50
Clean up success

파일명과 라인수를 입력하니 정상적으로 동작합니다.

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

참고

http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/index.html

여러 리눅스 명령어를 반복적으로 실행해야 하는 경우 터미널에 일일이 직접 다 치는 것은 매우 귀찮은 일이다.

이럴 때 쉘 스크립트를 사용하면 아주 편하다.

작성법

확장자가 .sh인 파일을 만든다. (파일명.sh)

#!/bin/bash

파일의 맨 윗줄에 이와 같이 적어준다.

그 아래부터는 실행할 명령어들을 엔터 단위로 적어주면 된다.

사용법

> chmod +x 파일명.sh

위에서 만들어준 파일을 실행시키기만 하면 되는데, 만든 직후에는 실행 권한이 없으므로 파일에 실행 권한을 넣어준다.

> ./파일명.sh

그리고 실행시켜주면 파일에 적어준 명령어들이 순차적으로 실행된다 :)

쉘 스크립트 (Shell Script) 

shell을 사용해서 프로그래밍을 할 수 있다.

주로 리눅스 등 서버작업의 프로그래밍 시 사용되며 생각보다 자주 사용된다.

쉘 스크립트는 파일안에 스크립트 작성 후, 실행 시 해당 스크립트가 실행되는 방식으로 이루어진다.

파일의 가장 위 첫라인은

#!/bin/bash 

로 시작된다. * 이때 #는 주석을 의미하는 것이 아니다. 

쉘스크립트 파일은 실행권한을 가지고 있어야 실행시킬 수 있다. 

간단한 쉘 스크립트를 만들어서 실행 해보자. 

$ vi forever.sh

vi [쉘 파일명]을 입력하여 쉘 파일 생성/편집 모드로 들어간다. 

필자는 파일명은 forever.sh 로 만들어 보겠다. 

* shell script의 파일 형식은 관습적으로 "sh" 확장자를 사용한다. 이는 정해진 규칙이라기보다 쉘 스크립트라는 것을 표시하기 위함이다. 

쉘 스크립트 순차 실행 - swel seukeulibteu suncha silhaeng

편집모드 i 를 눌러

첫 라인에  #!/bin/bash 를 써 주고, 

실행 스크립트는 echo "forever!" 로 입력해보았다.

*echo명령어는 쉘 프로그래밍 언어에서 출력문이다. "forever!"을 출력하겠다는 의미이다.

일반적인 프로그래밍 언어의 print 명령문이 되겠다. 

입력 후 편집모드 종료키인 esc를 눌러 vi가 비활성화 되면 

저장후 종료하라는 명령문인 :wq 를 입력하여 저장 후, vi를 종료한다. 

쉘 스크립트 순차 실행 - swel seukeulibteu suncha silhaeng

ls -l 명령어를 사용하여 forever.sh 파일을 확인해보면 

-rw-r--r-- 권한으로 즉, 실행권한이 없는 일반파일이 생성이 된 것을 확인할 수 있다.

이 경우 쉘스크립트를 실행(./forever.sh) 해보면, 

실행 권한이 없기 때문에 '허가거부' 메세지가 떨어지면서 실행되지 않는다.

이 파일을 실행할 수 있도록 실행권한 chmod 755 권한을 부여해 준다. 

* 퍼미션 755 설정 : 모든 사용자에게 실행 권한이 주어짐

쉘 스크립트 순차 실행 - swel seukeulibteu suncha silhaeng

실행권한 부여 부, forever.sh 쉘 파일을 실행하면 다음과 같이 스크립트에 입력해두었던 출력문이 실행되어

"forever!" 문구가 잘 출력이 된다. 

* 실행방법

실행방법은 명령어 3가지 방법이 있다.

1) ./forever.sh

2) sh forever.sh

3) bash forever.sh

필자는 1번 방법으로 실행하였다. 

다음과 같은 매커니즘으로 쉘스크립트를 실행할 수 있고 

출력문이 아닌 실제 하고자 하는 작업 명령문을 입력해놓으면 

길거나 여러개의 명령문을 순차적으로 실행하며 

사용자 입장에서는 (실제 실행 프로세스를 모르더라도)간단히 쉘 스크립트를 실행하는 것만으로 작업실행이 가능하다. 

실제 작업 명령문 ex) 

쉘 스크립트 순차 실행 - swel seukeulibteu suncha silhaeng

+ 보너스 공부  #!/bin/bash 란? 

쉘 스크립트를 만들때,  가장 첫 라인에

#!/bin/bash 

를 왜 써야 하는지에 대하여 알아보자. 

쉘 스크립트의 가장 첫 라인에  #!/bain/bash 를 쓰게 됨으로 해서, 내가 사용 하려는 명령어 해석기가 bash 쉘 임을 미리 알려주는 것이다. 

일반적으로 스크립트에서 #는 주석기호이지만, 첫라인의 #!/bin/bash 에서의 #은 주석기호가 아니다.

 #! 은 스크립트의 제일 앞에서 이 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에게 알려주는 역할을 하며, 실행 가능한 쉘 스크립트라는 것을 나타내는 특별한 표시자이다.

#! 바로 뒤에 나오는 것은 경로명으로, 스크립트에 들어있는 명령어들을 해석할 프로그램의 위치를 나타내는데 그 프로그램이 쉘인지, 프로그램 언어인지, 유틸리티인지를 나타낸다.

이 명령어 해석기가 주석은 무시하면서 스크립트의 첫 번째 줄부터 명령어들을 실행시킨다.

거의 대부분의 상업용 유닉스 및 리눅스 에서는 기본 본쉘인 #!/bin/sh 을 사용한다. 

(필자도 리눅스 환경에서 테스트 했기 때문에 #!/bin/sh 를 사용하였다. )

쉘 스크립트 순차 실행 - swel seukeulibteu suncha silhaeng

실제 /bin/sh 경로를 조회해보면 bash 쉘에 링크를 걸어두고 있는것을 확인할 수 있다.  

즉, 스크립트를 실행하면, /bin/sh 에 연결된 bash 쉘의 기능을 사용하는 것이다.

"#!" 뒤에 나오는 경로는 정확히 Full PATH를 기록 해야 한다.

만약 PATH를 잘못 적게 되면, 스크립트를 돌렸을 때 거의 대부분 "Command not found"라는 에러 메세지를 만날것이다.

shell script를 사용하는 이유?

가장 큰 이유는 반복되는 작업을 자동화하기 위해 스크립트형태로 미리 만들어 놓고 실행만 하도록 하기 위해서이다.

이렇게 하면 스케줄링을 돌려서 파일만 실행하도록 할수도 있고 스크립트의 내용을 몰라도 누구나 실행할 수 있다. 

이러한 장점을 가지고 있는 shell script는 모니터링, 데이터 백업, 복구, notification, 보안, 인증 등

여러 상황에서 많이 사용된다.