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

외부 명령을 실행할 때 자동으로 검색할 디렉토리를 PATH 환경 변수에 등록해 놓습니다. 명령을 찾을 때는 앞에서부터 등록된 순서대로 찾기 때문에 동일한 이름을 가진 명령이 존재할 경우 제일 앞의 디렉토리에 있는 명령이 실행되게 됩니다.

디렉토리는 : 문자로 분리해서 등록하고 공백없이 붙여 써야 합니다. : 문자가 맨앞 or 맨뒤 에 오거나 :: 와 같이 값이 empty 가 될경우 현재 디렉토리도 검색하게 되므로 주의할 필요가 있습니다.

PATH=:/bin:/usr/bin:/usr/local/bin        # ":" 가 맨앞에 위치 (.: 와 같음)
PATH=/bin:/usr/bin:/usr/local/bin:        # ":" 가 맨뒤에 위치 (:. 와 같음)
PATH=/bin:/usr/bin::/usr/local/bin        # "::" (:.: 와 같음)

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

$ cat <<\@       # heredoc 사용시
> 111
> 222
> @
111
222

Bash Variables

BASH

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

BASHOPTS

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

BASHPID

이것은 실제 해당 shell 프로세스의 PID 를 나타냅니다. 그러므로 $$ 값과는 달리 subshell 에서 각각 다른 값을 가집니다. ( 각각 다은 프로세스 이므로 )

BASH_ALIASES

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

$ echo "${!BASH_ALIASES[@]}"          # 전체 alias 이름을 출력
mv cp ...

$ echo "${BASH_ALIASES[@]}"           # 전체 alias value 를 출력 
...

$ echo "${BASH_ALIASES[mv]}"
mv -i

$ echo "${BASH_ALIASES[cp]}" 
cp -i

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 가 됩니다.

#!/bin/bash

shopt -s extdebug

func2 () {
    echo "BASH_ARGC[0] : ${BASH_ARGC[0]}"
    echo "BASH_ARGC[1] : ${BASH_ARGC[1]}"
    echo "BASH_ARGV[0] : ${BASH_ARGV[0]}"
    echo "BASH_ARGV[1] : ${BASH_ARGV[1]}"
    echo "BASH_ARGV[2] : ${BASH_ARGV[2]}"
}

func1 () {
    func2 222 333
}

func1 111

###########  실행 결과  ############
                                             # shopt -s extdebug 옵션을 설정하지 않을 경우
$ ./test.sh                                  $ /test.sh 
BASH_ARGC[0] : 2                             BASH_ARGC[0] :
BASH_ARGC[1] : 1                             BASH_ARGC[1] :
BASH_ARGV[0] : 333                           BASH_ARGV[0] :
BASH_ARGV[1] : 222                           BASH_ARGV[1] :
BASH_ARGV[2] : 111                           BASH_ARGV[2] :

다음과 같은 경우는 shopt -s extdebug 옵션을 설정하지 않아도 같은 결과가 출력됩니다.

#!/bin/bash

echo "BASH_ARGC[0] : ${BASH_ARGC[0]}"
echo "BASH_ARGC[1] : ${BASH_ARGC[1]}"
echo "BASH_ARGV[0] : ${BASH_ARGV[0]}"
echo "BASH_ARGV[1] : ${BASH_ARGV[1]}"
echo "BASH_ARGV[2] : ${BASH_ARGV[2]}"

###########  실행 결과  ############

$ ./test.sh 111 222 333
BASH_ARGC[0] : 3
BASH_ARGC[1] :
BASH_ARGV[0] : 333
BASH_ARGV[1] : 222
BASH_ARGV[2] : 111

BASH_CMDS

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

$ echo "${BASH_CMDS[@]}"
/usr/bin/mv /usr/bin/vi /usr/bin/cp /usr/bin/ls /usr/bin/gcc /usr/bin/awk 
/usr/bin/lsof /usr/bin/strace /usr/bin/display /usr/bin/sudo /usr/bin/more

$ hash
hits    command
   3    /usr/bin/mv
  14    /usr/bin/vi
   1    /usr/bin/cp
  17    /usr/bin/ls
  . . .
  . . .

BASH_COMMAND

현재 실행중인 명령을 나타냅니다.

$ echo "\$BASH_COMMAND => $BASH_COMMAND"
$BASH_COMMAND => echo "\$BASH_COMMAND : $BASH_COMMAND"

-----------------------------------------------------

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

$ asdfgh --foo bar
asdfgh: command not found
"asdfgh --foo bar" 명령이 실패하였습니다. 에러코드: 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 이 ... 되는 식입니다.

$ cat AA.sh                         $ cat BB.sh
#!/bin/bash                         #!/bin/bash

source BB.sh                        source CC.sh        # 또는 ". CC.sh"

................................................

$ cat CC.sh
#!/bin/bash

