티스토리 뷰

[Shell Script] 리눅스 쉘 파헤치기 -1. 쉘 소개



1. 리눅스 쉘

  GNU 배시쉘은 리눅스의 기본 쉘로, 본 쉘에서 기능이 강화되어, 프로그래밍뿐만 아니라 대화형으로 사용될 때도, 사용자가 효율성 향상을 위해 자신의 작업환경 구성과 단축키 생성이 가능하다.

 배시 쉘은 오늘날 유닉스와 리눅스에서 사용되는 가장 인기 있는 쉘 중의 하나이며, 배시(Bash) 프롬프트의 기본 프롬프트는 달러 표시($)이다.


  사용하는 리눅스 운영체제에서 어떤 쉘을 사용할 수 있는지 알고 싶다면 다음과 같이 /etc/shells 파일을 살펴보면 된다.


[root@gukii ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash


2. POSIX 가 뭐지?

  상이한 운영체제와 해당 프로그램의 소프트웨어 표준을 제공하기 위해서는, IEEE와 ISO 조직의 참여로 이루어진 POSIX 표준(개방형 시스템 표준)으로 이끌어내야 한다. POSIX의 목표는 서로 다른 플랫폼에서 응용 프로그램의 이식성을 증진시키는 표준에 충족되는 유닉스 계열의 컴퓨팅 환경을 제공하는 것이다.


3. 쉘의 역할

  프롬프트에서 들어오는 모든 명령이 적절히 실행되도록 하는 것이 쉘의 궁극적인 역할이다. 쉘의 역할과 책임을 정리해보면 다음과 같다.


1. 입력된 내용을 읽어서 해당 명령줄을 분석한다.

2. 와일드카드와 히스토리 문자와 같은 특수 문자들을 분석한다.

3. 파이프, 리다이렉션, 백그라운드 프로세스를 설정한다.

4. 시그널을 처리한다.

5. 프로그램을 올바르게 실행시킨다.



4. 변수

  쉘은 두가지 타입(지역과 환경)의 변수를 정의한다.

 지역변수는 자신이 생성한 쉘에서만 개별적으로 제공되고 이 쉘에서 파생된 다른 프로세스에게는 전달되지 않는다. 반면 환경변수는 부모 프로세스에서 자식 프로세스로 전달되고, 자식에서 또 그 후손으로 전달된다.

 내장된 set 명령은 지역변수와 환경변수 모두를 보여준다.


[root@gukii ~]# set

BASH=/bin/bash

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath

BASH_ALIASES=()

BASH_ARGC=()

BASH_ARGV=()

BASH_CMDS=()

BASH_LINENO=()

BASH_SOURCE=()

BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")

BASH_VERSION='4.1.2(2)-release'

COLORS=/etc/DIR_COLORS.256color

COLUMNS=147

CVS_RSH=ssh

DIRSTACK=()

EUID=0

GROUPS=()

G_BROKEN_FILENAMES=1

HISTCONTROL=ignoredups

HISTFILE=/root/.bash_history

HISTFILESIZE=100

HISTSIZE=100

HISTTIMEFORMAT='%Y-%m-%d_%H:%M:%S  '

HOME=/root

HOSTNAME=gukii.ga

HOSTTYPE=x86_64

IFS=$' \t\n'

LANG=en_US.UTF-8

LC_ALL=en_US.UTF-8

LESSOPEN='||/usr/bin/lesspipe.sh %s'

LINES=116

LOGNAME=root

LS_COLORS='rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lz=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.bz=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.rar=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:'

MACHTYPE=x86_64-redhat-linux-gnu

MAIL=/var/spool/mail/root

MAILCHECK=60

OPTERR=1

OPTIND=1

OSTYPE=linux-gnu

PATH=/usr/local/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PIPESTATUS=([0]="130")

PPID=24018

PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

PS1='[\u@\h \W]\$ '

PS2='> '

PS4='+ '

PWD=/root

QTDIR=/usr/lib64/qt-3.3

QTINC=/usr/lib64/qt-3.3/include

QTLIB=/usr/lib64/qt-3.3/lib

SHELL=/bin/bash

SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

SHLVL=1

TERM=xterm-256color

UID=0

USER=root

_=tail

colors=/root/.dircolors



다음 장에서는 배시(bash) 쉘 구조에 대해서...




댓글