GNU/Linux Bash Shell Tutorial
___________________________________________________________________

글쓴이: Chongnux Team

       윤영한(shee@chongnux.klug.or.kr)

홈페이지: http://chongnux.klug.or.kr/
작성일: 2001.5.5
버  젼: 1.0
보충 요망:
    
  0. 스크립트 예제 추가
  1. 환경 변수 설정에 대한것


이 문서는 누구나 자유롭게 사용이 가능하며,많은 도움이 되었으면 합니다.
( 단, 상업적일 경우 Chongnux Team의 허락이 있어야 합니다. )
___________________________________________________________________

목차
0. 개요
1. GNU/Linux Shells
2. Bash는  GNU project's shell
2.1. 쉘의 선택은 계정 생성에서 부터
2.2. Bash의 환경 설정 화일들
2.3. Bash의 내장 명령어들
2.4. Bash의 메타 문자
3.파이프라인
4.리다이렉션(REDIRECTION)
5.입력 리다이렉션
6.출력 리다이렉션
7.추가 출력 리다이렉션
8.표준 출력과 표준 에러 리다이렉션
9.파일
10. 간단한 스크립트
11. 결론
12. 참고 자료



___________________________________________________________________

0. 개요
  쉘은  GNU/Linux 명령어 해석기이다. 즉 사용자와 순수 시스템 간의 매
  개적인 역할을 수행하는 프로그램이다. 사용자의 명령을 시스템에 넘겨
  주고 그 결과 값을 사용자에 넘겨주는 역할 뿐 아니라, 다양한 역할을
  수행하며 사용자에게 좀더 좋은 환경을 제공해준다. 쉘은 상호작용적으
  로 사용가능하며, 스크립트의 특성을 십분 발휘 할 수 있는 쉘 프로그래
  밍을 가능하게 해준다.

  쉘의 핵심적인 기능은 다음과 같다.

  쉘 기능
   + 내장 명령어
   + 스크립트
   + 변수
      + 지역
      + 환경
   + 리다이렉션
   + 대표 문자
   + 파이프
   + 명령열
      + 조건부
      + 무조건부
   + 서스쉘
   + 후면 처리
   + 명령어 치환

1. GNU/Linux Shells

  ash  - 시스템 V 쉘과 유사한 a 버젼의 쉘
  csh - C 언어와 가까운 쉘        
  ksh*  - Public domain Korn 쉘을 시작하는 명령어
  tcsh  - C 쉘
      tcsh 쉘은 프로그램 실행, 파일이나 디렉토리를 관리등을 사용자가 할수 있도록
      도와준다. 보편적으로 많이 사용하는 쉘은 아니다.
  zsh - the Z shell
      Zsh은 상호작용적인 로긴 쉘이나 쉘 스크립트 명령어 프로세서로 사용되는
      UNIX 명령어 해석기이다.
  bash -  sh-호환의 명령  언어  해석기로서  표준  입력  또는 파일로부터
     읽어들인 명령을 실행한다.  Bash 는 또한  콘쉘과 C 쉘(ksh,csh)
     로부터 유용한 기능을 도입한 쉘.
     도스의 command.com과 유사한 기능을 한다. 사용자가 어떤 명령어를
     실행하면 맨 처음으로 bash 명령어를 해석하고 그 명령어를 실행시켜
     주고 물러난다.

2. Bash는  GNU project's shell
  GNU/Linux에서 대부분 Bash 쉘을 사용한다. GNU 프로젝트의 산물로서
  현재 지속적인 발전을 하고 있는 프로그램이다.