echo "BASH_SOURCE : $BASH_SOURCE"
echo "BASH_SOURCE[0] : ${BASH_SOURCE[0]}"
echo "BASH_SOURCE[1] : ${BASH_SOURCE[1]}"
echo "BASH_SOURCE[2] : ${BASH_SOURCE[2]}"

############  실행 결과  #############

$ ./AA.sh
BASH_SOURCE : CC.sh
BASH_SOURCE[0] : CC.sh
BASH_SOURCE[1] : BB.sh
BASH_SOURCE[2] : ./AA.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 -@                 # error 메시지 발생 
AA=100
BB=200
CC=`expr $AA + $BB`
date -@                 # 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 -@
+ AA=100
+ BB=200
++ expr 100 + 200
+ CC=300
+ date -@
+ set -

CHILD_MAX

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

COLUMNS

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

COMP_CWORD

자동완성 함수에서 사용되는 변수로 명령 라인에서 현재 커서가 위치한 단어 index 를 나타냅니다. 단어는 $COMP_WORDBREAKS 변수값에 따라 분리되고 $COMP_WORDS 배열을 이용해 단어값을 구할 수 있습니다. 명령 라인에서 커서를 왼쪽으로 이동하면 그에따라 $COMP_CWORD, $2, $3 값도 변경됩니다.

COMP_LINE

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

COMP_POINT

자동완성 함수에서 사용되는 변수로 명령 라인에서 현재 커서가 위치한 문자수 index 를 나타냅니다.

# 명령 라인에서 현재 커서가 위치한 곳까지 스트링을 구함.
COMP_LINE2=${COMP_LINE:0:$COMP_POINT}

COMP_TYPE

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

COMP_KEY

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

COMP_WORDBREAKS

자동완성 함수에서 사용되는 변수로 이 값에 따라 자동완성 단어가 분리 됩니다. unset 할경우 기능을 상실하므로 추후에 다시 값을 대입해도 적용되지 않습니다. 기본값은 다음과 같습니다.

$ echo -n "$COMP_WORDBREAKS" | od -tax1
0000000  sp  ht  nl   "   '  >   <   =   ;   |   &   (   :
         20  09  0a  22  27  3e  3c  3d  3b  7c  26  28  3a

$ mycomm --fo[tab]        # 여기서 COMP_CWORD 는 1 이되고
$ mycomm --foo=ba[tab]    # 여기서 COMP_CWORD 는 3 이된다 ("=" 문자가 있으므로)

이 변수의 단점은 global 변수라는 점입니다. 다시 말해서 local 로 설정해 사용할 경우 적용되지 않습니다. 따라서 값을 변경해 사용하면 기존 값에따라 작성된 다른 스크립트에 영향을 주겠죠. 원래는 자동완성 함수마다 이 변수를 설정해서 사용해야 하는데 사람들이 그렇게 하지 않죠. 이런 변수가 있는줄도 모르고.

한 가지 변경해 사용하는 방법은 $PROMPT_COMMAND 변수를 활용하는 것입니다. $PROMPT_COMMAND 에 등록한 명령은 프롬프트가 표시되기 전에 매번 실행되므로 자동완성 함수 상단에 다음과 같은 설정을 추가하면 COMP_WORDBREAKS 값을 변경해 사용할 수 있습니다.

if ! [[ $PROMPT_COMMAND == *"COMP_WORDBREAKS="* ]]; then
    _PROMPT_COMMAND_BAK=$PROMPT_COMMAND    # 현재 $PROMPT_COMMAND 값 백업
    # 기존 $COMP_WORDBREAKS 값 복구 및 $PROMPT_COMMAND 값 복구하는 코드를 설정
    PROMPT_COMMAND="COMP_WORDBREAKS=${COMP_WORDBREAKS@Q};"
    PROMPT_COMMAND+='PROMPT_COMMAND=$_PROMPT_COMMAND_BAK;'$_PROMPT_COMMAND_BAK
fi
! [[ $COMP_WORDBREAKS == *,* ]] && COMP_WORDBREAKS+=","   # 이후 "," 문자를 추가해 사용
. . .

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 비트가 설정된 프로그램을 실행했을때 바뀌게 됩니다. sh 에서는 사용할 수 없는데 다음과 같은 방법을 사용하면 됩니다.

if [ "$(id -u)" != 0 ]; then
   echo "This script must be run as root" >&2
   exit 1
fi
$ gcc -xc - <<\@ && ./a.out
#include <stdio.h>
#include <unistd.h>
int main() {
    printf("UID : %u\n", getuid());
    printf("EUID : %u\n", geteuid());
}
@
UID : 1000
EUID : 1000

$ sudo chown root a.out && sudo chmod u+s a.out

$ ./a.out
UID : 1000
EUID : 0

FCEDIT

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

FIGNORE

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

FUNCNAME

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

예를들어 foo(), bar() 함수에서 공통으로 사용하는 함수 common() 이 있을 경우 common() 함수 내에서 어떤 함수에 의해 호출됐는지 알려면 ${FUNCNAME[1]} 값을 조회하면 됩니다.

