개요

 

안녕하세요 피터입니다.

오늘은 Bash 쉘에서 프로그램을 종료(exit) 하는 방법과 종료 상태(exit status)를 얻는 방법에 대해 설명드리겠습니다.

종료 상태는 리턴값(return value, return status)이라고 부르기도 하는데 이전에 수행했던 명령어나 프로그램이 종료 될 때 넘겨주는 값을 의미하기도 해서 그렇습니다.

 

종료 상태 또는 반환값이 중요한 이유는 쉘 스크립트를 작성하는데 있어서 특정 명령어의 성공 여부에 따라 분기해야 하는 경우 이전 명령어가 정상적으로 수행되었는지 아는 것이 필수적이기 때문입니다.

 

쉘 스크립트 내에서 exit 명령어가 실행되면 스크립트가 종료되며 부모 프로세스에 종료 상태를 전달할 수 있는데 이 값은 프로그램 내에서 임의로 지정할 수도 있습니다. 

 

이렇게 전달되는 하위 프로세스의 종료 상태는 스크립트를 자동화하는데 있어서 매우 중요한 기준을 제공합니다. 

(일반적으로 명령어의 종료 상태가 0이면 성공(success)로 판단하며 오류가 있는 경우 오류 코드를 반환하게 됩니다)

 

 

종료 (exit)

 

exit 명령어는 매개변수로 주어진 값을 리턴합니다. 

#!/bin/bash

echo "hello"

exit 100

 

예를들면 위와 같이 exit 100 이라고 작성하면 스크립트를 종료하면서 100 이라는 값을 리턴하는 것이죠.

이 때 종료 상태로 사용할 수 있는 값의 범위는 0 부터 255 까지입니다. 

일반적으로 unix 관행을 잘 따르는 경우 0은 성공, 1 ~ 255 는 오류 코드(error code)로 인식되고 있습니다. 

 

만일 exit 를 매개변수 없이 사용하게 되면 exit 가 실행되기 이전에 가장 마지막으로 수행됐던 명령어의 종료 상태를 반환하게 됩니다.

 

 

종료 상태 (exit status)

 

$? 는 가장 최근 명령어의 종료 상태를 나타냅니다. 

위 스크립트가 100을 반환한다고 했는데 정말 그런지 실행 후 종료 상태를 출력해보겠습니다.

 

[root@peterdev sh]# cat test.sh
#!/bin/bash

echo "hello"

exit 100
[root@peterdev sh]# sh test.sh
hello
[root@peterdev sh]# echo $?
100

 

위와 같이 echo $? 명령어에서 100이 출력되는 것을 확인할 수 있습니다.

 

만일 잘못된 명령어를 입력하여 오류가 발생한 경우는 아래와 같이 오류코드가 반환되는 것을 확인할 수 있습니다.

[root@peterdev sh]# eeee
-bash: eeee: command not found
[root@peterdev sh]# echo $?
127

 

아래 스크립트에서는 echo "hello" 가 정상적으로 수행되었기 때문에 0이 반환된 것을 확인할 수 있습니다.

[root@peterdev sh]# echo "hello"
hello
[root@peterdev sh]# echo $?
0

 

 

-Peter의 우아한 프로그래밍

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

 

 

블로그 이미지

친절한 Peter Ahn

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

댓글을 달아 주세요

 

개요

 

안녕하세요 피터입니다.

오늘은 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 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요