'2009/10'에 해당되는 글 6건

  1. 2009.10.07 리눅스 쉘 by 대절님

리눅스 쉘

programing/linux 2009.10.07 18:47

1. 쉘이란?

사용자와 운영체제 사이에서 입력되는 명령어를 번역해주는 해석기

 

2 쉘의 종류

1) Sh(Bourn Shell) :

- 초기 유닉스 시스템부터 사용되어온 쉘

- 기본적인 사용자 인터페이스 기능 제공

- SVR4유닉스 계열의 root의 기본 쉘

- 시스템 부팅 시 사용되는 초기화 파일은 대부분 Bourn Shell스크립트로 작성됨.

2) Ksh(Korn Shell)

  - Bourn Shell을 개선하여 나온 쉘

  - Bourn Shell의 사용자 인터페이스 기능 이외에 명령어 기억, 명령어 별명부여, 작업제어, 다양한 쉘 내장 명령 지원과 쉘 프로그래밍 문법지원 등의 특징 제공

3) Csh(C Shell)

  - 버클리유닉스에서 기본쉘로 사용됨, Korn Shell의 기능을 모두 제공

  - 쉘 프로그래밍 문법이나 명령어 해석방법이 C프로그래머에게 익숙하도록 만들어짐

4) Tcsh(Tenex C Shell)

  - 코넬 대학에서 C Shell 수정본에 Korn Shell의 기능을 포함하여 개발된 쉘

  - C Shell과 명령어 사용형식의 호환성을 제공하고 있으며 C Shell에 비해 사용자 인터페이스가 강화된 쉘

5) Bash(Bourn Again Shell)

  - Bourn Shell에 기능을 강화시킨 쉘, GNU프로젝트의 일환으로 만들어 짐

  - 리눅스는 GNU GPL 라이선스를 가진 bash쉘을 기본 쉘로 사용

 

3. 쉘 선택하기

사용 가능한 쉘은 /bin 디렉토리에 파일 형태로 존재