#!/bin/bash

ccc() { 
    echo "FUNCNAME : ${FUNCNAME}"
    echo "FUNCNAME[0] : ${FUNCNAME[0]}"
    echo "FUNCNAME[1] : ${FUNCNAME[1]}"
    echo "FUNCNAME[2] : ${FUNCNAME[2]}"
}
bbb() { ccc ;}
aaa() { bbb ;}

aaa

##########  실행 결과  ###########

$ ./test.sh 
FUNCNAME : ccc
FUNCNAME[0] : ccc
FUNCNAME[1] : bbb
FUNCNAME[2] : aaa

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 를 저장할 파일을 나타냅니다. 디폴트 값은 ~/.bash_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

이 변수가 위치한 곳의 라인번호를 나타냅니다.
오류 발생시 메시지를 출력할때 사용하면 위치를 알 수 있습니다.

LINES

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

MACHTYPE

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

MAILCHECK

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

MAPFILE

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

OLDPWD

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

$ pwd
/home/mug896

$ cd `mktemp -d`          # 임시 디렉토리를 만들어서 이동

$ echo $PWD
/tmp/tmp.LYAC8UtyQe

$ cd -                    # 이전 디렉토리로 이동

$ echo $PWD $OLDPWD
/home/mug896 /tmp/tmp.LYAC8UtyQe

$ rm -rf $OLDPWD          # $OLDPWD 디렉토리 삭제

-------------------------------------------------

# git 저장소의 처음 디렉토리로 이동하기 위한 함수
cdp () {
    local TEMP_PWD=$PWD
    while [ ! -d .git ]; do
        cd ..
        [ "$PWD" = "/" ] && break
    done
    OLDPWD=$TEMP_PWD
}

$ pwd
/home/mug896/GitHub/ripgrep/crates/searcher

$ cdp

$ pwd
/home/mug896/GitHub/ripgrep        # ripgrep 저장소의 처음 디렉토리로 이동된다.

$ cd -

$ pwd
/home/mug896/GitHub/ripgrep/crates/searcher

----------------------------------------------

# cd 명령을 이용해 현재 shell PID 를 출력 후 $OLDPWD 를 이용해 복귀
$ cd -P /proc/self && echo ${PWD##*/} && cd $OLDPWD
19482

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@notebook$ PROMPT_COMMAND="date +%k:%m:%S; date;"
19:06:44
Thu Jun 11 19:14:44 KST 2015
ramesh@notebook$

19:06:47
Thu Jun 11 19:14:47 KST 2015
ramesh@notebook$

PROMPT_DIRTRIM

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

PS3

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

PS4

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

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

PWD

cd 명령에 의해 현재 디렉토리 경로가 저장됩니다. pwd 명령 실행 결과와 같습니다.

# 임시 디렉토리를 만들어 작업한 후에 삭제합니다.
$ cd `mktemp -d` && RMDIR=$PWD || { echo >&2 "Error: mktemp -d"; exit 1 ;}

# working ....

$ rm -rf "$RMDIR" 
$ cd ~

RANDOM

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

READLINE_LINE

The contents of the readline line buffer ( 프롬프트 상의 현재 명령라인 내용 ) 을 나타내는 변수입니다. bind -x 용 함수 작성에 사용되는 변수로 일반 함수에서는 사용할 수 없습니다.

READLINE_POINT

The insertion point in the readline line buffer ( 프롬프트 상의 현재 커서가 위치한 인덱스 ) 를 나타내는 변수입니다. bind -x 용 함수 작성에 사용되는 변수로 일반 함수에서는 사용할 수 없습니다.

다음 내용을 프롬프트 상에서 실행한 후에 ( 또는 .bashrc 에 입력 ) " , ' , < , ( , [ , { 문자를 입력해 보면 자동으로 닫는 문자가 입력됩니다.

readline-brackets() {
    READLINE_LINE=${READLINE_LINE:0:READLINE_POINT}${1}${READLINE_LINE:READLINE_POINT}
    let READLINE_POINT++
}

bind -x '"\"" : "readline-brackets \"\""'
bind -x '"\047" : "readline-brackets '$'\\\047\\\047"'    # single quotes
bind -x '"<" : "readline-brackets \<\>"'
bind -x '"(" : "readline-brackets \(\)"'
bind -x '"[" : "readline-brackets []"'
bind -x '"{" : "readline-brackets {}"'

REPLY

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

SECONDS

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

SHELL

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

현재 running shell 을 알고 싶으면

bash$ readlink /proc/$$/exe
/bin/bash

bash$ echo $0
/bin/bash

bash$ sh             # 'sh' 실행

sh$ echo $SHELL      # 현재 'sh' 이지만 'bash' 로 나온다.
/bin/bash

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

sh$ 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 를 말하고 계정관리를 위해 사용됩니다.