본문 바로가기

Learning/ └Essential & Admin

리눅스 쉘특성_Unit13

Bash shell characteristics

명령어를 해석하는 기능

 

쉘의 기능

 

- 명령어 해석기(Command interpreter)

- 프로그램 언어(Programable Language) ---> 쉘 스크립트

 

 

리다이렉션(Redirection)    (방향 재지정)

각 프로세스를 위한 파일 기술자(File Descriptor)가 쉘에 의해 만들어 진다. 한 개의 파일을 열면 그 연 파일을

나타내는 특별한 숫자를 쉘이 만들어 내는데 이것이 파일 기술자이다. 이런 번호들 중 미리 예약 되어져서 파일을

열 때 주어지지 않는 번호가 있는데 아래 표와 같다.

 

파일 기술자(File Description)

프로세스가 파일을 열때 할당되는 번호

 

입력 리다이렉션(Redirection stdin)

# mail -s "OK: linux209" root < report.txt

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

 

출력 리다이렉션(Redirection stdout)

# ls -l > ls.txt

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

 

에러 리다이렉션(Redirection stderr)

# ./backup.sh > backup.log 2>&1

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

 

 

표준 입력, 표준출력

 

cat

키보드 로 입력받고 모니터로 출력

 

 

cat < /etc/passwd

입력방향 < /etc/passwd

출력방향은 없기 때문에 모니터로 출력

 

cat > testfile

입력방향: 키보드

출력방향 : file

 

 

입력 리다이렉션(Redirection stdin)

stdin 입력값의 지정이 없으면 키보드로 입력

Redirection 다른 곳에서

 

CMD < filename    (표준입력)

CMD 0< filename    (표준입력 - 파일 기술자 0번)

 

리다이렉션

mail user01

Cc : 같이 보내고 싶은 사용자 email

 

 

# mail -s "Test Mail" user01 < /etc/hosts

( mail -u user01 : root에서 user01의 메일 확인하는법)

# mail -s "Linux209 : OK" admin@paran.com < report.txt

 

 

 

출력 리다이렉션(Redirection stdout)

# ls -l > ls.txt

 

CMD >

CMD 1>

CMD >>

 

 

 

 

> , >> 차이점

출력 위치를 지정하지 않으면 모니터에 출력

파일에 집어넣어 출력

 

 

에러 리다이렉션(Redirection stderr)

# ./backup.sh > backup.log 2>&1

 

CMD 2> filename

CMD 2>> filename

 

nodir 이 없기 때문에 에러출력

 

에러 메세지를 dirfilename1 에 출력

 

 

ls /test /nodir > dirfilename 2>&1

fd값 2번을 1번으로 보내라

출력되는 /test 와 에러되는 /nodir 을 같이 포함해서 출력

 

 

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

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

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

 

 

(실무 예) ./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

 

 

파이프(pipe)

 

 

 

출력 결과를 파일로 저장

 

tee

 # CMD > file.log

내용을 파일에 저장

# CMD | tee file.log

 내용을 파일에 저장하면서 모니터에도 출력

 

 

 

 

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

 

 

 

script CMD : 명령어와 그 출력결과를 파일에 저장

 

 

 

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

 

 

 

배쉬셀 기능(Bash shell Function)

set -o                     쉘 자체기능 전체 출력

set -o [기능의이름]        켜기

set +o [기능의이름]        끄기

 

 

 

 

 

 

로그아웃 방지 기능

 

배쉬 쉘 할당 받음

Ctrl + D 키 입력시 logout 된다

 

set -o ignoreeof 입력하여

Ctrl + D 키를 사용해도 logout 되지 않게 설정

 

 

덮어쓰기 방지기능

 

 

 

set -o vi

[TAB] 키를 vi편집기에서 [ESC]+[\] 로 사용

편집기 명령행 모드 를 쉘에서 사용할수 있다

 

 

 

 

디렉터리 목록 확인(<TAB><TAB>)

# cd /test mkdir dir{1,2,3}

