Linux Programmer

bash : 기초 : 셸의 역사, 종류 본문

컴퓨터 관련/리눅스(유닉스) 일반

bash : 기초 : 셸의 역사, 종류

sunyzero 2019. 10. 13. 16:04

셸의 발전 순서대로 보면 다음과 같다. (shell의 한글 표기로 이라고 적는 경우도 있지만 요새는 을 더 많이 쓰는 것 같아서 shell을 셸이라고 표기하겠다)

  • Bourne shell : /bin/sh - POSIX shell
  • C shell : /bin/csh - Sun microsystem (BSD)
  • Korn shell : /bin/ksh
  • bash : /bin/bash
  • zsh : /bin/zsh

 

1. bash 이전의 셸들

가장 유명한 셸은 초기 유닉스에서 쓰였고, 아직까지도 현역으로 쓰이는 본셸(Bourne shell)이 있다. Steve Bourne이 만들었고, 그 이전에 유닉스의 아버지가 만들었던 Thompson shell이 있지만 지금은 쓰이지 않는다.

본셸은 POSIX 표준에 기본 셸로 정해져서 POSIX shell이라고도 부르고, 실행 파일명을 따서 sh shell이라고도 부른다.

(참고) 유닉스 표준(POSIX) - https://sunyzero.tistory.com/306

 

그 후 BSD의 종주 역할을 담당했던 썬 마이크로시스템즈의 Bill Joy에 의해 C셸이 개발되었다. 1972년에 탄생한 C언어의 인기는 1970년대 중반부터 거침이 없었는데, 1978년에 탄생한 C셸은 C언어의 영향을 많이 받았다. C셸은 처음에는 C언어에 인기에 편승하여 종종 사용되었지만, 사실상 Bourne shell과 호환되지 않는 단점과 문법도 좀 요상하고 몇몇 버그로 인해 점점 인기가 없어졌다. 따라서 1990년대 후반이 되자 거의 도태되는 것으로 보였다. 지금은 거의 사용되지 않는다.

 

그 다음에 System V(시스템 파이브)를 이은 상용 유닉스의 표준셸은 sh의 특성을 계승하면서 더 많은 기능을 가진 콘셸(ksh)이 나오게 되었다. 참고로 콘셸의 이름도 만든 사람의 이름인 David Korn에서 따서 만들어졌다. 

이후 콘셸은 유닉스 진영에서 빠르게 기본 셸의 자리를 잡아갔다. 가장 큰 장점은 Bourne shell과 호환된다는 점이 컸다. 호환성의 유지는 컴퓨팅 환경에서 매우 중요한 의미를 가진다는 교훈이 여기도 등장한다. (새로운 기술은 레거시 기술과 호환되지 않으면 성공할 가능성이 매우 낮다.) 그 결과 UNIX98(98년도 유닉스 표준)에서는 ksh를 표준 기능으로 도입하였다. 콘셸은 기본으로 vi 에디팅 모드를 사용했기 때문에 콘셸을 쓰다보면 계속해서 ESC를 치는 자신을 발견하게 된다.

 

2. bash의 등장 (feat. Linux)

리눅스가 등장했을 때 콘셸을 기본셸로 사용하지 못한 것은 라이선스 문제가 제일 컸다. 하지만 POSIX shell을 쓰기엔 기능이 너무 구려서 bash라는 셸이 나오게 되었다. Bash는 Bourne again shell라는 뜻이라고 하는데 기본으로 본셸의 기능을 계승하고, 콘셸의 기능도 포함하고, 추가적인 기능까지 넣어서 만능 셸처럼 쓰였다. 말장난으로 Born again sh로 부르기도 한다.[1]

현재 bash는 리눅스와 Mac OSX의 기본 셸이며 가장 보편적인 셸이다. 요새는 대부분의 상용 유닉스들도 기본 셸로 bash를 쓰는 경우가 많다. (추가 : 추후 Mac OSX는 버전을 업그레이드하면서 기본 셸을 zsh로 변경하였다. 물론 호환성을 위해 bash가 기본으로 설치되기는 한다.)

bash의 특징은 많은 부분의 외부 명령어(external command)들을 내장된 명령어 기능(built-in command)으로 대체했기 때문에 셸 스크립트 작성시 적극적으로 built-in 명령어를 사용하면 성능이 높아지는 장점이 있었다.

 

 

3. zsh (Z shell)의 등장