2.1. 쉘의 선택은 계정 생성에서 부터
  사용자 쉘의 선택은 맨처음 계정 생성 부터 시작 된다. 일반적으로
  계정 생성 명령어 ( adduser )의 기본 디폴트 쉘은 Bash이다. 하지만
  계정 생성후 사용자는 패스워드 화일이나 명령어를 통해서 다름 쉘로
  변환이 가능하며 언제든지 원하는 쉘로 사용할 수 있다.

  예)
        [root@chongnux /root]# adduser username
        [root@chongnux /root]# passwd username
        Changing password for user username
        New UNIX password:
        BAD PASSWORD: it is too short
        Retype new UNIX password:
        passwd: all authentication tokens updated successfully
        [root@chongnux /root]# cat /etc/passwd | grep username
        username:x:544:544::/home/username:/bin/bash

   위와 같은 계정 생성시 기본 쉘은 bash이다. 그리고 또한 계정
   생성시 쉘을 지정할 수 있으며 생성후에도 직접 패스워드 화일
   을 수정하면 쉘을 바꿀 수 있다.
        [root@chongnux /root]# adduser -s /bin/csh username
        [root@chongnux /root]# passwd username
        Changing password for user username
        New UNIX password:
        BAD PASSWORD: it is too short
        Retype new UNIX password:
        passwd: all authentication tokens updated successfully
        [root@chongnux /root]# cat /etc/passwd|grep username
        username:x:544:544::/home/username:/bin/csh

