Bourne Shell Variables

환경 변수( Environment variable ) 기능은 1979 년 Version 7 Unix 에 처음 소개된 후에 모든 Unix OS 와 Linux, MacOS, DOS, Windows 등에서 사용됩니다. shell 에서 특정 변수값을 설정한 후에 export 하게 되면 프로그램이 실행될 때 해당변수값이 전달되어 사용할 수 있게 됩니다.

다음은 shell 에서 사용되는 변수들입니다.

CDPATH

자주 사용하는 디렉토리를 : 로 분리해 등록해 놓으면 cd 할 때 전체 경로를 입력할 필요가 없고 tab 키를 이용한 자동완성을 사용할 수 있습니다.

$ echo $CDPATH
.:/home/razvan/school/current:/home/razvan/projects

$ pwd
/home/razvan

$ cd so
/home/razvan/school/current/so

$ cd p2p-next
/home/razvan/projects/p2p-next

HOME

현재 사용자 홈디렉토리

IFS

Internal Field Separator. 단어분리 ( word splitting ) 시에 이 값을 기준으로 단어가 분리됩니다. read 명령으로 읽어들인 라인을 필드로 분리할때, 매개변수 확장을 통해 array 에 원소들을 입력할때도 사용됩니다. 기본값은 space, tab, newline 3 개로 IFS 변수가 unset 됐을때도 적용됩니다. IFS 값이 null 이면 단어분리가 일어나지 않습니다.

$ echo -n "$IFS" | od -a
0000000  sp  ht  nl

MAIL

$MAILPATH 변수가 설정되있지 않을때 mailbox 파일이나 maildir 디렉토리를 등록해 놓으면 메일이 왔을때 알려줍니다.

MAILPATH

mailbox 파일들을 : 로 분리하여 등록해놓으면 메일이 왔을때 알려줍니다.

OPTARG

getopts 명령에서 사용되는 변수로 현재 옵션값을 나타냅니다.

OPTIND

getopts 명령에서 사용되는 변수로 다음에 처리할 옵션 index 를 나타냅니다.

PATH

명령이 위치한 디렉토리를 : 로 분리하여 등록해 놓으면 순서대로 명령을 찾습니다.

PS1

Default interaction prompt 입니다. 프롬프트 모양을 변경하기 위해 여러가지 특수문자 를 사용할수 있습니다.

# \u – 아이디
# \h – 호스트이름
# \w – 현재 디렉토리의 전체경로

bash-3.2$  export PS1="\u@\h \w> "

ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>

PS2

Continuation interactive prompt 입니다. 여러줄의 명령을 입력할때 나타납니다.

