Bash 셸 함수(shell function)란 여러 개의 UNIX/Linux 명령어를 하나의 이름으로 묶어두고, 필요할 때 그 이름만으로 한 번에 실행할 수 있게 해주는 기능입니다. Bash 셸 함수는 일반 유닉스 명령어처럼 실행할 수 있으며, 별도의 새 프로세스를 생성하지 않고 현재 셸 컨텍스트 안에서 바로 해석되어 실행됩니다.
셸 별칭(alias)과 함수 모두 길거나 복잡한 명령어를 짧은 형태로 정의할 수 있다는 공통점이 있습니다. 하지만 별칭과 달리 함수는 조건문·반복문 같은 제어 흐름(control-flow)과 인수(arguments) 처리 등 훨씬 다양하고 강력한 기능을 사용할 수 있습니다.
이 글은 진행 중인 Bash 튜토리얼 시리즈의 일부입니다. 이전에 다룬 Bash 소개, 종료 상태(exit status), 별칭 예제 관련 글도 함께 참고하시면 좋습니다.
Bash 함수 생성 문법
function functionname()
{
commands
.
.
}- function: 키워드이며 생략해도 됩니다(선택 사항).
- functionname: 함수의 이름입니다.
- commands: 함수 내부에서 실행될 명령어 목록입니다.
함수는 인수를 받을 수 있습니다. 함수가 실행될 때 전달된 인수들은 위치 매개변수(positional parameters)가 되며, 위치 매개변수 0에는 항상 스크립트 이름이 들어가며 변경되지 않습니다.
명령줄에서 Bash 함수를 호출하는 방법은 아래와 같습니다:
$ functionname arg1 arg2
- 셸이 리눅스 명령어를 해석할 때는 먼저 break, continue, eval, exec 같은 특수 내장 함수를 확인한 후, 그다음 셸 함수를 찾습니다.
- Bash 함수의 종료 상태(exit status)는 함수 본문에서 마지막으로 실행된 명령어의 종료 상태와 동일합니다.
참고: 셸 함수 정의는 셸 시작 파일(예: .bash_profile)에 넣어두면 좋습니다. 이렇게 하면 언제든지 명령줄에서 해당 함수를 사용할 수 있습니다. .bash_profile이 언제 실행되는지 궁금하다면 이전에 작성한 Bash 실행 순서 관련 글을 참고하세요.
예제 1: 특정 확장자를 가진 파일 목록 자세히 출력하기
"lsext" 함수는 현재 디렉터리에서 지정한 확장자를 가진 파일 목록을 찾아 출력합니다. find 명령어와 ls 명령어를 조합하여 작업을 수행합니다.
$ function lsext()
{
find . -type f -iname '*.'${1}'' -exec ls -l {} \; ;
}
$ cd ~
$ lsext txt
-rw-r--r-- 1 root root 24 Dec 15 14:00 InMorning.txt
-rw-r--r-- 1 root root 184 Dec 16 11:45 Changes16.txt
-rw-r--r-- 1 root root 458 Dec 18 11:04 Changes18.txt
-rw-r--r-- 1 root root 1821 Feb 4 15:01 ChangesOfDB.txt예제 2: 여러 파일에 특정 리눅스 명령어 일괄 실행하기
다음 예제의 "batchexec" 함수는 지정한 확장자를 가진 파일들을 찾아, 선택된 파일들에 지정한 명령어를 일괄 실행합니다.
$ function batchexec()
{
find . -type f -iname '*.'${1}'' -exec ${@:2} {} \; ;
}
$ cd ~
$ batchexec sh ls
$ batchexec sh chmod 755
$ ls -l *.sh
-rwxr-xr-x 1 root root 144 Mar 9 14:39 debug.sh
-rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh
-rwxr-xr-x 1 root root 22 Mar 18 08:32 t.sh위 예제에서는 .sh 확장자를 가진 모든 셸 스크립트 파일을 찾아 권한을 755로 변경합니다(사용자에게는 모든 권한, 그룹과 기타 사용자에게는 읽기·실행 권한 부여). 함수 정의에서 눈여겨볼 부분은 "${@:2}"인데, 이는 두 번째 이후의 위치 매개변수를 의미합니다(셸 확장 기능).
예제 3: 랜덤 비밀번호 생성하기
다음 함수는 특수 문자를 포함한 강력한 랜덤 비밀번호를 지정한 길이만큼 생성합니다. 길이를 지정하지 않으면 기본값으로 12자 길이의 비밀번호를 만듭니다.
$ function rpass() {
cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12}
}
$ rpass 6
-Ju.T[[
$ rpass
Gz1f!aKN^""k위 예제에서 rpass를 인수 6과 함께 실행하면 6자리 랜덤 비밀번호가 생성되고, 인수 없이 rpass를 실행하면 12자리 비밀번호가 생성됩니다. ${1:-12}는 $1이 설정되지 않았거나 null일 경우 12를 반환하고, 그렇지 않으면 $1의 값으로 대체한다는 의미입니다.
예제 4: 특정 인터페이스의 IP 주소 조회하기
다음 예제는 'getip'라는 함수를 정의합니다. 이 함수는 인터페이스 이름을 인수로 받아, 해당 인터페이스에 할당된 IP 주소를 반환합니다(기본값은 eth0의 IP 주소). ifconfig 명령어를 사용하여 IP 주소를 가져옵니다.
$ function getip()
{
/sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}';
}
$ getip
15.110.106.86
$ getip eth0
15.110.106.86
$ getip lo
127.0.0.1예제 5: 시스템 정보 한눈에 확인하기
이 예제는 시스템에 대한 필수 정보를 모두 보여주는 함수를 정의합니다. 시작 파일에 이 함수를 정의하고 호출하도록 설정하면, 로그인할 때마다 시스템 정보를 자동으로 확인할 수 있습니다.
$ function mach()
{
echo -e "\nMachine information:" ; uname -a
echo -e "\nUsers logged on:" ; w -h
echo -e "\nCurrent date :" ; date
echo -e "\nMachine status :" ; uptime
echo -e "\nMemory status :" ; free
echo -e "\nFilesystem status :"; df -h
}
$ mach
Machine information:
Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux
Users logged on:
root pts/2 ptal.mot Wed10 0.00s 1.35s 0.01s w -h
Current date :
Thu Mar 18 11:59:36 CET 2010
Machine status :
11:59:36 up 7 days, 3 min, 1 user, load average: 0.01, 0.15, 0.15
Memory status :
total used free shared buffers cached
Mem: 2059768 2033212 26556 0 81912 797560
-/+ buffers/cache: 1153740 906028
Swap: 4192956 48164 4144792
Filesystem status :
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 12G 12G 0 100% /
tmpfs 1006M 377M 629M 38% /dev/shm
/dev/sdc5 9.9G 409M 9.0G 5% /mydisk예제 6: ls 출력 결과를 더 보기 좋게 정렬하기
다음 함수는 화면을 지우고 커서를 화면 맨 위로 이동시킨 뒤 ls를 실행하고, 마지막으로 커서를 화면 끝으로 옮깁니다.
$ function ll ()
{
clear;
tput cup 0 0;
ls --color=auto -F --color=always -lhFrt;
tput cup 40 0;
}
$ lltype 명령어로 함수 코드 확인하기
type은 셸 내장 명령어로, 함수의 코드를 확인할 때 사용합니다.
문법: type function-name
$ type ll
ll is a function
ll ()
{
clear;
tput cup 0 0;
ls --color=auto -F --color=always -lhFrt;
tput cup 40 0;
alias ls="ls --color=auto -F"
}참고용으로 이 글에서 소개한 6가지 함수 전체를 담은 샘플 .bash_profile functions 파일도 제공되니 활용해 보세요.
모든 함수를 ~/.bash_profile 파일에 추가해 두면, 매번 새로 만들 필요 없이 언제든지 이 함수들을 바로 사용할 수 있습니다.