2.2. Bash의 환경 설정 화일들
  환경 설정 화일들은 사용자 쉘을 초기화 해주는 역할을 한다.
  bash의 환경 설정 화일은 생성된 계정 디렉토리에 .bashrc
  .bash_logout, bash_profile로 초기화가 되어 진다.

  예) Redhat GNU/Linux
  [root@chongnux username]# pwd
  /home/username
  [root@chongnux username]# ls -la | grep .bash
  -rw-r--r--    1 username username       24  5월  5 11:25 .bash_logout
  -rw-r--r--    1 username username      230  5월  5 11:25 .bash_profile
  -rw-r--r--    1 username username      124  5월  5 11:25 .bashrc

  .bashrc의 역할은 쉘을 초기화 해주는 역할을 한다.
  [root@chongnux username]# cat .bashrc
  # .bashrc

  # User specific aliases and functions

  # Source global definitions
  if [ -f /etc/bashrc ]; then
          . /etc/bashrc
  fi
  
  위의 내용을 보면 전체 환경 설정에 관한 것들이 /etc/bashrc라는 화일에
  정의 되어 있음을 알 수 있다.

  [root@chongnux username]# cat /etc/bashrc
  # /etc/bashrc

  # System wide functions and aliases
  # Environment stuff goes in /etc/profile

  # are we an interactive shell?
  if [ "$PS1" ]; then
      if [ -x /usr/bin/tput ]; then
        if [ "x`tput kbs`" != "x" ]; then # We can't do this with "dumb" terminal
          stty erase `tput kbs`
        fi
      fi
      case $TERM in
         xterm*)
              PROMPT_COMMAND='echo -ne "33]0;${USER}@${HOSTNAME}: ${PWD}07"'
              ;;
          *)
              ;;
      esac
      [ "$PS1" = "\s-\v\$ " ] && PS1="[u@h W]\$ "
      if [ "x$SHLVL" != "x1" ]; then # We're not a login shell
          for i in /etc/profile.d/*.sh; do
             if [ -x $i ]; then
                 . $i
             fi
          done
      fi
  fi

  위의 내용들은 기본적으로 지금 우리가 사용하고 있는 프롬프트,
  즉 [root@chongnux username]$ 이 나오게 해주는 초기화 부분이
  포함되어 있으며, 기타 쉘의 환경을 초기화 해주는 루틴이 포함
  되어 있다.

  
  .bash_profile 은 사용자 쉘 환경 변수를 초기화 해준다.
  [root@chongnux username]# cat .bash_profile
  # .bash_profile

  # Get the aliases and functions
  if [ -f ~/.bashrc ]; then
          . ~/.bashrc
  fi

  # User specific environment and startup programs

  PATH=$PATH:$HOME/bin
  BASH_ENV=$HOME/.bashrc
  USERNAME=""

  export USERNAME BASH_ENV PATH

  사용자의 환경 변수는 다음과 같은 명령어로 확인 할 수 있다.
  [username@chongnux ~]$ env | more
  TERM=xterm-color
  DISPLAY=:0.0
  HOME=/home/username -> 사용자 디렉토리
  SHELL=/bin/csh      -> 계정 생성시 지정한 쉘로 환경 변수가 세팅 됨
  USER=username
  LOGNAME=username
  PATH=/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin
  HOSTTYPE=i386-linux
  VENDOR=intel
  OSTYPE=linux
  MACHTYPE=i386
  SHLVL=1
  PWD=/home/username
  GROUP=username
  HOST=chongnux.klug.or.kr
  LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi
  =01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=
  01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*
  .gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=
  01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
  SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
  KDEDIR=/usr
  LANG=en_US
  LESSOPEN=|/usr/bin/lesspipe.sh %s
  QTDIR=/usr/lib/qt-2.2.0
  HOSTNAME=chongnux.klug.or.kr

  .bash_logout 로그 아웃시 실행되는 것들에 대하여 설정되어 있다.
  [username@chongnux ~]$ cat .bash_logout
  # ~/.bash_logout

  clear

  
2.3. Bash의 내장 명령어들
  
  내장 명령어는 외장 명령어 실행하는 방식인 환경변수중 경로를
  찾어서 명령어가 있는 지 확인후 명령어를 실행하는 방식이 아닌
  쉘 자체에 내장되어 있는 명령어를 바로 실행한다.
  
  내장 명령어를 확인하기 위하여 info 명령어를 이용한다.
  [root@chongnux ] # info bash 한후 리스트에 있는 것중
  다음과 같은 라인에서 엔터를 치면 다음과 같이 상세 내용이
  나온다.

  Index of Shell Builtin Commands
  *******************************

  * Menu:

  * .:                                     Bourne Shell Builtins.
  * ::                                     Bourne Shell Builtins.
  * [:                                     Bourne Shell Builtins.
  * alias:                                 Bash Builtins.
  * bg:                                    Job Control Builtins.
  * bind:                                  Bash Builtins.
  * break:                                 Bourne Shell Builtins.
  * builtin:                               Bash Builtins.
  * cd:                                    Bourne Shell Builtins.
  * command:                               Bash Builtins.
  * compgen:                               Programmable Completion Builtins.
  * complete:                              Programmable Completion Builtins.
  * continue:                              Bourne Shell Builtins.
  * declare:                               Bash Builtins.
  * dirs:                                  Directory Stack Builtins.
  * disown:                                Job Control Builtins.
  * echo:                                  Bash Builtins.
  * enable:                                Bash Builtins.
  * eval:                                  Bourne Shell Builtins.
  * exec:                                  Bourne Shell Builtins.
  * exit:                                  Bourne Shell Builtins.
  * export:                                Bourne Shell Builtins.
  * fc:                                    Bash History Builtins.
  * fg:                                    Job Control Builtins.
  * getopts:                               Bourne Shell Builtins.
  * hash:                                  Bourne Shell Builtins.
  * help:                                  Bash Builtins.
  * history:                               Bash History Builtins.
  * jobs:                                  Job Control Builtins.
  * kill:                                  Job Control Builtins.
  * let:                                   Bash Builtins.
  * local:                                 Bash Builtins.
  * logout:                                Bash Builtins.
  * popd:                                  Directory Stack Builtins.
  * printf:                                Bash Builtins.
  * pushd:                                 Directory Stack Builtins.
  * pwd:                                   Bourne Shell Builtins.
  * read:                                  Bash Builtins.
  * readonly:                              Bourne Shell Builtins.
  * return:                                Bourne Shell Builtins.
  * set:                                   The Set Builtin.
  * shift:                                 Bourne Shell Builtins.
  * shopt:                                 Bash Builtins.
  * source:                                Bash Builtins.
  * suspend:                               Job Control Builtins.
  * test:                                  Bourne Shell Builtins.
  * times:                                 Bourne Shell Builtins.
  * trap:                                  Bourne Shell Builtins.
  * type:                                  Bash Builtins.
  * typeset:                               Bash Builtins.
  * ulimit:                                Bash Builtins.
  * umask:                                 Bourne Shell Builtins.
  * unalias:                               Bash Builtins.
  * unset:                                 Bourne Shell Builtins.
  * wait:                                  Job Control Builtins.


  리스트중에 다시 한번더 클릭을 하면 상세 사용 설명이 나온다.

  alias위에서 엔터를 치면 다음과 같이 나온다.

  `alias'
          alias [`-p'] [NAME[=VALUE] ...]

     Without arguments or with the `-p' option, `alias' prints the list
     of aliases on the standard output in a form that allows them to be
     reused as input.  If arguments are supplied, an alias is defined
     for each NAME whose VALUE is given.  If no VALUE is given, the name
     and value of the alias is printed.  Aliases are described in *Note
     Aliases::.

  
  
2.4. Bash의 메타 문자

  메타 문자는 어떤 문자들을 특수하게 처리하는데, 이러한 문자들을 가리
  킨다. 여러가지 쉘들은 이러한 메타 문자를 공유하고 있다.



  기호      ||   의   미  
  -------------------------------------------------------------------
   >        ||   표준 출력을 화일에 기록하는 출력 리다이렉션
   >>       ||   표준 출력을 화일 끝에 덧붙이는 출력 리다이렉션
   <        ||   화일로 부터 표준 입력을 읽는 입력 리다이렉션
   *        ||   0개 이상의 문자와 일치하는 화일 치환 대표 문자
   ?        ||   단일 문자와 일치하는 화일 치환 대표 문자
  [...]     ||   대괄호 사이의 어떤 문자와도 일치하는 화일 치환 대표 문자
  `command` ||   command 로 부터의 출력에 의해 디치되는 명령어 치환
   |        ||   어떤 프로세스의 출력을 다른 프로세스의 입력으로 보내는 파이프 기호
   ;        ||   명령어 순서에 사용
   ||       ||   이전의 명령이 실패하면 실행하는 조건부 실행
   &&       ||   이전의 명령이 성공하면 실행하는 조건부 실행
   (...)    ||   그룹 명령어
   &        ||   명령어를 후면에서 실행
   #        ||   newline 문자까지 뒤다르는 모든 문자들을 주석으로 처리
   $        ||   변수 접근
   <<   ||   스크립트로부터 file까지 표준 입력을 읽는 입력 디

3.파이프라인
       파이프라인이란   |  문자로  구분된  한  개  이상의  명령이
       연속되어 나오는 것을 말한다.  파이프라인의  형식은  다음과
       같다:
              [ ! ] 명령 [ | 명령2 ... ]
       명령  의  표준  출력은  명령2  의  표준 입력으로 연결된다.
       파이프  라인  연결은  명령에서  명시한  리다이렉션  이전에
       수행된다.  ( 리다이렉션 참고 ).
       예약어인  !   가  파이프라인 앞에 나오면 파이프라인의 종료
       상태 값을 마지막 명령의 종료 상태에 대한  논리적인  NOT으로
       설정한다.   그렇지  않은  일반적인  경우에는 마지막 명령의
       종료 상태값이 파이프라인의 종료 상태 값으로 된다.  쉘은  값을
       반환하기  전에  파이프라인에  연결되어  있는  모든  명령이
       종료하기를 기다린다.
       파이프라인의 각 명령은 개별적인  프로세스로  실행된다.(즉,
       각자의 서브쉘 안에서 실행된다.)

  예)
  [root@chongnux /tmp]# cat > catfile          
  이 파일은 cat 명령을 사용해서 만든 것입니다.
  간단한 글을 쓸 때 주로 사용됩니다.
  마지막에 저장하는 것은 ^D를 하면 저장이 됩니다.
  [root@chongnux /tmp]# cat catfile |grep cat
  이 파일은 cat 명령을 사용해서 만든 것입니다.
  [root@chongnux /tmp]#


4.리다이렉션(REDIRECTION)
       명령이  실행되기에 앞서 쉘에 의해 특별하게 해석되는 표시를
       사용하여 입력과 출력을 방향 전환  또는  리다이렉트  할  수
       있다.   현재 쉘 실행 환경에 대하여 파일을 열고 닫는 용도로
       리다이렉션을 사용할 수도 있다.  다음에  나오는  리다이렉션
       연산자는 간단한 명령 의 앞 또는 중간에 오거나 명령 의 뒤에
       온다.  리다이렉션은 왼쪽부터  오른족으로  나타난  순서대로
       처리한다.
       다음   설명에   있어  파일  기술자  번호가  생략되어  있고
       리다이렉션 연산자의 첫번째 문자가 < 이면  이  리다이렉션은
       표준   입력(파일  기술자  0  번)을  가리킨다.   리다이렉션
       연산자의  첫번째  문자가  >  이면  이  리다이렉션은   표준
       출력(파일 기술자 1 번)을 가리킨다.
       리다이렉션  연산자  다음에 나오는 단어는 중괄호 확장, 틸드
       확장, 매개변수 확장, 명령 치환, 연산  확장,  쿼우트  제거,
       경로명  확장을  거친다.  한 개 이상의 단어로 확장될 때에는
       bash 가 에러를 보고한다.
       리다이렉션의 순서가 매우 중요하다.  예를 들어, 다음 명령
              ls > dirlist 2>&1
       는 표준 출력과 표준 에러 모두 dirlist 파일로 보내지만 다음
       명령
              ls 2>&1 > dirlist
       오로지  표준  출력만  dirlist 파일로 보낸다. 왜냐하면 표준
       출력이 dirlist 파일로 방향 전환되기 전에 표준 에러가  표준
       출력으로 복제되었기 때문이다.


5.입력 리다이렉션
       입력 리다이렉션은 파일 기술자 n 또는 n 이 생략된 경우 표준
       입력 (파일 기술자 0)으로 읽기 위해 단어 를  확장하여  나온
       이름의 파일을 오픈 하게 만든다.
       입력 리다이렉션의 일반적인 형식은 다음과 같다:
              [n]<단어


  예)
  [root@chongnux /tmp]# cat > mail_content
  이것은 메일의 본문 내용입니다.
  이렇게 글을 작성한 후에 입력 리다이렉션을 이용해서
  메일을 보낼 수 있습니다.
  [root@chongnux /tmp]# ls
  mail_content
  [root@chongnux /tmp]# mail shee@chongnux.klug.or.kr < mail_content


6.출력 리다이렉션
       출력 리다이렉션은 파일 기술자 n 또는 n 이 생략된 경우 표준
       출력 (파일 기술자 1)으로 쓰기 위해 단어 를  확장하여  나온
       이름의 파일을 오픈하게 만든다.
       출력 리다이렉션의 일반적인 형식은 다음과 같다:
              [n]>단어
       리다이렉션  연산자를  >|  와  같이 적으면, set 내부 명령에
       대한 -C 옵션 값을 점검하지 않고 파일 생성을  시도한다.  


  예)
  [root@chongnux test]# ls -la
  total 6
  drwxr-xr-x   2 root     root         1024 Feb 28 12:31 ./
  drwxrwxrwt  13 root     root         5120 Feb 28 12:31 ../
  [root@chongnux test]# ls -la > ls_file
  [root@chongnux test]# ls
  ls_file
  [root@chongnux test]# cat ls_file
  total 6
  drwxr-xr-x   2 root     root         1024 Feb 28 12:31 ./
  drwxrwxrwt  13 root     root         5120 Feb 28 12:31 ../
  -rw-r--r--   1 root     root            0 Feb 28 12:31 ls_file


7.추가 출력 리다이렉션
       추가 출력 리다이렉션은 파일 기술자 n 또는 n 이 생략된 경우
       표준 출력  (파일  기술자  1)으로  추가하기  위해  단어  를
       확장하여  나온  이름의  파일을  오픈하게  만든다.   파일이
       존재하지 않으면 생성한다.
       출력 추가하기의 일반적인 형식은 다음과 같다:
              [n]>>단어

  예)
  [root@chongnux test]# cat >line_add
  이것은 추가 출력 리다이렉션입니다.
  [root@chongnux test]# cat line_add
  이것은 추가 출력 리다이렉션입니다.
  [root@chongnux test]# echo 이것은 추가한 내용입니다. >> line_add
  [root@chongnux test]# cat line_add
  이것은 추가 출력 리다이렉션입니다.
  이것은 추가한 내용입니다.



8.표준 출력과 표준 에러 리다이렉션
       Bash 는  지금  설명할  표기법을  사용하여  표준  출력(파일
       기술자  1)과  표준  에러 출력(파일 기술자 2) 둘 다 단어 의
       확장 결과 나오는 이름의 파일로 방향 전화시킬 수 있다.
       표준 출력과 표준  에러를  동시에  리다이렉트하는  두  가지
       형식이 있다:
              &>단어
       and
              >&단어
       두  가지  형식 중 첫번째 것을 선호한다.  Of the two forms,
       the first  is  preferred.   위  형식은  다음과  문법적으로
       동일하다.
              >단어 2>&1

  예)
  [root@chongnux test]# 이상명령어
  bash: 이상명령어: command not found
  [root@chongnux test]# 이상명령어 > 에러 2>&1
  [root@chongnux test]# ls
  에러
  [root@chongnux test]# cat 에러
  bash: 이상명령어: command not found
  [root@chongnux test]#



9.파일
       /bin/bash
              bash 실행파일
       /etc/profile
              시스템 전역 초기화 파일로서 로그인 쉘에서 실행
       ~/.bash_profile
              개인 초기화 파일로서 로그인 쉘에서 실행
       ~/.bashrc
              각각의 대화형 쉘에 대한 개별 시동 파일
       ~/.inputrc
              개별적인 readline 초기화 파일

10. 간단한 스크립트

시스템의 부하에 따라서, 호스트 이름의 색깔을 밝게 혹은 흐리게 합니다.
#!/bin/bash
#   "hostloadcolour" - 17 October 98, by Giles
#
#   The idea here is to change the colour of the host name in the prompt,
#   depending on a threshold load value.
# THRESHOLD_LOAD is the value of the one minute load (multiplied
# by one hundred) at which you want
# the prompt to change from COLOUR_LOW to COLOUR_HIGH
THRESHOLD_LOAD=200
COLOUR_LOW='1;34'
          # light blue
COLOUR_HIGH='1;31'
           # light red
function prompt_command {
ONE=$(uptime | sed -e "s/.*load average: (.*...), (.*...),
(.*...)/1/" -e "s/ //g")
#   Apparently, "scale" in bc doesn't apply to multiplication, but does
#   apply to division.
ONEHUNDRED=$(echo -e "scale=0 n $ONE/0.01 nquit n" | bc)
if [ $ONEHUNDRED -gt $THRESHOLD_LOAD ]
then
    HOST_COLOUR=$COLOUR_HIGH
        # Light Red
else
    HOST_COLOUR=$COLOUR_LOW
        # Light Blue
fi
}
function hostloadcolour {
PROMPT_COMMAND=prompt_command
PS1="[$(date +%H%M)][u@[33[$(echo -n
$HOST_COLOUR)m]h[33[0;37m]:w]$ "
}

]# vi hostloadcolour  ->  내용을 마우스로 드레그 해서 붙입니다.
]# chmod +x  hostloadcolour -> 실행 퍼미션을 준다.
]# source hostloadcolour -> 설정을 재로드 한다.
]# ./hostloadcolour  -> 실행을 한다.

11. 결론
   쉘은 사용자에게 많은 이점을 제공한다. 우리가 한텀이나 엑스텀을 열고 사용할때
   도 쉘은 동작되고 있으면 우리에게 좀더 펀한 사용자 환결을 제공해준다.
  
   쉘의 기본기능 중 내장 명령어, 스크립트, 변수(지역,환경), 리다이렉션, 대표문자
   파이프,명령열(조건부, 무조건부), 서브쉘, 후면 처리, 명령어 치환과 같은 것들이
   있다. 현재 GNU/Linux 시스템에서 가장 많이 사용되고 있는 스크립트 또한 bash
   스크립트 들이다.

12. 참고 자료
  - GNU/Linux 메뉴얼 페이지 ( man bash, info bash )
  - Unix 완성 Graham Glass 저, 조경산 역, 이한 출판사 [p 153~]12. 참고 자료 

+ Recent posts