Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

리눅스에서 나만의 셸 함수와 라이브러리를 작성하고 활용하는 방법

리눅스에서 셸 스크립트는 시스템 관리 작업을 수행·자동화하거나 간단한 명령줄 도구를 만드는 등 매우 다양한 용도로 활용됩니다.

이 가이드에서는 리눅스 초보 사용자를 위해 커스텀 셸 스크립트를 안정적으로 보관할 위치, 자신만의 셸 함수라이브러리를 작성하는 방법, 그리고 다른 스크립트에서 라이브러리의 함수를 호출하는 방법까지 차근차근 살펴봅니다.

셸 스크립트 저장 위치 정하기

매번 전체 경로(절대 경로)를 입력하지 않고 스크립트를 바로 실행하려면, $PATH 환경 변수에 포함된 디렉터리 중 하나에 스크립트를 저장해야 합니다.

현재 시스템의 $PATH 값은 아래 명령어로 확인할 수 있습니다:

$ echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

일반적으로 홈 디렉터리에 bin 디렉터리가 존재하면 해당 디렉터리는 자동으로 $PATH에 포함됩니다. 따라서 이곳에 셸 스크립트를 보관하면 편리하게 실행할 수 있습니다.

bin 디렉터리를 생성합니다. 이 디렉터리에는 Perl, Awk, Python 등 다른 언어로 작성된 스크립트나 실행 파일도 함께 보관할 수 있습니다:

$ mkdir ~/bin

다음으로 자신만의 라이브러리를 보관할 lib(libraries의 줄임말) 디렉터리를 생성합니다. C, Python 등 다른 언어의 라이브러리도 이곳에 모아둘 수 있습니다. 그리고 그 아래 sh라는 하위 디렉터리를 만들면 셸 전용 라이브러리를 체계적으로 관리할 수 있습니다:

$ mkdir -p ~/lib/sh 

자신만의 셸 함수와 라이브러리 만들기

셸 함수(shell function)란 스크립트 내에서 특정 작업을 수행하는 명령어들의 집합입니다. 역할 면에서 다른 프로그래밍 언어의 프로시저, 서브루틴, 함수와 매우 유사합니다.

셸 함수의 기본 문법은 다음과 같습니다:

function_name() { list of commands }

예를 들어, 현재 날짜(date)를 화면에 출력하는 함수는 아래처럼 작성할 수 있습니다:

showDATE() {date;}

이후 날짜가 필요할 때마다 함수 이름만 호출하면 됩니다:

$ showDATE

셸 라이브러리(shell library)는 일종의 셸 스크립트입니다. 다만 일반적인 실행 목적이 아니라, 재사용 가능한 함수들을 모아두고 다른 셸 스크립트에서 불러와 호출할 수 있도록 하는 것이 목적입니다.

아래는 ~/lib/sh 디렉터리에 저장한 libMYFUNCS.sh 라이브러리 예제로, 실전에서 유용한 여러 함수가 포함되어 있습니다:

#!/bin/bash 

#Function to clearly list directories in PATH 
showPATH() { 
        oldifs="$IFS"   #store old internal field separator
        IFS=:              #specify a new internal field separator
        for DIR in $PATH ;  do echo $DIR ;  done
        IFS="$oldifs"    #restore old internal field separator
}

#Function to show logged user
showUSERS() {
        echo -e “Below are the user logged on the system:\n”
        w
}

#Print a user’s details 
printUSERDETS() {
        oldifs="$IFS"    #store old internal field separator
        IFS=:                 #specify a new internal field separator
        read -p "Enter user name to be searched:" uname   #read username
        echo ""
       #read and store from a here string values into variables using : as  a  field delimiter
    read -r username pass uid gid comments homedir shell <<< "$(cat /etc/passwd | grep   "^$uname")"
       #print out captured values
        echo  -e "Username is            : $username\n"
        echo  -e "User's ID                 : $uid\n"
        echo  -e "User's GID              : $gid\n"
        echo  -e "User's Comments    : $comments\n"
        echo  -e "User's Home Dir     : $homedir\n"
        echo  -e "User's Shell             : $shell\n"
        IFS="$oldifs"         #store old internal field separator
}

코드 작성이 끝나면 파일을 저장하고, 실행 권한을 부여하는 것을 잊지 마세요.

라이브러리의 함수를 호출하는 방법

라이브러리(lib)에 포함된 함수를 사용하려면, 먼저 해당 라이브러리를 함수를 사용할 셸 스크립트에 포함(include)해야 합니다. 포함 방식은 아래 두 가지입니다:

$ ./path/to/lib
OR
$ source /path/to/lib

예를 들어 ~/lib/sh/libMYFUNCS.sh 라이브러리에 있는 printUSERDETS 함수를 다른 스크립트에서 활용한다면 다음과 같습니다.

특정 사용자의 상세 정보를 출력하기 위해 새로운 코드를 일일이 작성할 필요 없이, 라이브러리에 이미 존재하는 함수를 그대로 호출하기만 하면 됩니다. 이것이 라이브러리 활용의 핵심 장점입니다.

test.sh라는 이름의 새 파일을 열어 아래 내용을 입력합니다:

#!/bin/bash 

#include lib
.  ~/lib/sh/libMYFUNCS.sh

#use function from lib
printUSERDETS

#exit script
exit 0

저장한 뒤 실행 권한을 부여하고 스크립트를 실행합니다:

$ chmod 755 test.sh
$ ./test.sh 
리눅스에서 나만의 셸 함수와 라이브러리를 작성하고 활용하는 방법

마무리

지금까지 셸 스크립트를 안정적으로 보관하는 적절한 위치, 자신만의 셸 함수와 라이브러리를 작성하는 방법, 그리고 일반 셸 스크립트에서 라이브러리의 함수를 불러오는 방법을 알아보았습니다.

반복되는 코드를 함수로 추상화하고 라이브러리로 묶어두면 스크립트의 유지보수성과 생산성이 크게 향상됩니다. 다음 글에서는 VimBash 스크립팅용 IDE로 손쉽게 구성하는 방법을 소개할 예정이니 많은 기대 부탁드립니다.