본문으로 바로가기

쉘(shell)의 특성

category Linux/Linux 기초 2017. 8. 23. 13:13


쉘은 명령행에서 입력되거나 스크립트 파일에서 읽어 들이는 명령어들을 해석함으로써 사용자와 커널의 중계(Interface) 역할을 담당한다사용자가 로그인하면 쉘이 시작되고 사용자가 명령어를 입력하면 쉘은 명령행의 구분을 분석하고리다이렉션파이프와일드 카드작업 제어등을 처리하고명령어를 PATH변수에서 검색하고 존재하면 실행한다쉘의 주요 기능들 중 하나는 명령행 프롬프트에서 입력된 명령어들을 해석하는 대화형 기능이다쉘은 명령행에서 입력된 명령어들을 분석해서 토큰이라는 단어 단위로 해석한다토큰은 텝이나 빈칸개행문자 등 공백으로 구분한다입력된 명령어들에 메타문자들이 포함되어 있으면 적절하게 처리한다쉘은 파일 입출력과 백그라운드 작업을 처리하며명령행에서 입력이 정상적으로 분석되었을 경우 해당 명령어를 찾아 실행한다.


  • 리다이렉션 ( Redirection )
-fd (파일 기술자, File Descriptor)

 

각 프로세스를 위한 파일 기술자(File Descriptor)가 쉘에 의해 만들어 진다. 한 개의 파일을 열면 그 연 파일을 나타내는 특별한 숫자를 쉘이 만들어 내는데 이것이 파일 기술자이다. 이런 번호들 중 미리 예약 되어져서 파일을 열 때 주어지지 않는 번호가 있는데 아래 표와 같다.

 

파일기술자

축약의미

설 명

0

stdin

Standard Input, 표준입력, 특별히 입력이 지정되지 않은 경우 키보드에서 입력을 받는다.

1

stdout

Standard Ouput, 표준출력, 특별히 출력이 지정되지 않은 경우 정상적인 출력 결과를 모니터로 출력된다.

2

stderr

Standard Error, 표준에러, 특별히 출력이 지정되지 않은 경우 에러의 출력 결과를 모니터로 출력된다.


-표준 입력, 표준 출력


쉘에서는 명령어 입력을 특별한 지정이 없는 한 키보드(Keyboad)에서 받는다. 그리고 명령어의 출력 결과를 모니터에 출력해준다. 이러한 명령어의 출력 결과나 입/출력을 리다이렉션 심볼(Redirection Symbol)을 사용하여 방향을 재지정 할 수 있다. 방향을 재 지정함으로 인해 기본 출력 방향이 모니터인 것을 file로 변경이 가능하다.

 

                                표준입력(0, stdin) -----> SHELL(bash) -----> 표준출력(1, stdout)

                                  (EX: keyboard)                  |                          (EX: Screen)

                                                                       |

                                                                      V

                                                            표준에러(2, stderr)

                                                                (EX: Screen)


-입력 재지정(입력 리다이렉션, Redirection stdin)

 

입력 재지정은 표준입력(Stdin)에서 입력을 받지 않고, 다른쪽에서 입력을 받는 것을 입력 재지정 (Redirection stdin)이라고 한다. 원래 특별한 지정이 없다면, 키보드에서 입력을 받지만 다른쪽 방향에서 입력을 받는 것을 말한다. 파일 기술자 0번은 생략 가능하다.


[형식]

CMD < file

CMD 0< file


[응용]

# mailx -s "Test" root < /etc/hosts


-출력 재지정(출력 리다이렉션, Redirection stdout)

 

출력 재지정은 정상정인 출력 결과를 표준출력(모니터)으로 출력을 하지 않고, 다른 쪽으로 출력하는 것을 출력 재지정(Redirection stdout)이라고 한다. 원래 특별한 지정이 없다면, 모니터로 출력되지만 다른 쪽 방향으로 출력하는 것을 말한다. 파일 기술자 1번은 생략 가능하다.