하지만 bash에도 플러그인 기능이라든지 현대적인 여러가지 기능을 추가하기는 점점 힘들어졌고, 그래서 좀 더 미려한 디자인과 다양한 플러그인을 만들 수 있도록 디자인된 zsh가 나오게 되었다. 개인 유저들 중에는 zsh를 기본 셸로 쓰는 사람들이 많다.

하지만 회사나 기업은 성능이나 여러가지 안정성, 보안 때문에 bash를 쓰는 경우가 많다. zsh의 경우는 각종 플러그인 기능이나 여러가지 검증되지 못한 기능을 사용시 서버에 심각한 위해를 줄 가능성이 높기 때문이다. 따라서 업무용이라면 bash를 쓰는게 좋고, 집에서 사용한다면 bash를 쓰던지 아니면 zsh를 쓰던지 상관은 없다고 생각한다.

 

4. 결론

기본적으로 어떤 리눅스, 유닉스를 쓰더라도 bash는 꼭 알아야 한다. zsh는 bash를 어느 정도 쓰고 난 뒤에 좀 더 새로운 것을 배우기 위해서 사용해보면 좋다.

bash 셸을 제대로 배웠다면 /etc/profile.d/bash.sh 에 다음과 같은 내용을 넣어두고 사용하게 된다. [2]

# /etc/profile.d/bash.sh
if [ $TERM = 'xterm' ]; then
        export TERM=xterm-256color
fi

if [ $UID -eq 0 ]; then
        PS1="\[\e[0;32m\][\D{%H:%M:%S}]\[\e[35m\] \h/58x\[\e[0m\]@\[\e[1;31m\]\u\[\e[0m\]:\w\n# "
else
        PS1="\[\e[1;32m\][\D{%H:%M:%S}]\[\e[35m\] \h/58x\[\e[0m\]@\[\e[1;33m\]\u\[\e[0m\]:\w\n\$ "
fi

# enable i-search shortcut
sttyp stop ''

alias ㅣㄴ='ls'
alias 니='ls'
alias 퍄='vi'
alias ㅊㅇ='cd'
alias ㄹㅎ='fg'

alias enus='export LANG=en_US.UTF-8'
alias kokr='export LANG=ko_KR.UTF-8'
alias jajp='export LANG=ja_JP.UTF-8'

alias mminfo='head -12 /proc/meminfo'
alias pscpu='ps -eo s,pid,ucmd:12,time,cp,pcpu,etime,pmem --sort=-time,-cp | head'
alias psmem='ps -eo s,pid,ucmd:12,cp,etime,pmem,rss,maj_flt --sort=-pmem,-maj_flt | head'
alias pstree='pstree -np'

alias epochtodate='date --date @'

alias usbreload='sudo usbmuxd -u -U usbmux'

# force tmux to assume the terminal supports 256 colors
alias tmux='tmux -2'

alias myip='curl -4 ifconfig.co'
alias forecast='curl v2.wttr.in/Seoul'

alias chksec='sudo dnf listsec'
alias chkcve='sudo dnf --security --sec-severity=Critical check-update'
alias infocve='sudo dnf –sec-severity=Critical updateinfo list'

? () { echo "$*" | bc -l; }

Hexcalc () {
    HexInput=$*
    if [ ${#HexInput} -gt 2 -a ${HexInput:0:2} == '0x' ]; then
        HexInput=${HexInput:2}
    fi
    echo "ibase=16;${HexInput^^}" | bc;
}

# User specific aliases and functions
if [ "$(type -t pathmunge_user)" != 'function' ]; then
    unset pathmunge_user
    pathmunge_user () {
        [ ! -d "$1" ] && return 1
        case ":${PATH}:" in
            *:"$1":*)
                ;;
            *)
                if [ "$2" = "after" ] ; then
                    PATH=$PATH:$1
                else
                    PATH=$1:$PATH
                fi
        esac
    }
fi

FZF_KEY_BINDINGS_FILE=/usr/share/fzf/shell/key-bindings.bash
if [ -f $FZF_KEY_BINDINGS_FILE ]; then
    source /usr/share/fzf/shell/key-bindings.bash
    export FZF_DEFAULT_COMMAND='fd --type f'
    export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border --inline-info'
fi

 

 

[1] 말장난으로 Born again sh라고도 한다. https://www.gnu.org/software/bash/manual/html_node/What-is-Bash_003f.html

[2] 니, 퍄 같은 것은 한영 전환이 잘못된 상태에서 한글타자로 실수하는 것을 막아준다.

반응형
Comments