블로그 이미지
좋은느낌/원철
이것저것 필요한 것을 모아보렵니다.. 방문해 주셔서 감사합니다..

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

    2008. 12. 11. 17:48 개발/Linux 계열

    (리눅스) 리눅스 쉘

    영어단어 Shell (쉘)은 조개 껍데기란 뜻이 있죠? 여기서 말하는 '쉘'은 그 내용물인 OS를 둘러싸고 있는 껍질과 같습니다. 즉, OS와 사용자가 의사소통을 하기 위한 대화형 환경입니다.
    여러분이 명령어를 입력하면, 그 명령을 쉘이 해석하여 운영체제에게 전달합니다.

    쉘이란

    컴퓨터는 0과 1만을 이해할 수 있습니다. 하지만, 사람이 컴퓨터가 이해할 수 있는 0과 1만을 사용하여 명령을 내리기는 쉽지 않은 일입니다. 그래서 쉘이라는 것이 명령어를 입력받아 이것을 컴퓨터가 이해할 수 있는 0과 1로 된 명령으로 바꾸어, 이 명령을 처리하는 커널에 전달하는 것입니다.

    사용자가 로그인 할 때 자동적으로 쉘이라는 프로그램이 실행됩니다.

    쉘에는 여러 종류가 있으나, 큰 갈래로는 Bourne Shell 과 C shell이 있습니다. 나머지들은 이들로부터 파생된 것들입니다.

    이중 리눅스에서 기본적으로 사용하고 있는 쉘은 bash 쉘로 Bourne Again Shell이란 뜻입이죠. 이것 역시 Bourne Shell로부터 파생된 것입니다. 사용자가 원한다면, 사용하고자 하는 쉘을 변경할 수도 있습니다.

    쉘이 프롬프트에 사용하는 기호는 쉘마다 다른데, 기본적으로 본 쉘과 콘쉘은 "$"을, C쉘은 "%"을 사용합니다.

    /etc/shells 파일을 열어 보면 사용할 수 있는 쉘들의 경로가 설정되어 있습니다.

    /etc/passwd 파일을 살펴보면, 다음과 같이 사용자가 등록되어 있습니다.

        test1:x:502:502:Test User:/home/test1:/bin/bash

    마지막 항목(/bin/bash)이 사용자가 사용하는 쉘입니다.
    이 사용자가 로그인 할 수 없도록 하려면, 이 부분을 /bin/false 로 변경합니다. 그러면, 명령어을 처리하는 쉘을 얻지 못하므로 어떤 명령도 수행할 수가 없습니다.

    사용자 쉘 바꾸기

    먼저, 현재 사용하고 있는 쉘을 확인해 봅시다.

    잠시 바꾸고 싶을 때는 사용하려는 쉘을 프롬프트에서 실행 시킵니다.
    그 쉘을 빠져나겨려면, 'exit' 명령을 사용합니다.
    기본 쉘을 변경하고 싶을 때는 chsh 명령을 사용하거나, /etc/passwd 파일의 쉘 부분을 변경 합니다.

     

    쉘 환경 설정

    설정 파일

    리눅스에서는 여러 가지 환경 설정 파일을 제공합니다. 이것은 리눅스의 사용자를 더욱 자유롭고 융통성 있게 만들어 줍니다. 이런 파일들은 보통 홈디렉토리 안에 위치하고 있으며,  '.'으로 시작 하는 파일들입니다. 'ls -a' 명령으로 파일의 존재를 확인할 수 있습니다. 파일의 이름은 "Resource Configuration"이라는 의미의 "rc"라는 스펠링으로 끝나는 경우가 많습니다.

    이런 파일들은 새로운 사용자를 등록하면, "/etc/skel " 디렉토리에 기본 값으로 저장되어 있는 파일들을 홈디렉토리에 복사하여 생겨나는 것입니다.

    물론, 그 중에는 쉘 구동 환경을 설정하는 파일들도 있습니다.
     

    [환경 설정 파일 설명 표]  

    파 일

    설  명

    .bashrc

    쉘을 위한 쉘 스크립트로 서브 쉘, 즉 비로그인 쉘이 실행될 때 명령과 프로그램 구조로 구성할 수 있다.
    새로운 쉘이 실행될 때마다 실행.
     

    .bash_profile

    로그인 할 때 읽어 들이는 설정 파일.
    주요 설정 내용은 일반적으로,
    검색 경로, 터미널 종류, 환경변수등을 설정하고, 그 외 로그인 시점에 실행 시키고 싶은 명령, 시스템에 대한 정보를 보여주는 명령등을 수행한다.

    .bash_logout

    로그인 쉘이 종료 되면서 읽어 들인다.

     

    환경 변수

    환경 변수는 쉘 환경을 입맛에 맞게, 혹은 필요에 맞게 설정하는데 사용되는 값들을 가지고 있습니다. 물론, 이 변수값을 수정함으로써 사용자마다 원하는 환경을 설정할 수 있습니다.

    [주요 환경 변수들]

    변수

    설 명

    DISPLAY

    현재 X 윈도우 Display 위치

    HOME

    사용자 홈 디렉토리

    HOSTNAME

    호스트 명

    PATH

    명령어 검색 경로

    PS1

    프롬프트 설정값

    PWD

    현재 작업 디렉토리

    SHELL

    사용하는 쉘

    TERM

    터미널 종류

    MANPATH

    man 페이지 경로

    LS_COLORS

    ls 명령에서 파일 종류별 색상 지정값

     

    환경 변수값 확인

        - 하나씩 확인

            # echo  $변수명   혹은    #printenv  변수명

        - 현재 설정된 변수값 모두 확인

            # printenv

     

    환경 변수값 설정/변경

        export  [환경 변수 명]=[변수 값]

        혹은

        ~/.bash_profile 내의 변수값 설정/변경
        --> 이 파일을 수정하면 쉘 실행시마다 변경할 필요가 없다.
            변수명=변수값  

    쉘  잘 사용하기

    쉘 프롬프트 상에서 명령을 수행하는데 알고 있으면 매우 편리한 몇가지 기능들이 있습니다.

    - 명령 완성 기능

          명령어가 길거나, 이름의 일부만 생각날 경우, 명령어의 일부만 입력하고 'Tab' 키를 입력하면, 가능한 명령어를 완성시켜 줍니다. 만일, 해당하는 명령어가 둘 이상인 경우, 해당하는 명령어의 리스트를 보여줍니다.

    - 화살표 키로 사용했던 명령어 찾아내기

          전에 사용했던 명령을 다시 사용하고 싶은 경우, 아래, 위 화살표를 사용하여, 사용했던 명령어를 아래,위로 검색해 낼 수 있고, 원하는 명령을 실행할 수 있습니다. 여기 나타나는 명령어들은 '~/.bash_history' 파일에 저장되어 있습니다. 저장되는 명령어의 갯수는 HISTSIZE 변수로 결정됩니다.

    - 마우스로 텍스트 복사하기

       X window를  사용하는 경우, 여러개의 터미널을 띄우고, 여러개의 작업을 동시에 수행할 수 있습니다.
       이 경우, 이쪽 터미널에서 저쪽 터미널로 어떤 텍스트를 복사하고자 한다면, 마우스로 원하는 부분을 드래그 하고, 복사되기 원하는 위치로 가서, 가운데 버튼, 2번튼인 경우 두 개 버튼을 동시에 누르면 복사 됩니다. 물론, 에디터에서 에디터로의 복사도 가능합니다.

    - 여러개의 콘솔화면 사용하기

      Remote로 떨어져 있는 터미널에서 telnet으로 접속한 경우가 아니고, 서버에 연결되어 있는 콘솔에서 여러개의 콘솔을 이동하며 사용할 수 있습니다. Alt+F1 ~ F6를 눌러 이동하면서 사용할 수 있습니다.
      X 서버도 여러개 띄우기

    - 명령에 메타문자 사용하기

          명령어에 파일을 인수로 사용할 경우, 하나가 아닌 여러개를 동시에 지정할 필요가 있을 때, 파일을 하나씩 처리한다면, 매우 불편할 것입니다. 이런 작업을 쉽게 하기 위해 와일들카드를 사용합니다.

          ? : 어떤 문자이던지 한문자

          * : 어떤 문자도 없거나, 그 이상인 경우

      지우고자 하는 파일 이름이  'test'로 시작하고 다섯글자인 파일이면,

          # rm test?

      지우고자 하는 파일 이름이 'test'로 시작하는 모든 파일이면,

          # rm test*

      와 같이 사용합니다.  

      그 외에 사용되는 특수 문자들은 다음과 같습니다. 이러한 문자를 메타문자라고 합니다.
      이 문자들을 명령어 사용시 함께 사용하면, 그 문자 나름대로의 기능을 수행하게 됩니다.

    문자

    의  미

    >

    표준출력을 파일에 기록하는 출력 리다이렉션

    >>

    표준 출력을 파일 끝에 덧붙이는 출력 리다이렉션

    <

    파일로부터 표준 입력을 읽는 입력 리다이렉션

    *

    0개의 이상의 문자와 일치하는 파일 치환 대표 문자

    ?

    단일 문자와 일치하는 파일 치환 대표 문자

    [...]

    대괄호 사이의 어떤 문자와도 일치하는 파일 치환 대표문자

    |

    어떤 프로세스의 출력을 다른 프로세스의 입력으로 보내는 파이프 기호

    ;

    명령 순서에 사용

    ||

    이전의 명령이 실패하면 실행하는 조건부 실행

    &&

    이전의 명령이 성공하면 실행하는 조건부 실행

    &

    명령어를 백그라운드로 실행

    #

    # 문자에 뒤따르는 모든 문자들을 주석 처리

    $

    변수 접근

     

    입출력을 다른쪽으로!

    리눅스에서 명령을 수행할 때, 표준 입력/출력 장치가 있습니다.
    보통 표준 입력은 키보드, 표준 출력은 모니터가 될 것입니다.
    필요에 따라서 이 입출력 대상을 변경할 수 있습니다.

    예를들어, 명령의 실행 결과를 화면에 뿌리지 않고, 파일로 저장하고 싶은 경우에 출력을 모니터가 아닌, 결과를 지정 할 파일을 지정하거나, 반복되는 입력이 필요한 경우, 입력해야할 데이터를 파일에 저장하여, 표준 입력을 키보드가 아닌, 이 파일로 저장하려는 경우 등에 사용됩니다.

    명령

    설 명

    명령 > 파일명

    명령 실행 결과를 파일로 출력

    명령 >> 파일명

    명령 실행 결과를 이 파일에 덧붙여 출력

    명령 >& 파일명

    명령 실행 결과와 에러를 파일로 출력

    명령 >>& 파일명

    명령 실행 결과와 에러를 이 파일에 덧붙여 출력

    명령 >! 파일명

    명령 실행 결과를 이 파일이 이미 존재하더라도 무시하고 출력

    명령 >&! 파일명

    명령 실행 결과와 에러를 이 파일이 이미 존재하더라도 무시하고 출력

    명령1 | 명령2

    명령1의 Output을 명령2의 Input으로 사용하여 실행

    [사용예]

    # find  /home  -name  *.conf  >  ../find_results.txt  

    찾은 결과를  부모 디렉토리에 find_results.txt 라는 이름의 파일로 저장한다.

    # ls -al  | grep  conf

    'ls -al' 명령의 Output을  'grep  conf' 명령의 Input으로 사용하는 명령입니다.

    Background 와  Foregound 작업

    리눅스에서는 명령을 '백그라운드'로 수행하는 것이 가능합니다. 터미널 상의 명령 프롬프트 상에서 명령어를 수행할 때, 이것을 '백그라운드'로  처리하려면, 수행하려는 명령 뒤에 ' &'를 붙여 수행합니다. 이것은 명령 수행으로부터 발생하는 Output 조차도 보이지 않는 것을 의미하는 것은 아닙니다. 다만, 백그라운드로 실행되고 있는 명령과 상관없이 명령 프롬프트 상에서 다른 작업을 수행할 수 있는 것입니다. 그러므로, 화면으로 Output을 나타내고 싶지 않다면, 출력을 재지정하여, 명령을 수행하는 것이 유용합니다.

    [백그라운드 작업을 위한 명령어]

    명령

    설 명

    jobs

    현재 백그라운드로 수행되고 있는 작업이 어떤 것이 있는지 list를 보여 줍니다.

    # find / -name  *.conf  &
    # jobs
    [1]+  Running        find / -name  *.conf  &

    작업번호  상태       수행 명령
    의 순으로 보여줍니다.

    fg

    백그라운드로 수행되고 있는 작업을 Foreground로 실행 시키려 할 때 사용하며, 백그라운드로 수행중인 작업이 여러개인 경우, 작업의 번호, 혹은 같은 명령이 수행되고 있는 경우가 아니라면, 그 명령어를 적어줍니다.

    # fg

    혹은 수행해야할 작업이 여러개라면 작업 번호를 인수로 준다.

    # fg 1
    find / -name  *.conf
     

    Ctrl+Z

    전면에 수행되고 있는 명령을 잠시 멈추는 명령으로, 끝내는 것이 아니고, 잠시 멈추는 것입니다.

    # Ctrl+Z
    [1]+  Stopped        find / -name  *.conf  
     

    bg

    현재 멈춰진 명령을 다시 수행 시키되 백그라운드로 수행시키려 할 때 사용합니다.

    # bg  

    혹은 수행해야할 작업이 여러개라면 작업 번호를 인수로 준다.

    # bg 1
    [1]+  find / -name  *.conf  &
     

    Ctrl+C

    Foreground로 수행중인 명령을 중지, 끝내고 싶은 경우 사용합니다. 작업이 바로 종료됩니다.

     

    쉘 스크립트

    쉘에서는 명령이 입력되자마자 실행되는 인터프리터 환경을 제공합니다. 즉, 컴파일 같은 작업이 필요 없이 텍스트 파일 안에 명령 프롬프트에서 실행이 가능한 명령들을 적고, 이 파일에 실행권한을 주고, 명령어 라인에서 명령어 처럼 실행 시키면, 마치 프로그램 처럼 실행이 됩니다. 이런 것을 '쉘 스크립트'라고 합니다. 이 쉘 스크립트에서는 여러개 명령어들을 연속적으로 실행시킬 수 있으며, 제어문과 변수 선언 등이 가능한 프로그래밍 언어와 유사합니다.

    쉘 스크립트를 사용하는 이유는,
        - 어떤 작업을 자동으로 수행하도록 하여 시스템 관리를 쉽고 효율적으로 만들기 위해서

    라는 것이 가장 큰 이유일 것입니다.
    실제로 처음 리눅스를 설치했을 때도, 이미 시스템 관리를 쉽도록 하기 위한 많은 쉘 스크립드들이 존재 합니다.

    사실 명령을 실행시키는데 있어서는 쉘 종류에 따른 차이점을 크게 느낄 수 없지만, 쉘 프로그래밍을 하게 되면 그 차이점을 더 많이 느낄 수 있습니다. 사용하는 함수나, 문법등에 차이가 있습니다. 여기서는 리눅스의 기본 쉘인 bash를 기준으로 설명하며, 자세한 프로그래밍 방법을 설명하려는 것이 아니라, 쉘 프로그래밍의 능력과 필요성을 아는 것이 목적입니다.

    [bash 쉘 스크립트 예제]

    #!/bin/bash
    # 기능 : 검색대상파일에서 검색할 단어가 들어 있는 라인만 따로 파일에 저장하기.

    if [ $# -lt 2 ]   # 넘겨 받은 인수가 2개 미만이면 조건이 참
    then
        echo Usage: $0 검색대상파일 검색할단어
       exit
    fi

    if [ ! -f $1 ]    
    # 첫 번째 인수가 파일이 아니면 조건이 참
    then
       echo "$1 : 그런 파일은 존재하지 않습니다!"
    else
        grep $2 $1 > $1_$2    
    # 두 번째 인수를 첫 번째 인수 이름의 파일에서 찾아서
                                            '첫 번째 인수_두 번째 인수'라는 이름의 파일에 저장.
    fi

    이 스크립트는 두 개의 파라미터를 넘겨 받아,
    첫 번째 인수와 일치하는 이름의 파일에서
    두 번째 인수와 일치하는 라인을 찾아
    '파일 이름_찾은단어'라는 이름의 파일에 저장하는 스크립트입니다.

    스크립트 실행 이후에 'custom_test'라는 파일이 생성된 것을 볼 수 있습니다.

    원하는 내용만 들어있습니다.

     

    위의 예와 같이 bash 쉘 스크립트는  

      #!/bin/bash

    와 같이 시작합니다.(실제, bash 의 디렉토리를 적어 줍니다. )

      $# : 스크립트에 넘겨진 인수의 개수
      $0 : 실행된 쉘 스크립트 이름
      $1~$nnn : 넘겨진 인수들을 순서대로 나타냄

    이 외에도 변수를 지정하고, 조건문, 반복문, case문등의 문법을 이용하여, 원하는 작업을 수행하는 쉘을 만들 수 있습니다.

    다음은 쉘 프로그래밍을 위한 잘 정리된 문서입니다. 참고 하세요.

    posted by 좋은느낌/원철