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
'Learning > └Essential & Admin' 카테고리의 다른 글
리눅스 원격접속 과 파일전송_Unit15 (0) | 2016.10.28 |
---|---|
리눅스 프로세스 관리_Unit14 (0) | 2016.10.27 |
리눅스 압축 과 아카이빙_Unit12 (0) | 2016.10.25 |
리눅스 검색관련 CMD_Unit11 (0) | 2016.10.25 |