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

예제로 배우는 유용한 Bash 셸 내장 명령 15가지

Bash에는 셸 자체에 내장되어 있는 여러 가지 명령어가 있습니다. 내장(built-in) 명령을 실행하면 bash 셸이 다른 프로그램을 호출하지 않고 즉시 실행합니다.

외부 명령은 실행하기 위해 별도의 프로세스를 fork해야 하는 반면, 내장 명령은 그렇지 않기 때문에 외부 명령보다 훨씬 빠르게 동작합니다.

이 글에서는 유용한 bash 셸 내장 명령 15가지를 예제와 함께 살펴보겠습니다.

1. Bash export 명령 예제

export 명령은 변수나 함수를 현재 셸에서 실행 중인 모든 자식 프로세스의 환경으로 내보낼 때 사용합니다.

export varname=value
export -f functionname   # 현재 셸의 함수를 내보냅니다

변수나 함수를 지정한 값과 함께 내보냅니다. "env" 명령으로 모든 환경 변수 목록을 확인할 수 있으며, 아래 예제에서 env가 내보낸 변수를 출력하는 것을 볼 수 있습니다.

$ export country=India

$ env
SESSIONNAME=Console
country=India
_=/usr/bin/env

"export -p" 명령 역시 현재 셸에서 내보낸 모든 변수를 출력합니다.

2. Bash eval 명령 예제

eval 명령은 주어진 인자들을 하나로 결합한 뒤 해당 식을 평가·실행하고, 실행된 명령의 종료 상태(exit status)를 반환합니다.

$ cat evalex.sh
if [ ! -z $1 ]
then
proccomm="ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu | grep $1"
else
proccomm="ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu"
fi
eval $proccomm

위 코드는 인자 하나를 받아 grep 명령의 검색 패턴으로 사용합니다. CPU 사용량 순으로 프로세스 목록을 출력하면서, 명령줄에서 지정한 특정 패턴만 걸러서 보여주는 스크립트입니다.

참고: 이 글은 진행 중인 Bash 튜토리얼 시리즈의 일부입니다.

3. Bash hash 명령 예제

hash 명령은 사용된 명령어들의 경로명을 저장하는 해시 테이블을 관리합니다. 명령을 실행하면 일반적으로 $PATH 변수에서 해당 명령을 찾지만, 해시 테이블에 이미 등록되어 있다면 그곳에서 바로 가져와 실행합니다. 해시 테이블에는 각 명령이 그동안 호출된 횟수(hit)도 함께 기록됩니다.

$ hash
hits    command
   1    /usr/bin/cat
   2    /usr/bin/ps
   4    /usr/bin/ls

-d 옵션을 사용하면 특정 명령만 해시 테이블에서 삭제할 수 있고, -r 옵션을 사용하면 전체 해시 테이블을 초기화할 수 있습니다.

$ hash -d cat
$ hash
hits    command
   2    /usr/bin/ps
   4    /usr/bin/ls

4. Bash pwd 명령 예제

pwd는 현재 작업 디렉터리를 출력하는 셸 내장 명령으로, 기본적으로 내장 변수 ${PWD}의 값을 반환합니다.

$pwd
/home/sasikala/bash/exercises

$echo $PWD
/home/sasikala/bash/exercises

5. Bash readonly 명령 예제

readonly 명령은 변수나 함수를 읽기 전용(read-only)으로 표시하여 이후에는 값을 변경할 수 없도록 만듭니다.

$ cat readonly_ex.sh
#!/bin/bash
# 배열을 읽기 전용으로 제한
readonly -a shells=("ksh" "bash" "sh" "csh" );
echo ${#shells[@]}

# 배열을 수정하려고 시도하면 에러 발생
shells[0]="gnu-bash"

echo ${shells[@]}

$ ./readonly_ex.sh
4
readonly_ex.sh: line 9: shells: readonly variable

6. Bash shift 명령 예제

shift 명령은 위치 매개변수(positional parameters)를 N번 왼쪽으로 이동시키고, 이동 후 변수 이름을 그에 맞게 재조정합니다.

$ cat shift.sh
#! /bin/bash

while [ $# -gt 0 ]
do
        case "$1" in

        -l) echo "List command"
            ls
    	    shift
            ;;
	-p) echo "Process command"
    	    ps -a
    	    shift
    	    ;;
	-t) echo "Hash Table command"
    	    hash
    	    shift
    	    ;;
	-h) echo "Help command"
    	    help
    	    shift
	    ;;
	esac
done

$./shift.sh -l -t
List command analysis  break  testing t1.sh temp Hash Table command
hits    command
   1    /usr/bin/ls

7. Bash test 명령 예제

test 명령은 조건식을 평가하고 그 결과에 따라 0 또는 1을 반환합니다. 다양한 test 연산자에 대한 자세한 내용은 bash 매뉴얼 페이지를 참고하세요.

#! /bin/bash

if test -z $1
then
        echo "The positional parameter \$1 is empty"
fi

8. Bash getopts 명령 예제

getopts 명령은 명령줄 인자를 파싱하는 데 사용됩니다. 옵션별 규칙, 즉 어떤 옵션이 인자를 받고 어떤 옵션이 받지 않는지를 정의할 수 있습니다. getopts에서 옵션 뒤에 콜론(:)이 붙으면 해당 옵션은 인자를 필요로 한다는 의미입니다.

getopts는 두 개의 변수를 제공합니다. $OPTIND는 다음 매개변수의 인덱스를, $OPTARG는 옵션의 인자값을 담습니다.