# cd /test<TAB><TAB> 입력시

test 디렉터리의 목록을 출력해준다

 

 

변수(Variable)

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

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

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

 

 

지역변수

변수 선언 방법(EX: bash) 

문자, 숫자, 언더바

# VAR=5

# export VAR    변수선언

# echo $VAR    (# printf$VAR)    변수확인

# unset VAR    변수해제

 

 

 

지역 변수선언&확인(현재 쉘에서만)

 

 

 

 

환경변수

환경 변수선언

서브 쉘 에서도 선언되있는 상태(export 선언)

export var=centos 변수 초기화

하위 쉘 도 같이 선언

 

 

상위 쉘은 변하지 않지만 하위 서브 쉘은 동일하게 선언됨

(환경변수는 자신이 선언한 쉘의 서브쉘에서 적용)

상위 쉘에는 적용되지 않음

 

 

[참고] env 와 set의 차이점 (선언된 변수 확인 명령어)

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

env : 환경변수만 출력

시스템/쉘 에 export 되어있는 변수

 

시스템 지역변수( Not export)

 

 

 

배쉬 쉘 기능 ( PS1 시스템 환경 변수 설정 )

 

# echo $PWD    현재 작업 중인 디렉터리가 정의되어 있는 변수

# echo $LOGNAME    현재 사용자의 로그인 할 때의 이름

# echo $TERM    터미널 정의가 되어 있는 변수

# echo $LANG    언어가 선언되어 있는 변수

# echo $USER    현재 사용자 이름이 선언된 변수

# echo $UID    현재 사용자의 UID 번호가 선언된 변수

 

 

 

특수변수

$ : 현제쉘을 PID를 저장하고 있다.

 

# echo $$

? : 바로 이전 명령어의 정상 실행 여부에 대한 결과값

0 : 정상 스크립트

0이아닌수 : 비정상 스크립트

 

 

백업 스크립트 작성시

# vi backup.sh

 

 

 

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

 

 

백업 스크립트 실패 유무 확인

vi backup.sh 작성

 

 

 

실행이 안되도록

vi /root/bin/backup.sh  파일 수정

 

 

 

인자변수(Argument Variable)

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

 

vi test.sh

#!/bin/bash

$0 프로그램 이름

$* 모든인자

$# 인자의 갯수

 

 

PATH변수

명령어를 검색할 디렉터리 지정하는 변수

vi ~/.bash_profile

 

 

 

HISTTIMEFORMAT 변수

 

 

 

 

 

 

 

메타케릭터(Metacharcter)

의미가 있는 문자

 

''(작은 따옴표(single quotation))

 

""(큰 따옴표(Double quotation))

 

``(역 따옴표(Back quotation))

 

\ (역 슬래쉬(Back slash))

 

; (세미콜론(Semicolon))

 

 

''(작은 따옴표(single quotation))

쉘이 해석 할 수 없도록 막아 준다

 

# echo $HOME

# echo '$HOME'

 

 

""(큰 따옴표(Double quotation))

쉘이 해석 할 수 없도록 막아 준다. 단 인식되는 문자( $, ``, \)가 있다

 

 # echo $HOME

# echo "$HOME" ($기호는 인식된다)

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

 

 

 

``(역 따옴표(Back quotation))

쉘이 해석할 때 명령어로 인식한다 따라서 역 따옴표 안에 내용을 실행한다

 

 # echo `date`  (# echo $(date))

 

# echo "`hostname`     is    m y   hostname"

 

 

 

 

 

 

\ (역 슬래쉬(Back slash))

바로 이후에 있는 문자를 쉘이 해석 할 수 없도록 막아 준다

 

# echo $HOME

# echo \$HOME

 

 

# \CMD

# CMD\ (\가 라인의 에 있을때)

명령어 라인을 다음줄로 넘겨 쓸때

 

123213213\

123213... \

123123

 

 

; (세미콜론(Semicolon))