[형식]

CMD > filename 

CMD 1> filename     /* 덮어쓰기 */

CMD >> filename 

CMD 1>> filename  /* 이어쓰기 */


[응용]

# ps -ef | grep httpd | wc -l  >> httpd.count



-에러 재지정(에러 리다이렉션, Redirection stderr)

 

에러 재지정은 표준 에러로 출력하지 않고, 다른 쪽으로 출력하는 것을 에러 재지정(Redirection stderr)이라고 한다. 원래 특별한 지정이 없다면, 모니터로 출력을 하지만 다른 쪽으로 출력하는 것을 말한다. 파일 기술자 2번은 생략 불가능하다. 방향 재지정자를 1번과 동일하게 사용하여 1번 파일 기술자와 구별하기 위해 생략 불가능하다.


[형식]

CMD 2> filename 

CMD 2>> filename 


[응용]

# script.sh > file.log 2>&1



쉘 스크립트 = 쉘의 특성으로 만들어진 프로그램 / CMD의 연속으로 이루어짐 ( 윈도우의 배치파일과 비슷 )

(실무 예) script.sh(스크립트) 로그 파일 생성

(X) # ./script.sh > file.log

(0) # ./script.sh > file.log 2>&1


2>&1  : 표준 오류를 &1로 저장한다. 

&1은 앞의 file.log를 받는다 -> file.log에 표준 입력과 표준 오류 모두 저장한다.

 

 

(실무 예) ./configure prefix=/usr/local/apache2

# ./configure --perfix=/usr/local/apache2 2> file.log

# ./configure --perfix=/usr/local/apache2 > file.log 2>&1

 

 

(실무 예) 일반 사용자(EX: oracle, wasuser)가 검색하는 경우

$ find / -name core type f

$ find / -name core type f 2>/dev/null 


일반 사용자들은 권한이 없다는 오류가 굉장히 많이 나오는 데 이 오류를 null로 버린다. -> 정상적인 결과만을 출력한다.



** tee CMD

리다이렉션은 모니터에 출력하거나 특정 파일에 출력한다. 

모니터로 실시간으로 확인하면서 파일에 저장하기 위해서 tee 라는 명령어를 사용한다.


# CMD > file.log

# CMD | tee file.log


  • 파이프 ( Pipe)

파이프(Pipe)? 앞에 실행한 명령어의 출력 결과를 뒤에 실행하는 명령어의 입력 값으로 넣어 준다. 앞의 출력 결과를 뒤에 실행하는 명령어의 입력 결과로 보내줌으로 인해 파이프(|)를 사용하면 여러 명령을 동시에 연결하여 사용 할 수가 있다.


첫 번째 CMD로 출력된 내용을 화면에 그대로 출력하지 않고 커널 버퍼(저장 공간이 정해져있다)date를 저장 해 두었다가 버퍼에 저장된 결과 값을 가지고 뒤에 있는 CMD의 입력 값으로 넘겨 뒤에 있는 명령어가 실행한 결과를 출력해 주게 된다.


[명령어 형식]

# CMD | CMD



# ps -ef > file.log           | # ps -ef | grep inetd

# grep inetd file.log        |


[원리]



[응용]


-실시간 모니터링 하면서 파일로 내용을 저장

# service httpd restart

while true

do

> ps -ef | grep httpd | wc -l | tee -a file.log (> w root >> file.log)

> sleep 2

done 


** script CMD

history 명령어는 자신이 입력한 커맨드들을 저장하지만 그 출력에 대해서는 저장하지 않는다.

script 명령어는 모든 것을 저장한다. 


script -a file.log

# ls

# date

# cal

# exit

# cat file.log 


-다른 터미널 창에서 입력하는 내용이 그대로 지정한 터미널 창으로 출력 되도록 설정


#tty /* 다른 터미널 번호 확인 */