$ cat options.sh
#! /bin/bash

while getopts :h:r:l: OPTION
do
         case $OPTION in
          h) echo "help of $OPTARG"
             help "$OPTARG"
             ;;
          r) echo "Going to remove a file $OPTARG"
             rm -f "$OPTARG"
            ;;
         esac
done

$ ./options.sh -h jobs
help of jobs
jobs: jobs [-lnprs] [jobspec ...] or jobs -x command [args]
    Lists the active jobs.  The -l option lists process id's in addition
    to the normal information; the -p option lists process id's only.

9. Bash logout 명령

logout 내장 명령은 현재 셸을 종료할 때 사용합니다.

10. Bash umask 명령 예제

umask 명령은 현재 프로세스의 파일 생성 마스크(file mode creation mask)를 설정합니다. 사용자가 파일을 생성할 때의 기본 권한은 umask에 설정된 값에 따라 결정됩니다. 파일의 기본 권한은 666이며, 사용자가 파일을 생성할 때 umask 비트와 마스킹됩니다.

파일 및 디렉터리 권한에 대한 자세한 내용은 관련 문서를 참고하세요.

사용자가 파일을 생성할 때 666이 022와 마스킹되므로, 기본 파일 권한은 644가 됩니다.

$ umask
0022

$ > temporary

$ ls -l temporary
-rw-r--r-- 1 root root 4 Jul 26 07:48 temporary

11. Bash set 명령 예제

set은 셸의 내부 변수를 설정하고 수정하는 데 사용되는 셸 내장 명령입니다. 인자 없이 set 명령을 실행하면 모든 변수와 그 값을 나열합니다. 또한 set 명령은 위치 매개변수의 값을 설정하는 데에도 사용됩니다.

$ set +o history # 히스토리 저장을 비활성화합니다.
+o 는 지정된 옵션을 비활성화합니다.

$ set -o history
-o 는 히스토리를 활성화합니다

$ cat set.sh
var="Welcome to thegeekstuff"
set -- $var
echo "\$1=" $1
echo "\$2=" $2
echo "\$3=" $3

$ ./set.sh
$1=Welcome
$2=to
$3=thegeekstuff

12. Bash unset 명령 예제

unset 내장 명령은 셸 변수를 null로 설정하는 데 사용됩니다. unset은 배열의 특정 요소를 삭제하거나 배열 전체를 삭제하는 데에도 활용할 수 있습니다.

Bash 배열에 대한 자세한 내용은 관련 배열 연산 문서를 참고하세요.

$ cat unset.sh
#!/bin/bash
# 값 할당 후 출력
var="welcome to thegeekstuff"
echo $var

# 변수 unset
unset var
echo $var

$ ./unset.sh
welcome to thegeekstuff

위 예제에서 변수를 unset하면 "var"에는 null 문자열이 할당됩니다.

13. Bash let 명령 예제

let 명령은 셸 변수에 대해 산술 연산을 수행하는 데 사용됩니다.

$ cat arith.sh
#! /bin/bash

let arg1=12
let arg2=11

let add=$arg1+$arg2
let sub=$arg1-$arg2
let mul=$arg1*$arg2
let div=$arg1/$arg2
echo $add $sub $mul $div

$ ./arith.sh
23 1 132 1

14. Bash shopt 명령 예제

shopt 내장 명령은 셸 옵션을 설정(set)하거나 해제(unset)하는 데 사용됩니다. 이 명령을 활용하면 셸이 제공하는 편리한 기능들을 끄고 켤 수 있습니다.

$cat shopt.sh
#! /bin/bash

## xpg_echo 활성화 전
echo "WELCOME\n"
echo "GEEKSTUF\n"
shopt -s  xpg_echo
## xpg_echo 활성화 후
echo "WELCOME\n"
echo "GEEKSTUF\n"

# alias 비활성화 전
alias l.='ls -l .'
l.

# alias 비활성화 후
shopt -u expand_aliases
l.

$ ./shopt.sh
WELCOME\n
GEEKSTUF\n
WELCOME

GEEKSTUF

total 3300
-rw------- 1 root root    1112 Jan 23  2009 anaconda-ks.cfg
-r-xr-xr-x 1 root root 3252304 Jul  1 08:25 backup
drwxr-xr-x 2 root root    4096 Jan 26  2009 Desktop
shopt.sh: line 17: l.: command not found

xpg_echo 옵션을 활성화하기 전에는 echo 문이 이스케이프 시퀀스를 확장하지 않았습니다. "l."은 현재 디렉터리의 ls -l에 대한 alias인데, expand_aliases 옵션을 비활성화한 후에는 alias가 확장되지 않아 "l.: command not found"라는 오류가 발생하는 것을 확인할 수 있습니다.

15. Bash printf 명령 예제

C 언어의 printf와 유사하게, bash의 printf 내장 명령은 형식화된(format) 출력 작업에 사용됩니다.

13번 예제의 스크립트는 두 입력값에 대해 산술 연산을 수행합니다. 이 스크립트에서 echo 문 대신 printf 문을 사용하면 아래와 같이 형식화된 출력을 얻을 수 있습니다.

arith.sh에서 echo 문을 다음 printf 문으로 교체해 보세요.

printf "Addition=%d\nSubtraction=%d\nMultiplication=%d\nDivision=%f\n" $add $sub $mul $div

$ ./arith.sh
Addition=23
Subtraction=1
Multiplication=132
Division=1.000000