개요

 

안녕하세요 피터입니다.

오늘은 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

 

그냥 파일명으로 실행을 하기 위해서는 파일에 실행권한이 필요합니다.

chmod 명령어를 통해 스크립트 파일에 권한을 부여할 수 있습니다.

 

[참고]

[Linux] chmod 로 파일 권한 변경하기

 
[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

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

개요

 

안녕하세요 피터입니다.

오늘은 여러분들이 왜 Bash 쉘 프로그래밍을 배워야 하는지에 대해서 설명드리겠습니다. 

리눅스(Linux) 환경에서 개발을 하거나, 시스템 관리자 업무를 수행하는데 있어서 Bash 쉘을 잘 다룰 수 있다는 점은 굉장한 경쟁력이 됩니다.

그만큼 업무를 효율적으로 수행할 수 있으니까요.

 

Bash"Bourne-Again Shell"의 앞 글자를 딴 것입니다.  Stephen Bourne의 Bourne Shell에 대한 클리쉐로 일종의 말장난 같은 겁니다. Bash는 이제 모든 종류의 유닉스에서 쉘 스크립트에 관한 실질적인 표준입니다.

쉘은 명령어 해석기(command interpreter)로서, 단지 커널과 사용자 중간에 놓여 있는것 이상으로 꽤 강력한 프로그래밍 언어입니다.

일반적으로 스크립트(Script)라고 부르는 쉘 프로그램은 .sh 확장자로 만드는 경우가 많으며 시스템 콜(System call)이나 다른 유틸리티(Utility) 또는 실행 파일 등을 서로 연결하여 특정 목적에 맞는 프로그램을 쉽게 만들 수 있게 해줍니다.

쉘 내부 명령어와 테스트, 루프 등을 활용하여 다소 복잡한 로직의 프로그램도 빠르게 개발이 가능하기 때문에 정식 패치 이전에 즉각적으로 반영이 필요한 긴급 이슈에 대응할 때에도 유용하게 사용될 수 있습니다.

이밖에도 쉘 스크립트는 완전히 구조적인 프로그래밍 언어의 편리한 부가 기능들이 필요없는 작업들, 특별히 시스템 관리자의 시스템 관련 작업이나 반복적인 일들을 처리할 때 굉장히 효율적입니다.

 

쉘 문법은 간단하고 명확하기 때문에 배우는 것은 크게 어렵지 않습니다. 테스트와 디버깅도 쉽습니다.

이런 강점은 실제 프로젝트를 진행하기 앞서서 프로토타이핑(Prototyping) 하기에 좋습니다.

개발에 들어가기 전 설계 단계에서 구조적인 결함을 조기에 발견할 수 있다면 그만큼 전체 프로젝트의 완성도가 높아질 뿐 아니라 리소스 낭비를 대폭 줄일 수 있습니다.

이러한 장점에도 불구하고 쉘 스크립트는 명확한 한계를 갖고 있기 때문에 아래와 같은 프로젝트는 다른 언어로 개발하는 것이 바람직합니다.

 

쉘 스크립트를 쓰면 안 될 때

  • 리소스에 민감한 작업들, 특히 속도가 중요한 요소일 때(정렬, 해쉬 등등)

  • 강력한 산술 연산 작업들, 특히 임의의 정밀도 연산(arbitrary precision)이나 복소수를 써야 할 때(C++을 쓰세요)

  • 플랫폼간 이식성이 필요할 때(C를 쓰세요)

  • 구조적 프로그래밍이 필요한 복잡한 어플리케이션(변수의 타입체크나 함수 프로토타입등이 필요할 때)

  • 업무에 아주 중요하거나 회사의 미래가 걸렸다는 확신이 드는 어플리케이션

  • 보안상 중요해서, 여러분 시스템의 무결성을 보장하기 위해 외부의 침입이나 크래킹, 파괴등을 막아야 할 필요가 있을 때

  • 서로 의존적인 관계에 있는 여러 콤포넌트로 이루어진 프로젝트

  • 과도한 파일 연산이 필요할 때(Bash는 제한적인 직렬적 파일 접근을 하고 , 특히나 불편하고 불충분한 줄단위 접근만 가능)

  • 다차원 배열이 필요할 때

  • 링크드 리스트나 트리같은 데이타 구조가 필요할 때

  • 그래픽이나 GUI를 만들고 변경하는 등의 일이 필요할 때

  • 시스템 하드웨어에 직접 접근해야 할 때

  • 포트나 소켓 I/O가 필요할 때

  • 예전에 쓰던 코드를 사용하는 라이브러리나 인터페이스를 써야 할 필요가 있을 때

  • 독점적이고 소스 공개를 안 하는 어플리케이션을 짜야 할 때(쉘 스크립트는 필연적으로 오픈 소스입니다.)

 

 

 
 

-Peter의 우아한 프로그래밍

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

 

참고

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

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요