# script -a /dev/null | tee /dev/pts/1 | tee /dev/pts/2

# ls

# date

# cal

# exit 


  • 배쉬쉘 기능 ( Bash Shell Function )

# set -o /* 쉘 자체의 기능 전체 목록 확인 */

# set -o vi /* 쉘 자체의 기능 중 vi 기능을 ON */

# set +o vi /* 쉘 자체의 기능 중 vi 기능을 OFF */


배쉬쉘이 지원하는 기능은 많지만 그중 몇가지만 간추려서 알아보자.


(1) 로그아웃 <Ctrl+D> 방지하기 (ignoreeof)    


# set -o ignoreeof


EOF ( End Of FIle )의 의미를 갖는 키 < CTRL + D >


Ctrl + D 키를 잘못 누를 경우 백그라운드에서 실행되던 프로그램 모든것이 중단되어 문제를 일으킬수 있다. 

실수를 방지하기 위해선 ignoreeof 기능을 off로 설정한다.


(2) 덮어쓰기 방지기능 (noclobber)


# set -o noclobber


방향 재 지정자 ( Redirection Stdout '>')으로 파일에 잘못 덮어쓰기를 해서 기존에 있던 내용들이 삭제되지 않게 하기 위해 사용한다.


[참고] TAB

디렉토리에 있는 파일이나 디렉토리의 첫 번째 문자만 입력후 Tab 키를 누르면 첫 글자로 시작하는 파일과 디렉토리가 자동으로 완성된다. 만약 입력한 문자만으로 파일과 디렉토리를 구분할 수 없다면 Tab 키를 두번 눌러 입력된 문자로 시작하는 목록을 확인 할 수 있다.

  • 변수 ( Variable )

변수의 종류

- 지역변수(Local Variable) : # VAR=5

- 환경변수(Environment Variable) : # export VAR=5

- 특수변수(Special Variable) : $$, $?, $!, $0, $1, $#, $*, ....


(1) 지역변수 선언

변수 선언 방법(EX: bash)

# VAR=5

# echo $VAR

# unset VAR


지역 변수는 현재 사용하고 있는 쉘에만 적용되는 변수 값으로 선언 하는 것이다. 서브 쉘에서 지역 변수 값을 확인하려고 할 경우 값이 나타나지 않는다.


var=5 echo                                $var (0)

 ----------+                    +----------

  |                      |

  | echo $var (X) |

  +---------------+


(2) 환경변수 선언


환경변수는 현재 쉘과 서브쉘에 변수를 모두 적용되는 변수 값으로 선언해 주는 것이다. 환경변수를 사용하는 이유는 이전쉘에서 선언한 변수 값을 서브쉘에서도 동일하게 적용하기 위한 것이다.


export var=hello                   echo $var (0)

       ----------+                   +----------

|                   |

| echo $var (0) |

      +---------------+



** set : 모든 변수에 대해 출력 ( 지역변수 + 환경 변수 )

** env : 환경변수만 출력


# set | grep var1

# env | grep var1


(3) 시스템 환경 변수 ( 쉘 환경 변수 )


- PS1 : 명령어 프롬프트에 나타내는 시스템 환경 변수


[root@linux203 ~]#

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

-----------------------------------------------------------

\u : username

\h : hostname

\W : working directory (: /home/user01 -> user01)

\w : working directory (: /home/user01 -> /home/user01)