‘ls –l /bin/*sh’ 명령으로 확인가능

 

*chsh로 기본 쉘 변경 하기

1) 일반사용자들의 기본 쉘은 계정 생성시 지정되며 /root/etc/passwd 에서 확인가능

  # grep user1 /etc/passwd                          ßuser1이 사용하는 기본 쉘 확인

2) 기본 쉘은 root사용자와 본인이 변경가능

# su – user1                                           ß user1으로 계정 변경

# id                                                      ß 현재 사용자의 ID정보 확인

3) chsh명령은 로그인 쉘을 변경하는 명령어

*chsh [-s shell] [username]

  # chsh –s /bin/csh                                   ß 기본쉘을 bash에서 c shell로 변경, 패스워드 입력해야함.

다시 grep 명령으로 변경되었는지 확인할 수 있고 다음번 로그인부터 적용됨.

 

4. 쉘의 기능

  1) 사용자의 명령어 번역

  à쉘이 명령을 해석하는 방법

          ls –l test.c                                      ß 프로그램 [-옵션] [아규먼트]

    - 공백문자 또는 탭문자를 기준으로 각각의 필드를 구분하여 입력된 문장을 잘라 냄

    - 첫 번째 토큰에서 실행할 프로그램명 인식

    - 두 번째 필드부터 “-“ 부호가 붙어있는 단어들을 옵션으로 인식 “-“부호가 없으면 아규먼트로 인식

  à쉘이 실행할 프로그램의 위치 정보를 찾는 순서

    1. alias(별칭)이 지원되는 경우 alias테이블에서 명령을 찾음

    2. 쉘 내부에서 정의되어 있는 명령인지, 쉘 내장 명령 테이블을 검색

    3. 환경 변수인 PATH에서 설정하고 있는 디렉토리 순서 내에서 해당 프로그램이 있는지 찾음

 

TIP : 명령어 리스트

-명령어 라인에서 ‘;’ 으로 구분된 여러 개의 명령어를 입력하면 순서대로 해당 명령어 수행

) #ls; date       ß 디렉토리 목록 확인 후 현재 날짜 확인

 

  2) 메타문자를 이용한 파일명 확장 기능

    - 명령어를 입력할 때 사용되는 특별한 의미를 가진 문자

    - 명령어 라인에 입력되면 쉘은 문자의 의미에 따라 명령어를 확장시켜 해석

   

*

0또는 한 개 이상의 아무 문자와 매치

?

한글자의 아무 글자와 매치

[ ]

[ ] 내에 정의하고 있는 한 글자와 매치

\

다음 라인에 입력이 계속됨

 

  3) 입출력 방향 전환

  à 쉘의 입력과 출력을 실행하기 위한 기본적인 세 개의 파일을 오픈

파일 디스크립션

용도

/출력 방향

방향전환문자

0

표준입력

키보드

< 

1

표준출력

터미널(모니터)

> 

2

표준에러출력

터미널(모니터)

2>

  à 쉘에서 방향 전환을 표시하는 메타문자를 사용하여 입력과 출력위치 변경 가능

 

< filename or 0< filename

표준입력 방향을 지정한 파일로 전환

>filename or 1> filename

표준출력 방향을 지정한 파일로 전환

2> filename

표준에러 출력방향을 지정한 파일로 전환

<<지정문자

지정된 문자가 입력될 때 까지 표준 입력으로부터 연속적으로 입력을 읽어옴

>>filename

표준 출력을 지정한 파일의 끝에 추가

 

)

*표준 출력의 방향을 모니터에서 /dev/null이라는 특수파일로 전환

# cat newfile                                 ß newfile의 내용을 화면으로 출력

# cat newfile > /dev/null                ß newfile의 내용을 화면이 아닌 /dev/null로 출력

*표준에러출력 방향 변경

# ls -l newfile oldfile                      ß newfile oldfile 리스트 출력 oldfile은 존재하지X 에러

# ls –l newfile oldfile 2>/dev/null     ß oldfile 에러메시지를 /dev/null로 보냄, newfile 출력

(/dev/null은 장치파일로서 휴지통과 같은 개념, 에러메시지는 화면에 표시되지 않음)

* 표준출력과 표준에러출력을 list라는 하나의 파일에 함께 저장

# ls –l newfile oldfile > list 2>&1     ß 두개의 출력방향을 하나의 파일로 설정하는 경우는 &1(표준출력방향으로) 또는 &2(표준에러 출력방향으로)와 같은 형식을 사용하여 출력방향을 하나로 지정하여 사용함.(표준출력 결과를 list에 저장하고 에러출력메세지도 표준출력에 저장한다.)

* 표준입력으로부터 여러 라인의 입력을 받은 후 입력된 문자열을 한번에 출력하고자 한다면 ”<<지정문자형식을 사용

# cat <<** > newfile                      ß “**”라는 문자를 만날때까지 표준 입력을 받은 후 **문자를 만나면 입력 받은 모든 내용을 newfile로 저장

# mail angel < message.txt             ß mail e-mail보낼 때 사용, angel 에게 보내는데 내용을 message.txt에서 가져옴

 

4) 파이프(|)

표준출력으로 출력하는 프로그램과 표준출력으로 입력받는 프로그램 사이에서 출력을 입력으로 넘겨주는 역할

* 파이프를 사용하여 시스템에 syslogd데몬이 실행 중인지 확인

  # ps –ef | grep syslogd   ß ps –ef 명령을 실행하여 실행결과를 파이프를 이용하여 grep명령의 입력으로 전달, 그 후 grep은 넘겨받은 결과에서 “syslogd”라는 문자열이 포함된 라인을 출력

 

5) 별명 부여 및 해제 기능

자주 사용하는 명령과 옵션을 묶어 하나의 별명을 붙여 놓으면, 별명만으로 명령과 옵션 실행

alias 별병 = ‘실행할 명령어

# alias                                       ß설정된 별명 리스트 출력

* 디렉토리 목록을 확인하는 ‘ls –ld’ 명령을 lld라는 이름으로 alias설정

  # alias lld=’ls –ld’

* 설정된 alias를 삭제하려면 unalias 명령을 사용

  # unalias lld                               ß lld라는 alias삭제

 

6) 명령어 기억(history) 기능

관리자의 계정으로 실행된 명령을 추적

기억 기능 과정

  - 쉘이 실행 중인 동안 입력하는 모든 명령은 메모리에 순차적으로 기록

  - 로그아웃 시에 메모리의 내용이 .bash_history 파일에 저장됨

  - .bash_history 파일에 저장되는 명령어 개수는 HISTFILESIZE 환경변수로 설정

  * HISTFILESIZE 환경 변수를 확인

  # echo $HISTFILESIZE    ß 1000이 할당. 저장할수 있는 명령어가 1000, 넘게 되면 오래된것부터 삭제

# fc –l                         ß 최근 저장된 명령어 리스트 16개 출력

# history                      ß 저장된 전체 명령을 출력

 

7) 쉘 스크립트

  여러 개의 명령을 하나의 파일에 순서대로 저장한 후 한번에 실행하는 기능

  변수나 조건문, 반복문, 연산 등을 사용하여 다양한 프로그램 형태로 구성할 수 있음.

* 에디터를 이용해 first-script 파일을 만듬.(~ root폴더에서 만듬)

  # vi first-script

  #!/bin/bash

  echo “첫번째 쉘 스크립트입니다

  if [ -x /bin/ls ]

  then

      /bin/ls

  else

      echo “/bin/ls 파일을 찾을 수 없습니다.”

  fi

          ß 실행하면 첫번째 쉘스크립트입니다출력쉬 /bin/ls 실행파일이 있는지 확인 후 있으면 실행 없으면 파일을 찾을 수 없다고 출력

# ls –l first-script                         ß 만들어진 first-scipt는 실행권한이 없음.

# chmod +x first-script                ß first-script에 실행권한을 줌

# ./first-script                             ß echo ls 명령이 차례로 실행됨

 

5. 쉘 변수

 

1) 일반변수와 환경변수

* 일반변수

  - 사용자가 필요에 의해 만들어서 사용하는 변수, 쉘에서만 사용 가능

  - 만드는 법 : 변수명=

  - 변수 값 출력 : echo $변수명

)

# color=red                  ß color 변수에 red라는 값을 넣어 일반 변수 정의

# echo color                 ß color 라는 결과 출력

# echo $color  ß color 변수에 저장된 red 출력

 

TIP : 변수명 만드는 규칙

- 영문자, 숫자, _ 로 구성되고 공백이나 tab은 포함할 수 없음

- 길이의 제한이 없음

- 변수와 값 사이에는 = 기호를 넣고, = 기호 앞/뒤 에는 공백이 존재할 수 없음

- 변수 값 생략시 NULL로 초기화

- 변수에 저장되는 값이 blank를 포함하는 경우 반드시 “ “로 묶어야 함.

 

* 환경변수

  - 시스템 전체에 영향을 주는 변수

  - 현재 쉘에서 실행한 다름 프로그램이나 서브 쉘에 변수와 값을 전달

  - /etc/profile에 정의하면 모든 시스템 사용자들이 로그인 할 때 만들어짐

  - 개인의 홈 디렉토리에 .bash_profile에 정의하면 개인사용자 각각 로그인할 때 만들어짐

  - 일반적으로 환경변수는 대문자, 일반변수는 소문자

  - 정의하는 법

    # 환경 변수명=변수값 

    # export 환경 변수명

         or

    # export 환경 변수명=변수값

    - 현재 시스템에 정의된 환경 변수 확인

      # export

      # env

 

TIP : 서브 쉘

리눅스에서 로그인시 실행된 로그인 쉘 외에 사용자의 필요에 의해 실행된 쉘

/bin 디렉토리에 존재하는 쉘프로그램 이름을 입력하여 생성

) /bin/csh를 서브쉘로 실행하려면

# /bin/csh

로그인 쉘과 서브쉘의 관계는 부모-자식 관계

# $pstree              ß  서브쉘 부모-자식 관계 확인

 

* 일반변수와 환경변수 차이비교

# color=red                     ß 일반변수 color에는 red저장

# COLOR=blue                ß 환경변수 COLOR에는 blue저장

# export COLOR ß COLOR export명령으로 환경변수로 설정

 

# /bin/bash                     ß 서브 쉘 실행

# ps –f                           ß 프로세스 확인해 보면

UID        PID  PPID  C STIME TTY          TIME CMD

root     24696 24694  0 13:14 pts/0    00:00:00 -bash

root     26052 24696  0 16:40 pts/0    00:00:00 /bin/bash

root     26070 26052  0 16:40 pts/0    00:00:00 ps –f

ß PID : 24696 은 로그인 쉘, PID : 26052는 서브 쉘로서 24696의 자식 쉘임

 ps -f명령은 26052 PID를 가진 서브쉘에서 실행중임을 확인할 수 있음.

# echo $color                  ß color는 일반변수이므로 서브쉘까지 값이 전달되지 않음.

# echo $COLOR  ß COLOR는 환경변수 이므로 서브 쉘까지 변수가 전달되어 blue출력

# exit     or  <Ctrl+d>     ß 서브 쉘 종료

 

2) 환경 변수의 종류

  - bash쉘에서 사용가능한 환경 변수

 

환경 변수명

 

HOME

사용자의 홈 디렉토리

PATH

실행파일을 찾는 경로

LANG

프로그램 사용시 기본 지원되는 언어

PWD

사용자의 현재 작업하는 디렉토리

SHELL

로그인해서 사용하는 쉘

USER

사용자의 이름

DISPLAY

X디스플레이 이름

VISUAL

visual편집기의 이름

EDITOR

기본 편집기의 이름

COLUMNS

현재 터미널이나 윈도우 터미널의 컬럼 수

PS1

명령 프롬프트 변수

PS2

명령입력이 다음라인으로 넘어가는 경우 사용되는 2차 명령 프롬프트

BASH

사용하는 bash쉘의 경로

HISTFILE

history 파일의 경로

HISTFILESIZE

history 파일의 크기

HISTSIZE

history에 저장되는 개수

HOSTNAME

호스트의 이름

LOGNAME

로그인 이름

LS_COLORS

ls 명령의 색상관련 옵션

MAIL

메일을 보관하는 경로

MAILCHECK

메일 확인 시간

TERM

터미널 종류

UID

사용자의 UID

USERNAME

사용자 이름

 

3) 프롬프트 환경 변수

  프롬프트의 값을 가지고 있는 환경변수로 PS1, PS2를 사용

  PS1은 사용자가 시스템에 정상적으로 접속하였을 때 출력되는 프롬프트

  PS2는 명령이 다음 라인에 연속적으로 입력되어야 할 때 사용

  # echo $PS1                ßPS1변수에 정의 된 값  

  # echo $PS2                ßPS2 변수에 정의 된 값

PS1= [\u@\h \W]\$   ß 프롬프트의 모습은 \u \h와 같은 이스케이프 문자\를 이용하여 [사용자명@호스트명 현재경로명] 을 프롬프트로 사용하고 있음

* 프롬프트 변경

 [root@localhost ~]# PS1=" \u@\h \W>"              ß 프롬프트 모양 변경

root@localhost ~>

root@localhost ~>PS1="[\T][\h: \W]#"

[05:04:52][localhost: ~]#

 

TIP : 프롬프트 설정시 사용하는 이스케이프 문자들

문자

의미

\d

요일 달 일형식으로의 날짜

\t

::형식으로의 시간

\h

호스트 이름

\n

줄 바꿈

\s

Shell이름 표시

\u

로그인 사용자의 ID를 표시

\w

현재 작업 디렉토리를 표시, 홈은 ~로 표시

\W

현재 작업 디렉토리의 베이스 이름을 표시

\#

현재 명령어의 명령 행 변호를 표시

\!

현재 명령어의 History 번호를 표시

\$

- effective UID 0이면 #, 그렇지 않으면$를표시

- root UID 0이기 때문에 root인경우는 #을 일반사용자는 $를 표시

\nnn

8진수 문자 코드를 표시

\\

\문자를 표시

[ ]

[ 또는 ] 문자를 표시

 

4) PATH 환경 변수

쉘은 사용자의 명령을   ‘alias검색 à 쉘 내장명령 à PATH위치 검색  으로 찾음

PATH 환경 변수 역시 [변수명=변수값]으로 설정

# echo $PATH                 ß 기존 설정된 PATH확인

PATH는 기존의것+새로운경로를 추가하는 방식으로 설정

# PATH=$PATH:/export/myprog                    ß기존 PATH뒤로 ‘:/export/myprog’ 추가

# PATH=/export/myprog:$PATH                    ß기존경로보다 새로 추가하는 경로가 더 빈번하게 참조 된다면 앞쪽에 추가

 

 

6. 초기화 파일들

환경변수들은 메모리에 저장되는 것이기 때문에 로그아웃하거나 시스템이 종료하면 모두 없어짐

시스템 초기화 파일에 기록하여 사용자가 로그인 할 때 자동으로 실행되도록 만들어줌

bash쉘에서 사용하는 시스템 초기화 파일들과 실행순서 :

  /etc/profile    à   ~/.bash_profile    à   /.bashrc

  - /etc/profile :

- 모든 사용자들이 로그인 할 때 자동으로 실행되는 초기 파일

   - 시스템 관리자가 로그인 사용자들 모두에게 글로벌한 설정을 해줄 필요가 있을 때 편집

  - ~/.bash_profile :

- ~문자는 로그인 사용자의 홈디렉토리

- 개인 사용자들의 홈 디렉토리에 있는 .bash_profile bash 쉘을 사용하는 사용자가 로그인 할 때

/etc/profile다음으로 자동 실행

- 개인 사용자들이 자신만의 프롬프트나 PATH등 환경 변수를 설정할 때 사용

- bash_profile에서는 /etc/bashrc 파일이 존재하면 실행시키는 스크립트를 내장하고 있음

- 보통 /etc/bashrc 파일에는 Bash쉘을 사용하는 모든 사용자들에게 적용해야 하는 시스템 환경

변수가 정의되어 있음.

    - .bashrc :

- ~/.bash_profile 다음 실행되는 스크립트 파일로, alias와 같은 설정이 들어감.

- .bash_profile .bashrc 파일을 반드시 구분해야 하는것은 아니나, 일반적으로 리눅스에서는

.bash_profile에는 환경 변수 설정을, .bashrc에는 alias와 같은 설정을 구분해서 사용함.

* ~.bash_logout : 사용자가 로그아웃을 할 때 실행해야 하는 작업들 정의

 

TIP : bash쉘이 아닌 다른 쉘 사용시 초기화 파일

시스템 초기화 파일

로그인 사용자의 초기화 파일

로그아웃 파일

Bourne

/etc/profile

~/.profile

 

Korn

/etc/profile

~/.profile

~/.kshrc

 

C

/etc/.login

~/.login

~/.cshrc

~/.logout

 

- /etc/profile을 열어보면

 [root@localhost ~]$ cat -n /etc/profile

1  # /etc/profile

     2

     3  # System wide environment and startup programs, for login setup

     4  # Functions and aliases go in /etc/bashrc

#으로 시작하는 주석파일들, /etc/profile실행에 영향 X

     5    

6  pathmunge () {

     7          if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then

     8             if [ "$2" = "after" ] ; then

     9                PATH=$PATH:$1

    10             else

    11                PATH=$1:$PATH

    12             fi

    13          fi

    14  }

pathmunge라는 함수가 정의됨. PATH환경변수의 값을 앞에 또는 뒤에 추가하는 작업에 대한 설정

15

16  # Path manipulation

    17  if [ `id -u` = 0 ]; then

    18          pathmunge /sbin

    19          pathmunge /usr/sbin

    20          pathmunge /usr/local/sbin

    21  fi

로그인 하는 사용자가 root(UID=0)인 경우 pathmunge함수를 호출하여 /sbin, /usr/sbin, usr/local/sbin PATH에 추가함   

    22

23  pathmunge /usr/X11R6/bin after

PATH /usr/X11R6/bin 경로를 추가

24

    25

26  # No core files by default

    27  ulimit -S -c 0 > /dev/null 2>&1

    28

    29  USER="`id -un`"

    30  LOGNAME=$USER

    31  MAIL="/var/spool/mail/$USER"

    32

    33  HOSTNAME=`/bin/hostname`

    34  HISTSIZE=1000

    35

    36  if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then

    37      INPUTRC=/etc/inputrc

    38  fi

USER, LOGNAME, MAIL, HOSTNAME등 변수에 값을 할당   

    39

40  export CLASSPATH=$CLASSPATH:.:/home/supia/javasqlite-20080420/sqlite.jar

    41  export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

export명령으로 앞에서 만든 변수들을 환경 변수로 설정   

    42

43  for i in /etc/profile.d/*.sh ; do

    44      if [ -r "$i" ]; then

    45          . $i

    46      fi

    47  done

/etc/profile.d 디렉토리 아래에 파일명이 .sh로 끝나는 파일을 읽을 수 있으면 읽어서 실행

    48

    49  unset i

    50  unset pathmunge

 

저작자 표시 비영리 동일 조건 변경 허락
신고

'programing > linux' 카테고리의 다른 글

리눅스 쉘  (0) 2009.10.07
vi편집기  (0) 2009.10.07
리눅스 기본명령어(2)  (0) 2009.10.07
Posted by 대절님
TAG ,

댓글을 달아 주세요



티스토리 툴바