# 다음줄부터 PS2 값으로 설정된 '>' 문자가 보입니다. 

ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
> --key_buffer_size=512M --sort_buffer_size=512M \
> --read_buffer_size=4M --write_buffer_size=4M \
> /var/lib/mysql/bugs/*.MYI

Bash Variables

BASH

현재 실행된 shell 프로그램의 전체경로 입니다.

BASHOPTS

shopt 명령으로 설정한 옵션들이 : 로 분리되어 저장됩니다.

BASHPID

현재 bash process id 입니다. subshell 에서 다른값을 가집니다.

BASH_ALIASES

alias 명령에 의해 설정된 associative array 입니다.

BASH_ARGC

shopt -s extdebug 옵션이 설정돼 있을 경우에 사용되며 현재 실행되는 함수의 인자수 call stack 을 나타내는 array 변수입니다. 가령 func1 11 에서 func2 22 33 를 호출하여 실행 중이라면 ${BASH_ARGC[@]} 값은 2 1 가 됩니다.

BASH_ARGV

shopt -s extdebug 옵션이 설정돼 있을 경우에 사용되며 현재 실행되는 함수의 인자값 call stack 을 나타내는 array 변수입니다. 주의할 것은 표시되는 인자의 순서인데 가령 func1 11 에서 func2 22 33 를 호출하여 실행 중이라면 ${BASH_ARGV[@]} 값은 33 22 11 가 됩니다.

BASH_CMDS

hash builtin 명령에서 사용하는 associative array 입니다. 값을 추가하거나 삭제하면 동일하게 hash 테이블에 반영됩니다.

BASH_COMMAND

현재 명령을 나타냅니다.

$ trap 'echo \"$BASH_COMMAND\" 명령이 실패하였습니다. 에러코드: $?' ERR

$ asdfgh
asdfgh: command not found
"asdfgh" 명령이 실패하였습니다. 에러코드: 127

BASH_COMPAT

Bash compatibility level 을 설정할수 있습니다. 설정을 안했을 경우는 현재버전으로 됩니다.

BASH_ENV

터미널을 새로 열때마다 interactive shell 이 시작되면서 .bashrc 파일이 실행됩니다. 비슷하게 non-interactive shell 인 스크립트 파일이 실행될때 마다 실행되는 파일을 이 변수에 등록할 수 있습니다. 스크립트 파일용 .bashrc 인 셈입니다.

BASH_EXECUTION_STRING

bash -c 형식으로 실행시 사용된 명령구문을 나타냅니다.

BASH_LINENO

현재 실행중인 함수의 caller 의 라인넘버 call stack 을 나타내는 array 변수입니다. 가령 a() 함수의 라인번호 10 에서 b() 함수를 호출하고 b() 함수의 라인번호 20 에서 c() 함수를 호출하여 현재 실행중이라면 ${BASH_LINENO[0]} 는 caller 라인번호인 20 이되고 ${BASH_LINENO[1]} 는 10 이 되는 식입니다. ${BASH_SOURCE[$i+1]} 와 같이 사용하면 caller 의 정확한 위치를 알수있습니다.

BASH_REMATCH

해당 페이지 참조

BASH_SOURCE

현재 실행 중인 명령이 위치한 파일이름의 source stack 을 나타내는 array 변수입니다. 가령 AA.sh 에서 BB.sh 을 source 하고 BB.sh 에서 CC.sh 을 source 하여 현재 실행 중이라면 ${BASH_SOURCE[0]} 은 CC.sh 이되고 ${BASH_SOURCE[1]} 은 BB.sh 이 ... 되는 식입니다.

BASH_SUBSHELL

subshell 의 중첩된수를 나타냅니다.

$ echo $BASH_SUBSHELL
0

$ (echo $BASH_SUBSHELL;(echo $BASH_SUBSHELL))
1
2

BASH_VERSINFO

bash 버전정보를 나타내는 array 변수 입니다.

BASH_VERSION

bash 버전정보를 나타냅니다.

BASH_XTRACEFD

xtrace 메시지만 특정 FD (file descriptor) 로 보낼때 사용합니다. set -o xtrace 옵션을 사용하여 xtrace 를 하면 기본적으로 stderr 로 메시지가 출력됩니다. 그러므로 실행되는 명령들 중에서 에러 메시지가 발생하면 둘이 섞이게 되는데 이 변수를 이용하면 xtrace 메시지만 특정 FD 로 보낼 수 있습니다.

-------------- test.sh ---------------
#!/bin/bash

exec 3> xtrace.txt      # FD 3번을 생성하고 xtrace.txt 로 출력
BASH_XTRACEFD=3         # trace 메시지를 FD 3번 으로 보냄

set -x

date -%Y                # error 메시지 발생 
AA=100
BB=200
CC=`expr $AA + $BB`
date -%Y                # error 메시지 발생

set -
----------------------------------------

# 오류 메시지는 기존대로 stderr 로 출력
$ ./test.sh 
date: invalid option -- '%'
Try 'date --help' for more information.
date: invalid option -- '%'
Try 'date --help' for more information.

$ cat xtrace.txt 
+ date -%Y
+ AA=100
+ BB=200
++ expr 100 + 200
+ CC=300
+ date -%Y
+ set -

CHILD_MAX

종료된 child process 의 상태값을 얼마나 기억할지를 나타냅니다.

COLUMNS

현재 터미널의 컬럼수를 나타냅니다. select 명령에 의해 사용됩니다.

COMP_CWORD

자동완성 함수에서 사용되는 변수로 프롬프트에서 타입중인 명령에서 현재 커서가 위치한 단어의 index 를 나타내며 ${COMP_WORDS[COMP_CWORD]} 로 스트링값을 구할수 있습니다.

COMP_LINE

자동완성 함수에서 사용되는 변수로 프롬프트에서 작성중인 명령의 현재 라인 내용을 나타냅니다.

COMP_POINT

자동완성 함수에서 사용되는 변수로 프롬프트에서 명령을 작성할때 현재 커서가 위치한 문자의 index 를 나타냅니다. 커서가 명령 라인의 맨 끝에 있다면 그 값은 ${#COMP_LINE} 와 같습니다.

COMP_TYPE

자동완성 함수에서 사용되는 변수로 현재 시도된 completion type 을 나타냅니다.

COMP_KEY

자동완성 함수에서 사용되는 변수로 completion 시도시 사용된 키값을 나타냅니다.

COMP_WORDBREAKS

자동완성 함수에서 사용되는 변수로 프롬프트에서 현재까지 작성한 명령을 단어들로 분리할때 이변수에 있는 값들을 기준으로 합니다. unset 할경우 기능을 상실하므로 추후에 다시 값을 대입해도 적용되지 않습니다. 기본값은 다음과 같습니다.

 0000000  sp   "   '   >   <   =   ;   |   &   (   :  
          20   22  27  3e  3c  3d  3b  7c  26  28  3a

COMP_WORDS

자동완성 함수에서 사용되는 변수로 프롬프트에서 현재까지 타입한 명령의 단어들을 담고있는 array 입니다.

COMPREPLY

자동완성 함수에서 사용되는 array 변수로 여기에 입력된 단어들이 tab 키를 이용해 자동완성을 시도할때 보여지게 됩니다.

COPROC

coproc builtin 명령을 사용할때 생성되는 file descriptors 를 담고있는 array 입니다.

DIRSTACK

현재까지 방문한 디렉토리 정보를 담고있는 array 입니다. dirs builtin 명령에서 보여주는 내용과 같습니다.

EMACS

shell 을 시작할때 이변수에 t 값이 설정되 있으면 emacs shell buffer 에서 실행되는것으로 간주하여 line editing 이 disable 됩니다.

ENV

$BASH_ENV 와 같습니다. shell 이 POSIX 모드로 실행될때 사용됩니다.

EUID

numeric effective user id 로 readonly 입니다. set uid 비트가 설정된 프로그램을 실행했을때 바뀌게 됩니다

FCEDIT

fc -e 명령을 사용할때 적용되는 기본 에디터 입니다.

FIGNORE

파일 확장자를 : 로 분리해서 등록해 놓으면 filename completion 시에 제외됩니다. 예) .o:.class

FUNCNAME

현재 실행되는 함수이름의 call stack 을 나타내는 array 변수입니다. 가령 a() 함수가 b() 함수를 호출하고 b() 함수가 c() 함수를 호출하여 현재 실행중이라면 이때 ${FUNCNAME[0]} 은 c() 가되고 ${FUNCNAME[1]} 은 b() 가 ... 되는 식입니다.

FUNCNEST

maximum function nesting level 을 설정할수 있습니다. 설정된 nesting level 을 넘어서면 명령실행이 중단 됩니다.

GLOBIGNORE

globbing 에서 사용하는 패턴을 : 로 분리해서 등록해 놓으면 매칭에서 제외시킵니다.

GROUPS

현재 사용자가 속해있는 그룹을 나타내는 array 변수입니다.

HISTCMD

현재 명령의 history number 를 나타냅니다.

HISTCONTROL

명령 history 의 작동방식을 : 로 분리하여 설정할수 있습니다.

  • ignorespace : space 로 시작하는 명령라인을 history 에 저장하지 않습니다.
  • ignoredups : 이전 history 명령과 중복될경우 저장하지 않습니다.
  • ignoreboth : ignorespace:ignoredups 와 같습니다.
  • erasedups : 이전 모든 history 라인을 비교하여 중복된 history 를 제거한후 저장합니다.

HISTFILE

history 를 저장할 파일을 나타냅니다.

HISTFILESIZE

history 파일에 저장될 최대 라인수를 나타냅니다.

HISTIGNORE

history 리스트에 저장할때 제외시킬 명령패턴을 : 로 분리하여 등록합니다.

HISTSIZE

history 리스트에 기억될 최대 명령수를 나타냅니다. 디폴트 값은 500 입니다.

HISTTIMEFORMAT

history 번호에 이어 timestamp 를 붙일수 있습니다. history file 에도 저장됩니다. 예) export HISTTIMEFORMAT="%Y%m%d %T "

HOSTFILE

/etc/hosts 와 같은 포멧의 파일을 등록해 놓으면 hostname completion 시에 사용됩니다.

HOSTNAME

호스트 이름을 나타냅니다.

HOSTTYPE

호스트 타입을 나타냅니다. 예) x86_64

IGNOREEOF

set -o ignoreeof 일때 사용되는 변수로 터미널에서 연이어 몇번을 ctrl-d (EOF) 입력해야 exit 되는지 숫자를 지정합니다.

INPUTRC

Readline 라이브러리의 설정파일을 지정할수 있습니다. 디폴트는 ~/.inputrc 입니다.

LANG

LC_ 로 시작하는 변수로 설정하지 않은 로케일 카테고리에 대해서는 이변수의 값이 적용됩니다.

LC_ALL

LC_LANG 으로 설정한 로케일 값을 overriding 합니다.

LC_COLLATE

sorting the results of filename expansion, and determines the behavior of range expressions, equivalence classes, and collating sequences within filename expansion and pattern matching 과 관련된 로케일 입니다.

LC_CTYPE

filename expansion and pattern matching 과 관련된 로케일 입니다.

LC_MESSAGES

$" " 를 사용한 스트링을 번역하는데 사용되는 로케일 입니다.

LC_NUMERIC

number formatting 에 관련된 로케일 입니다.

LINENO

Script 이나 shell function 실행시 현재 라인번호를 나타냅니다.

LINES

현재 터미널 라인수를 나타냅니다. select 명령에 의해 사용됩니다.

MACHTYPE

GNU cpu-company-system format 으로 시스템 정보를 나타냅니다.

MAILCHECK

메일채킹 주기를 초단위로 설정합니다.

MAPFILE

mapfile 명령으로 라인들을 읽어들일때 변수를 지정하지 않으면 여기에 저장이 됩니다.

OLDPWD

cd 명령을 사용할때 바로 전 디렉토리를 나타냅니다.

OPTERR

getopts 명령에서 사용하는 변수로 0 으로 설정하면 에러메시지를 표시하지 않습니다. 기본값은 1 입니다. 스크립트가 실행될때마다 새로 설정되기 때문에 getopts 명령을 사용하는 스크립트 내에서 설정해야합니다.

OSTYPE

shell 이 실행되는 OS 환경을 나타내며 자동설정값 입니다. 예) linux-gnu

PIPESTATUS

파이프로 연결된 명령들이 종료했을때 명령들의 리턴값을 담고있는 array.

POSIXLY_CORRECT

export POSIXLY_CORRECT=t 해놓으면 bash process 가 posix mode 로 실행됩니다. 현재 shell 도 set -o posix 한것과 같이 posix mode 로 바뀝니다.

PPID

shell 의 parent process id 로 readonly 변수입니다.

PROMPT_COMMAND

PS1 프롬프트를 표시하기전에 등록한 명령을 실행합니다.

ramesh@dev-db ~> PROMPT_COMMAND="date +%k:%m:%S; date;"
19:06:44
Thu Jun 11 19:14:44 KST 2015
ramesh@dev-db ~>

19:06:47
Thu Jun 11 19:14:47 KST 2015
ramesh@dev-db ~>

PROMPT_DIRTRIM

프롬프트에 디렉토리 경로를 표시할때 이 변수에 설정된 값만큼만 표시하고 나머지는 ... 로 표시합니다.

PS3

select 명령에서 사용하는 프롬프트 입니다.

PS4

디버깅을 하기위해 -x | set -o xtrace 옵션을 설정하여 스크립트를 실행하면 명령 실행전에 매개변수 확장, 치환이 완료된 명령문을 보여주는데요. 이때 PS4 값이 설정돼 있으면 명령문 앞에 표시합니다. 기본값은 + 입니다.

# PS4 설정예
export PS4='+(${BASH_SOURCE[0]}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

PWD

cd 명령에 의해 현재 디렉토리 경로가 저장됩니다.

RANDOM

0 ~ 32767 사이의 random number 를 제공합니다.

READLINE_LINE

readline script 을 작성할때 사용되는 변수로 프롬프트에서 명령을 입력할때 현재라인의 내용을 나타냅니다.

READLINE_POINT

readline script 을 작성할때 사용되는 변수로 프롬프트에서 명령을 입력할때 현재 커서가 위치한 문자의 index 를 나타냅니다.

REPLY

read 명령을 사용할때 값이 저장될 변수를 지정하지 않으면 이변수에 저장됩니다.

SECONDS

shell 이 시작한이래 경과한 시간 또는 script 가 실행을 시작한 이후 경과한 시간을 초단위로 나타냅니다. 임의로 값을 입력하면 그값으로부터 더해나갑니다.

SHELL

이 환경 변수는 현재 running shell 을 말하는 것이 아니고 /etc/passwd 에 설정되어 있는 값에 따라 설정됩니다. xterm 을 실행하거나 vim 에서 shell 명령을 실행시킬 때 이 값을 사용합니다.

현재 running shell 을 알고 싶으면

$ sh

$ readlink /proc/$$/exe
/bin/dash

$ echo $0
sh

SHELLOPTS

set 명령으로 설정한 옵션들이 : 로 분리되어 저장됩니다.

SHLVL

bash process 의 중첩된 수를 나타냅니다. 가령 현재 쉘에서 다시 bash 를 실행하면 SHLVL 은 2 가됩니다. shell script 를 실행했을때, bash -c 'echo $SHLVL' 형식으로 명령을 실행했을때 값이 올라갑니다. 다시말해 child process 일 경우에 해당하므로 subshell 에는 적용되지 않습니다. subshell 의 중첩된 수는 BASH_SUBSHELL 을 통해 알 수 있습니다.

$ echo $SHLVL
1
$ bash
$ echo $SHLVL
2

TIMEFORMAT

time 키워드에서 결과를 출력할때 사용되는 포멧 스트링 입니다.

TMOUT

read, select 명령사용시 입력대기 시간을 초단위로 설정할수 있습니다. 대기시간을 초과하면 입력을 중단하고 다음명령으로 진행합니다. 터미널에서 설정할경우 해당 시간동안 명령 입력이 없으면 exit 합니다.

TMPDIR

shell 이 사용하는 임시 디렉토리를 지정할수 있습니다.

UID

현재 사용자의 numeric real user id 로 readonly 변수 입니다. 시스템에 login 했을때 id 를 말합니다.