\$ : root(#), user01($)

-----------------------------------------------------------



# vi ~/.bashrc 


#

# Variable Definition

#

export PS1='[\u@\h \w]\$ '


- PS2 : 명령어가 아직 끝나지 않았음을 나타낼 때 사용한다.


PS2='>'


# while true

> do

> CMD

> sleep 2

> done


- echo $HOME


사용자의 홈 디렉토리가 정의되어 있는 변수


- echo $PWD


현재 작업중인 디렉토리가 정의되어 있는 변수


- echo $LOGNAME


현재 사용자의 로그인할 때의 이름 저장되어 있는 변수


- echo $TERM


터미널 정의가 되어 있는 변수

# export TERM=vt100


- echo $LANG


언어가 선언되어 있는 변수

# export LANG=en_US.UTF-8

# cat /etc/sysconfig/i18n


- echo $USER


현재 사용자 이름이 선언된 변수


- echo $UID


현재 사용자 UID 번호가 선언된 변수


- echo $PATH


명령어들이 위치한 디렉토리를 선언할 때 사용하는 변수

# export PATH=$PATH:/root/bin

# vi ~/.bash_profile


-echo $HISTTIMEFORMAT


history 명령어는 날짜와 시간이 나오지 않는대 설정을 통해 표시할 수 잇는 변수

# export PATH=$PATH:/root/bin

# vi ~/.bash_profile


(4) 특수 변수


- echo $$


$ : 현재쉘의 PID를 저장하고 있다. 쉘 스크립트내에서 임시 파일의 이름을 지정할 때 보통 사용이 된다.


- echo $?


? : 바로 이전 명령어의 정상 실행 여부에 대한 결과값이 들어 있다. 쉘 스크립트내에서 이전 명령어의 정상 수행 여부를 확인할 때 주로 사용된다.


[활용]


# vi backup.sh

-------------------------------------------------------

                tar cvzf /backup/backup.tar.gz /home

                if [ $? -eq 0 ] ; then /* -eq : equal */  /* 정상적으로 실행되면 success 출력 */

                echo "success"

                else

                echo "error"

                fi

-------------------------------------------------------


- echo $!


! : 바로 이전에 백그라운드로 실행한 프로세스의 PID번호가 저장 된다.


- 인자 변수


$로 표시하여 인자변수의 갋이 몇 번째인지 나타낼 수 있다.


echo $1        /* 첫번째 인자 */

echo $2        /* 두번째 인자 */


echo $*        /* 모든 인자 */

echo $#        /* 인자의 개수 */


  • 메타캐릭터 ( Shell Metacharacter )

- ''(작은 따옴표(single quotation)) : 쉘이 해석 할 수 없도록 막아 준다.


# echo $HOME

/root

# echo '$HOME'

$HOME


- ""(큰 따옴표(Double quotation)) : 쉘이 해석 할 수 없도록 막아 준다. 단 인식되는 문자($, ``, \)들도 있다.


# echo $HOME

/root

# echo "$HOME"

/root

# echo "$HOME is my dir??.."

/root is my dir??..


- ``(역 따옴표(Back quotation)) : 쉘이 해석할 때 명령어로 인식한다. 따라서 역 따옴표 안의 내용을 실행한다.


# echo `date`

2017. 08. 24. (목) 07:02:16 KST

# touch server_`date +%m%d`.log

# tar cvzf /backup/home_`date +%m%d`.tar.gz /home

# while true

> do

> echo "------`date`-------"

> CMD

> sleep 2

> done


- \ (역 슬래쉬(Back slash)) : 바로 이후에 있는 문자을 쉘이 해석 할 수 없도록 막아 준다.


# find / -name core -type f -exec rm -f {} \;

# find / \( -perm -4000 -o -perm -2000 \) -type f


[참고]

# \CMD     /* 문자를 쉘이 해석 할 수 없도록 한다. ( alias로 설정되지 않은 기본 명령어로 실행된다 ) */

# CMD\     /* 명령어가 긴 경우 명령어가 아직 끝나지 않음을 의미한다. */

- ; (세미콜론(Semicolon)) : 한개의 라인에 여러개 명령어 수행할 때 사용한다.


# ls ; date ; cal


[참고]

동시에 해결한 명령어들을 파일로 저장하기


# ls ; date ; cal > file.log        ->  ls와 date 는 모니터에 cal 명령어만 file.log에 입력된다.


# ( ls ; date ; cal ) > file.log    ->  ls, date, cal 모두 file.log에 입력된다.


  • 히스토리 ( Command History)

사용자가 로그인 하게 되면 사용자의 명령어를 저장하기 위해서 Stack 공간이 할당된다. Stack 공간은 ksh 쉘을 사용하고 있다면, 기본값은 1000개의 명령어를 저장할 수 있는 공간이 할당된다. bash 쉘은 1000개의 명령어를 저장 할 수 있다. 또한 sh 쉘은 히스토리 기능이 없다.


HISTSIZE          /* 히스토리를 기록하는 스택의 크기를 지정 */

HISTFILE          /* 히스토리 내용을 지속적으로 저장하는 파일 이름 지정 */

 /* 기본값: ~/.bash_history */

HISTFILESIZE      /* 히스토리파일의 크기 지정 */

 

HISTTIMEFORMAT="%F %t   "


history -c  /* 현재까지 사용한 명령어 삭제 */


  • 앨리어스 ( Alias )

# alias 

# alias cp='cp -i'

# unalias cp


alias 이름과 명령어 이름이 중복되는 경우에는 alias를 우선으로 실행한다. 


#vi ~/.bashrc


  • 환경화일(Environmnet File) 

/etc/profile         : 로그인 할 때만 읽혀짐

/etc/bashrc   : 쉘이 실행 될때 마다 읽혀짐

/etc/profile.d/*.sh : 쉘이 실행 될때 마다 읽혀짐


~/.bash_profile : 로그인 할 때만 읽혀짐

~/.bashrc       : 쉘이 실행 될때 마다 읽혀짐


- 환경파일에 들어가는 내용

변수

PATH, PS1, 사용자의 정의 변수 설정 ( JAVA_HOME, TOMCAT_HOME ...)

앨리어스 (Alias) 설정

alias la='ls -hF'

쉘 자체의 기능

set -o vi


- 설정하는 환경화일

(관리자) /etc/profile, /etc/bashrc, /etc/profile.d/*.sh

(사용자) $HOME/.bash_profile, $HOME/bashrc


쉘이 실행 될때 마다 읽혀지는 파일에 내용을 넣어야 좋다. 

자주 실행 되므로 환경화일을 변경했을때 빠르게 적용할 수 있다.


- 설정하면 좋은 것들

기본적인 alias 

alias c='clear'    /* 간편하게 사용하기 위한 명령어 */

alias grep='/bin/grep -i --color'  /*명령어 옵션*/


필요한 경우 선언하는 alias

alias lsf='/bin/ls -al | grep ^-' /* 새로운 명령어 */


alias dir='/bin/ls -aihF | more'    /* 윈도우즈 명령어 실행*/

alias ipconfig='ifconfig'            


편리한 기능의 alias

alias fconf='vi /etc/vsftpd/vsftd.conf'    /* 자주 사용하는 설정파일 설정 */

alias wconf='vi /etc/httpd/conf/httpd.conf


로그파일 모니터링

alias mlog='tail -f /var/log/messages'

alias wlog='tail -f /etc/httpd/logs/access_log'

alias welog='tail -f /etc/httpd/logs/error_log'

alias slog='tail -f /var/log/secure'


 EX : 파일이름이 file_1210.log 일때

# tail -f /logs/file_1210.log 

# tail -f /logs/file_`date +%m%d`.log

# alias slog='tail -f /logs/file_`date +%m%d`.log'

# alias slog="view /logs/file_`date --date '1 days ago' +%m%d`.log"

# alias slog="view /logs/file_`date --date '2 days ago' +%m%d`.log"








'Linux > Linux 기초' 카테고리의 다른 글

원격 접속과 파일 전송  (0) 2017.08.24
프로세스 관리  (0) 2017.08.24
압축과 아카이브  (0) 2017.08.22
검색 관련 명령어  (0) 2017.08.22
관리자가 알아두면 유용한 명령어  (0) 2017.08.22