한개의 라인에 여러개 명령어 수행 할때 사용

 

# ls

# date

# cal

# ls ; date ; cal 처럼 사용 할수 있다

 

 

 

 

 

히스토리(Historoy)

사용자가 시스템에서 사용한 명령어(1000개) 저장

 

grep -i histsize /etc/profile    히스토리size값

hisroty -c    현재까지 사용한 명령어(history) 삭제

[HISTTIMEFORMAT] 변수($HOME/.bash_history)

 

 

alias

 

 

별칭(Alias)

# alias cp='cp -i'

# alias (# alias cp)

# unalias cp

 

 

# alias cp='cp -i'

# alias mv='mv -i'

# alias rm='rm -i'

 

# alias vi='/usr/bin/vim'

# alias pps='ps -ef | head -1 ; ps -ef | $1'

 

 

 

[EX1] 별칭 테스트

# alias a='cd /test && rm -rf /test/*'

# alias b='cp /etc/passwd file1 ; cp file1 file2 ; cp file1 file3'

# a

# b

# ls

 

 

(주의) alias 이름과 명령어 이름이 중복되는 경우

alias cp='cp -i'

/bin/cp

 

# cp file1 file2 (# cp -i file1 file2)

 

 

환경파일(Environment File)

 

 

(1-1) 로그인시에 읽혀 지는 환경 파일

 

/etc/profile

/etc/profile.d/*.sh

~/.bash_profile (~/.bash_profile -> 파일이 없으면 -> ~/.bash_login -> 파일이 없으면 -> ~/.profile)

~/.bashrc

/etc/bashrc

 

 

(1-2) 쉘이 실행 될때 마다 읽혀 지는 환경 파일

 

~/.bashrc

/etc/bashrc

/etc/profile.d/*.sh

 

 

 

환경파일 분석

/etc/profile

 


# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

pathmunge () {
        if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then /* PATH 변수 내용 순서를 설정 */
           if [ "$2" = "after" ] ; then
              PATH=$PATH:$1
           else
              PATH=$1:$PATH
           fi
        fi
}

# ksh workaround
if [ -z "$EUID" -a -x /usr/bin/id ]; then    /* EUID 없으면 선언 */
        EUID=`id -u`
        UID=`id -ru`
fi

# Path manipulation
if [ "$EUID" = "0" ]; then       /* root 사용자이면 PATH 변수 선언, 위에 존재하는 pathmunge () 사용 */
        pathmunge /sbin
        pathmunge /usr/sbin
        pathmunge /usr/local/sbin
fi

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1  /* -S : Soft 설정, -c : core 파일의 최대 크기 설정 */

if [ -x /usr/bin/id ]; then      /* USER, LOGNAME, MAIL 변수 선언 */
        USER="`id -un`"
        LOGNAME=$USER
        MAIL="/var/spool/mail/$USER"
fi

HOSTNAME=`/bin/hostname`         /* HOSTNAME, HISTSIZE 변수 선언 */
HISTSIZE=1000

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

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then
    umask 002
else
    umask 022
fi

for i in /etc/profile.d/*.sh ; do    /* /etc/profile.d/*.sh 스크립트 실행 */
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . $i
        else
            . $i >/dev/null 2>&1
        fi
    fi
done

unset i                 /* i 변수 unset */
unset pathmunge         /* pathmunge 함수 unset */

 

 

 

 

 

/etc/profile.d 디렉터리

 

 

*.sh가 모두 실행된다

 

 

 

 

 

 

 

 

cat ~/.bash_logout

 

 

 

사용자 환경 파일이 읽혀지는 순서

 

 

 

vi /etc/profile

 

(cd /etc/profiel.d)

vi test.sh

 

vi ~/.bash_profile

 

vi ~/.bashrc

 

vi /etc/bashrc

 

vi ~/.bash_logout

 

 

각각에 echo 명령어를 넣는다

 

 

사용자로 로그인

 

 

 

 

 

~/.bashrc 예

# .bashrc

 

# User specific aliases and functions

 

alias rm='rm -i' /* 기본적인 명령어에 대한 alias 선언 */

alias cp='cp -i'

alias mv='mv -i'

 

# Source global definitions /* /etc/bashrc 실행 */

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

 

---------------------------- ~/.bashrc 파일 하단에 추가 -----------------------------

# (a). 기본적인 alias

alias c='clear' /* 명령어를 짧게 사용하기 위한 설정 */

alias h='history'

alias t='/usr/kerberos/bin/telnet 172.16.9.252'

alias d='cd /test && rm -rf /test/*'

 

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

alias cat='/bin/cat -n'

alias df='/bin/df -h -T'

alias ls='ls -h --color=tty'

 

# (b). 필요한 경우 선언하는 alias

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

alias lsd='/bin/ls -al | grep ^d'

alias pps='/bin/ps -ef | head -1 ; ps -ef | grep $1'

alias ddf='/bin/df -h -F ext3 ; echo ; /bin/df -i'

 

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

alias ipconfig='ifconfig' -----> 윈도우즈 명령어 실행 alias

alias topas='top' -----> AIX

alias bdf='df -h' -----> HP-UX

alias prstat='top' -----> Solars

 

alias nslookup='/usr/local/bin/nslookup' /* 다른 위치의 명령어 실행 */

alias vi='/usr/bin/vim'

 

# (c). 편리한 기능의 alias

/*

Webserver(Apache)

/etc/httpd/conf/httpd.conf -----> Configuration File

/var/www/html -----> Source Directory

/etc/httpd/logs -----> Log Directory

*/

 

# 설정 파일

alias fconf='vi /etc/vsftpd/vsftpd.conf'

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

alias vsftpd.conf='vi /etc/vsftpd/vsftpd.conf'

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

# 소스디렉토리 이동

alias wdir='cd /var/www/html'

# 로그파일 모니터링

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'

/* 실무에서 많이 사용되는 로그 파일 이름 형식 */ () 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"

---------------------------- ~/.bashrc 파일 하단에 추가 -----------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Bash shell characteristics

 

리다이렉션(Redirection)

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

fd

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

0        stdin

1        stdout

2        stderr

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

 

Redirection stdin

# mailx -s "linux2XX: OK" root@example.com < report.txt

Redirection stdout

# ls -l > ls.txt

Redirection stderr

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

 

# ./script.sr > script.log 2>&1

# ./configure --prefix=/usr/local/apache2 > apache.log 2>&1

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

 

파이프(pipe)

# CMD | more

# CMD | grep xinetd

# CMD | CMD | CMD

 

[참고] tee CMD

while true

do

CMD | tee -a file.log

sleep

done

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

(화면 공유 pts 들에게 )

배쉬셀 기능(bash function)

# set -o

# set -o vi

# set +o vi

 

# set -o ignoreeof

# set -o noclobber

# set -o vi

 

[참고] <TAB> 자동완성기능

   <TAB><TAB> 목록 확인

 

변수(variable)

변수종류

지역변수 ( # VAR=5 //export가 안되있는 변수)

환경변수 ( # export VAR=5 )

특수변수 ( $!, $?, $$, $0, $1, $2, $*, $# ...) 

변수 선언 방법

# VAR=5 ; export VAR        (# export VAR=5 )    선언

# echo $VAR    확인

# unset VAR     해제

변수의 export 의미

시스템/쉘 환경변수 (set/env)

PATH

PS1/PS2    (-> export PS1='\w> ')

HOME/PWD/LOGNAME/TERM/LANG/USER/UID

(-> # export TERM=vt100, # export LANG=C)

HISTTIMEFORMAT

 

메타케릭터(Metacharacter)

' '   " "    ` `    ;    \

히스토리(History)

HISTTIMEFORMAT (~/.bash_history)

엘리어스

# alias cp='cp -i'

# alias

# unalias cp

 

환경파일

/etc/profile

~/.bash_profile

~/.bashrc