최초 구동되는 프로세스는 PID 1의 init프로세스.
inittab(System V), getty프로세스 생성(BSD)
1.터미널 포트 연다.
2.표준입력,표준출력,표준에러 방향 설정
3.화면에 로그인 프롬프트 띄움.
4./bin/login이 실행되면 패스워드 요구.
5.입력된 패스워드 암호화, 초기환경 설정
6.패스워드파일(/etc/passwd)의 맨 마지막에 기록되어 있는 사용자 쉘 실행(/bin/ksh)
7.시스템 파일인 /etc/profile 찾아서 실행
8.사용자 홈 디렉토리 초기화 파일 .profile, .kshrc 찾아서 실행
9.드디어 프롬프트가 나와 사용자 명령 기다림.
초기화 파일
1./etc/profile
2.~/.profile
3.~/.kshrc
/etc/profile은 사용자가 로그인 할 때, 시스템 전체적으로 공통된 초기화를 위해 관리자가 설정하는 파일.
※본쉘,콘쉘 사용자들에게 적용
~/.profile은 사용자가 설정하는 초기화 파일로 로그인 할 때 한번 실행.
ENV 특수변수 - 현재 파일(.profile)다음에 바로 실행시킬 파일 이름을 저장.
이 값은 대부분 .kshrc
ENV 파일은 ksh 자식 쉘이 실행될 때마다 매번 실행.
set -o 옵션(켠다)
set +o 옵션(끈다)
set -[a-z]
set +[a-z}
allexport(-a) : 변수를 자동으로 익스포트.
bgnice : 낮은 우선순위에서 백그라운드 작업 수행.
emacs : 명령행 편집을 위해 emacs사용.
errexit(-e) : 명령어가 0이 아닌 종료 상태를 반환하면(실패), ERR 트랩을 실행시키고(설정되어 있다면) 종료.
초기화 파일을 읽을 때는 설정되어 있지 않다.
gmacs : 명령행 편집을 위해 gmacs사용.
ignoreeof : ^D를 사용하여 로그아웃하는 것을 막는다.로그아웃을 위해서는 exit
markdirs : 파일이름을 전개할 때 경로명 끝에 /를 붙인다.
monitor(-m) : 작업제어 허용.
noclobber : 리다이렉션에 의한 파일 덮어쓰기 방지.
noexec(-n) : 명령어를 해석만 하고 실행은 안한다.
스크립트 내 구문의 문법을 검사하기 위해 사용.대화형 모드에서는 사용안함.
noglob(-f) : 경로명 전개 안함.예를 들어 와일드카드의 사용 막음.
notify : 백그라운드 작업이 끝나며 사용자에게 알림.
nounset : 설정되지 않은 변수를 전개하려고 하면 에러 출력.
privileged(-p) : .profile이나 ENV파일을 읽지 않고 쉘을 실행. setUID스크립트에서 사용.
trackall : 전체 경로 별명 사용.
verbose(-v) : 디버깅을 위해 verbose모드 사용.
vi : 명령행 편집을 위해 vi사용.
xtrace(-x) : 디버깅을 위해 echo모드 사용.
PS1 주 프롬프트($), PS2 보조 프롬프트(<)
마침표(.)명령어
콘쉘의 내부명령어.
스크립트의 이름을 인자로 갖는다.
현재 쉘 환경에서 실행.
자식 프로세스 생성 안함.
스크립트 내에서 정의된 모든 변수들은 현재 쉘 환경의 일부가 된다.
현재 쉘에서 정의한 모든 변수들도 스크립트 환경의 일부가 된다.
한 행 이상 입력 \
※명령행의 처리 순서
1.키워드(if, while, untile등)
2.별명
3.내장명령어
4.함수
5.스크립트와 실행 가능한 프로그램.
※명령어의 유형
whence -v 또는 별명인 type
※종료상태
0~255 $?
※명령행에서 여러 명령어 사용
ls;pwd;date
(ls;pwd;date) > outputfile (그룹으로 묶으면 한방에 리다이렉션)
※조건부 실행
&&, ||
ex) cc prgm1.c -o prgm1 && prgm1
cc prog.c >& err || mail bob < err
여기서는 종료 상태값이 0이어야 참이다.
※백그라운드에서 실행
앰퍼센드(&)
※명령행 히스토리
history <- fc -l의 별명
.sh_history
HISTSIZE 기본값 128
HISTFILE 기본값 ~/.sh_history
history -n (번호 없이)
history 8 (8이후 부터)
history -3 (최근에 3개)
history -1 -5 (최근에 5개 역순)
history -5 -1 (최근에 5개 순차)
history ls echo
history -r ls echo
r명령어 - 마지막으로 실행한 명령어를 다시 실행
r 번호, r 문자
r vi file1=file2
명령행 편집기
1.set -o vi
2.VISUAL=vi
3.EDITOR=/usr/bin/vi
G 히스토리 첫행
/string 위 방향 검색
? 아래쪽 방향 검색
FCEDIT
변수 설정되어 있지 않으면 /bin/ed
파일이름 전개
ls a[Esc]=
ls a[Esc]*
print apples pears peaches
print [Esc]_
print [Esc]2_
command [Esc]# : #앞의 명령어를 히스토리 목록에서 주석 처리.
word[Esc]* : *는 현재 단어를 포함하는 모든 파일이름로 대체.
word[Esc]\ : \는 현재 단어로 시작하는 파일이름으로 대체.
word[Esc]= : 현재 단어로 시작하는 파일이름들에 일련번호를 붙여서 출력.
※별명
alias
autoload=typeset -fu
false=let 0
function=typeset -f
hash=alias -t
history=fc -l
integer=typeset -i
r= fc -e-
stop=kill -STOP
suspend=kill -STOP $$
true=:
type=whence -v
\ls.. \은 별명의 기능을 정지.
unalias 별명
※전체 경로 별명
경로 검색에 들어가는 시간을 줄이기 위해서 콘쉘은 처음 입력한 명령어의 전체 경로를 찾아 별명으로 생성한다.
이를 전체 경로 별명(tracked alias)이라고 한다.
※작업제어
jobs
jobs -l (PID함께)
fg %1 (번호 지정 없으면 가장 최근에 백그라운드에서 실행시킨 작업을 포그라운드로 되돌린다.)
bg %n
wait %n 작업번호가 n인 작업이 종료할 때까지 기다린다.
kill %n 특정 작업에 kill 시그널을 보낸다.
※메타문자
\ : 뒤에 오는 문자를 문자 자체로 인식.
& : 프로세스를 백그라운드에서 수행.
; : 명령어 분리.
$ : 변수치환.
? : 하나의 문자.
[abc] : 문자 집합 중 하나의 문자와 대응
[!abc] : 문자 집합에 포함되지 않은 문자와 대응
* : 0개 이상의 문자와 대응
(cmds) : 자식 쉘에서 명령어를 수행
{cmds} : 현재 쉘에서 명령어를 수행
글로빙(globbing) : 파일이름 치환
틸드(~) : 사용자 홈디렉토리
하이프(-) : 이전 작업디렉토리, OLDPWD
~+ : 현재 작업디렉토리의 전체 경로
※새로 추가된 ksh 메타문자
abc?(2|9)1 : ?는 괄호안의 패턴 0개 혹은 1개와 대응. |는 or => abc21, abc91, abc1
abc*([0-9]) : *는 괄호안의 패턴 0개 이상과 대응. => abc, abc1234, abc3, abc2
abc+([0-9]) : +는 괄호안의 패턴 1개 이상과 대응. => abc3, abc123,
no@(one|ne) : @는 괄호안의 패턴중 정확히 1개와 대응. => noone, none
no!(thing|where) : !는 괄호안의 패턴을 제와힌 나머지 모든 패턴과 대응.=> no,nobody,noone등이 해당.
noglob변수
설정하면 파일이름 치환이 일어나지 않는다.
~,$ 제외
※변수
지역변수
자신이 생성된 쉘에서만 사용.
첫글자는 알파벳과 _
등호(=) 양쪽에 공백오면 안됨.
널값은 등호(=) 다음에 바로 개행문자
하나 이상 단어는 반드시 " 사용
$, 중괄호{}
읽기전용 typeset -r, readonly 재설정, 재정의 못함.
※환경변수
export
자식 쉘은 부모 쉘에 있는 변수에 영향을 미칠 수 없다.
※콘쉘의 환경변수
_ 이전 명령어의 마지막 인자
CDPATH
COLUMNS - shell의 편집 모드와 select명령어를 위한 윈도우의 폭을 설정
EDITOR
ENV
ERRNO
FCEDIT
FPATH
HISTEDIT
HISTFILE
HISTSIZE
HOME
IFS
LINENO
LINES
MAILCHECK
MAILPATH
OLDPWD
PATH
PWD
PPID
PS1
PS2
PS3
PS4
RANDOM
REPLY
SHELL
TMOUT
VISUAL
※변수 목록 출력
set : 모두 출력(널 변수 포함.)
env : 전역변수만.
typeset : 모든 변수, 정수, 함수, 익스포트된 변수까지, +옵션은 변수들의 이름만.
set -o 모든 옵션을 보여준다.
※변수 설정 해제
unset 변수이름;
※변수 값 출력
echo와 print는 모두 콘쉘의 내장 명령어
※print 옵션
-r : 확장 문자열 금지
-R : ksh가 -2나 -x를 print의 인자로 사용하는 것을 막는다.
-n을 제외하고 인자 앞에 -가 오는 경우 해제한다.
\t, \c를 특별하게 해석하지 않고 그대로 출력
-un : 출력을 파일 식별자 n으로 리다이렉트한다.
-n : 출력에 개행문자를 포함 안함.(echo -n)
-p : 출력을 표준출력으로 보내지 않고 다른 프로세스나 파이프(&|)로 보낸다.
-s : 출력을 명령어로 간주하여 히스토리 파일에 덧붙인다.
- : 다음에 나오는 인자들은 print명령어의 옵션으로 사용하지 않는다.
-f : printf의 기능을 흉내(emulate)
※변수 표현식과 변수 변경자
${variable:-word} : 변수에 널이 아닌 값이 지정되어 있으면 변수값을 사용한다.널이면 word 잠시 치환.
${variable:=word} : 변수에 널이 아닌 값이 지정되어 있으면 변수값을 사용한다.널이면 word 영구히 치환.
${variable:+word} : 변수에 널이 아닌 값이 지정되어 있으면 word로 잠시 치환.널이면 아무것도 치환안함.
${variable:?word} : 변수에 널이 아닌 값이 지정되어 있으면 변수값을 사용한다.널이면 word출력.쉘 종료.
※부분문자열에 대한 변수 전개
${variable%pattern} : variable값의 후반부에서 pattern과 일치하는 가장 작은 부분을 찾아 제거
${variable%%pattern} : variable값의 후반부에서 pattern과 일치하는 가장 큰 부분을 찾아 제거
${variable#pattern} :variable값의 전반부에서 pattern과 일치하는 가장 작은 부분을 찾아 제거
${variable##pattern} : variable값의 전반부에서 pattern과 일치하는 가장 큰 부분을 찾아 제거
※변수속성: typeset명령어
typeset -u : 대문자
typeset -l : 소문자
typeset -L4 : 좌측폭,왼쪽정렬
typeset -R2 : 우측폭,오른쪽정렬
typeset -Z15 : Null-Padded String
typeset -LZ15 name
integer n=25
typeset -Z15 n
print "$n"
000000000000025
typeset : 모든 변수 출력.
typeset -i num : 정수.
typeset -x : export 변수 출력.
typeset a b c : 함수 안에서 사용된 경우, 지역변수 a,b,c를 생성.
typeset -r x=foo : 변수 x를 foo로 설정하고 읽기전용.
※위치인자.
$0 쉘 스크립트 이름
$1~$9
${10}
$# 총 개수
$* 모든 위치 인자 평가
$@ 큰 따옴표를 사용하였을 때를 제외하고는 $*와 동일한 의미
"$*" "$1 $2 $3"으로 평가
"$@" "$1" "$2" "$3"으로 평가
$$ 쉘의 PID
$- 현재 쉘에 설정된 옵션
$? 가장 최근에 실행시킨 명령어의 종료 상태
$! 백그라운드에서 최근에 수행된 프로그램의 PID
※인용부호
작은 따옴표는 쉘이 메타문자를 해석하지 못하도록 막는다.
큰 따옴표는 명령어 치환, 변수 치환 허용.
※명령어치환
본쉘과 C쉘은 백코우트(`)
콘쉘은 백코우트(`)와 $(Command)
line=$(<filex) : 파일로부터의 입력을 line변수에 저장. <filex기호는 `cat filex`와 같은 결과
dirname="$(basename $(pwd))" : 백코우트는 중첩 허용 안함.
※함수
대화형 모드에서 사용 또는 초기화파일에 저장하여 자동으로 설정.
alias와 차이점 : 인자의 사용.
스크립트와 차이점 : 현재 쉘에서 실행.(자식 쉘 생성 안함.)
모든 변수 공유.
※호출하기 전에 정의.
※정의방법 2가지
-본쉘(하위 호환성)
함수이름() { 명령어(들); 명령어(들);}
변수와 트랩을 지역적인 통용범위 내에 한정하는 방법은 사용할 수 없다.
-콘쉘
function 함수이름 { 명령어(들); 명령어(들);}
여는 중괄호 다음에는 반드시 스페이스를 삽입.
쉘 내에서 다른 함수로 익스포트 가능.
typeset -f : 함수의 정의를 출력(function는 typeset -f의 별명)
typeset +f : 함수의 이름만
typeset -fx : 익스포트된 함수의 정의
unset -f name : 함수 설정 해제
※지역변수와 반환값
함수내에서만 유효(typeset)
return 명령어에 아무 인자도 지정하지 않을 경우 함수의 반환값은 가장 최근 명령어의 종료 상태
0~255
※익스포트된 함수
typeset 명령어를 사용하여 ENV파일에서 정의하지 않는 한 함수의 정의는 자식 쉘에 상속되지 않는다.
(typeset -fx function_names)
※typeset 명령어와 함수 옵션
함수의 자동 로드
ENV 파일 안에 FPATH변수 설정
FPATH는 함수 파일을 담고 있는 디렉토리 경로를 지정
사용되는 함수와 동일한 이름
autoload는 typeset -fu 명령어의 별명
※표준 입출력쉘은 구동될 때 stdin,stdout,stderr 세 개의 파일(스트림(stream))을 연다.
stdin : 0 키보드
stdout : 1 화면
stderr : 2 화면
※리다이렉션
< 입력 방향을 바꾼다
> 출력 방향을 바꾼다
>> 출력에 덧붙인다.(append)
2> 에러의 방향을 바꾼다
1>&2 출력을 에러로 내보낸다
2>&1 에러를 출력으로 내보낸다
※exec명령어와 리다이렉션
exec는 새로운 프로세스를 생성하지 않고 현재의 프로그램을 새로운 프로그램으로 대체하여 수행.
표준출력과 표준입력 역시 자식 쉘을 새로 생성하지 않고도 변경할 수 있다.
exec명령어를 이용하여 파일을 열면 이어서 read명령어가 파일포인터를 한 번에 한 행씩 아래로 옮겨준다.
EOF(end-of-file)를 만날 때까지 계속
파일을 처음부터 읽고자 할 때는 닫고 다시 연다.
exec ls : ls가 현재 쉘에서 실행.ls수행 끝나면 현재 쉘은 다시 반환하지 않음.
exec < filea : 표준입력으로 filea를 읽는다.
exec > filex : 표준출력으로 filex에 쓴다.
exec 2> errors : 표준에러를 errors에 쓴다.
exec 2> /dev/console: 표준에러를 console에 출력한다.
exec 3< datafile : datafile을 파일식별자 3으로 연 후에 읽어 들인다.
sort <&3 : data파일을 정렬한다.
exec 4> newfile : newfile을 파일식별자(fd) 4로 연 후에 쓴다.
ls >&4 : ls명령어의 출력을 newfile로 리다이렉션한다.
exec 5<&4 : 파일식별자(fd) 4의 복사본으로 fd 를 만든다.
exec 3<&- : 파일식별자(fd) 3을 닫는다.
※파이프
기호 |
왼쪽 명령어의 출력을 오른쪽 명령어의 입력으로 보냄.
파이프라인은 하나 이상의 파이프로 구성.
※here문서와 입력 리다이렉션
사용법 : << 기호 뒤에 사용자가 지정한 단어나 기호(종료기호)를 사용하고 개행문자 입력
다음 행의 내용부터는 명령어의 입력으로 사용.
사용자 정의한 종료기호 만나면 끝.
<<-를 사용하면 마지막 종료기호 앞에 TAB 삽입 가능.
UNIX Command << TERMINATOR
lines of input
input
TERMINATOR
※TMOUT 변수
정수 타입
특정한 시간 내에 엽력하도록 제한.
기본값 0(무제한), 0보다 크면 지정한 시간 내에 입력없으면 1차 경고, 2차 유예, 3차 가차없이 종료.
600=60초
#!/bin/ksh #!은 매직넘버
# 주석
※실행문과 콘쉘의 구조
유닉스 명령어, 콘쉘 명령어, 프로그램 구조, 주석
※chmod +x 스크립트
실행 권한 부여하지 않았을지라도 ksh명령어의 인자로 지정하면 실행 가능.
ksh 스크립트
※read명령어
파일이나 터미널로부터 입력을 읽어옴.
개행문자가 나타날 때까지...
read response?"Do you feel okay?"
read -u3 line 파일식별자 3으로부터 한 행 입력을 받아, 변수 line에 저장한다.
read 입력을 REPLY에 저장
※read옵션
-r : 개행문자(\n)를 일반 문자열로 취급.
-s : 입력행을 히스토리 파일에 복사.
-un : 파일식별자 n으로부터 읽는다.기본값은 파일식별자 0(표준입력)
-p : 다른 프로세스로부터 한 행을 입력받는다.
-A : 각 필드를 배열로 저장.첨자는 0부터
-t : sec 사용자의 응답 제한시간을 설정
-d : char 입력 종료를 알리는 구분자를 바꾼다.기본값은 개행문자.
※산술연산
typeset -i : variable 오직 정수만
typeset -i# : #진법
typeset -F : variable 부동소수점 수를 저장
typeset -E : variable float variable 부동소수점 수를 저장
(( )) 연산자를 사용하지 않는 경우, 스페이스는 따옴표로 묶거나 사용하지 말아야 한다.
ex)num=5+5, num="4 * 6"
※산술연산자와 let명령어
let = (( ))
- !, ~, *, /, %, +, -, <<, >>, <=, >=, <, >, ==, !=, &, ^, |, =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
산술연산시 $기호 필요없다.
스페이스는 따옴표(let)
※test, [], [[ ]]
test $name = Tom 등호 좌우 스페이스
[ $name = Tom ] 대괄호 다음 스페이스
[[ $name = [Tt]?om ]] 쉘 메타 문자 가능, 콘쉘만 가능
0이면 성공, 0이 아니면 실패
조건의 표현과 흐름제어
※문자열검사
string1 = string2(string1은 string2와 같다)
string1 != string2(string1은 string2와 다르다)
string(string은 널이 아니다)
-z string(string의 길이가 0이다)
-n string(string의 길이가 0이 아니다)
※정수검사
int1 -eq int2 int1은 int2와 같다
int1 -ne int2 int1은 int2와 다르다
int1 -gt int2 int1은 int2보다 크다
int1 -ge int2 int1은 int2보다 크거나 같다
int1 -lt int2 int1은 int2보다 작다
int1 -le int2 int1은 int2보다 작거나 같다
※논리연산자
! not 연산자
-a and 연산자
-o or 연산자
※파일검사
-b : filename 블록(block)파일
-c : filename 문자(character file)파일
-p : filename 파일이 명명된 파이프(named pipe)이다
-d : filename 디렉토리가 존재
-f : filename 파일이 존재하고 디렉토리가 아니다
-g : filename setGID가 설정되어 있다
-u : filename setUID가 설정되어 있다
-k : filename 스티키비트(sticky bit)가 설정되어 있다
-h : filename 심볼릭 링크
-r : filename 파일이 읽기 가능하다
-w : filename 파일에 쓰기가 가능하다
-x : filename 파일이 실행 가능하다
-s : filename 파일크기가 0이 아니다
※신 버전의 test명령어
[[ ]] 새로운 연산자 사용 가능
문자열 검사
string ==/= : pattern string은 pattern에 대응한다.
string != pattern : string은 pattern에 대응되지 않는다.
string1 < string2 : string1의 ASCII값은 string2보다 작다.
string1 > string2 : string1의 ASCII값은 string2보다 크다.
-z string : string의 길이가 0이다(널 인자)
-n string : string의 길이는 0이 아니다(널이 아닌 인자)
※이항 연산자를 이용한 파일 검사
file1 -nt file2 : file1이 file2보다 최근 것이면 참
file1 -ot file2 : file1이 file2보다 오랜된 것이면 참
file1 -ef file2 : file1이 file2가 이름만 다르면 참
※논리연산자
&&, ||
※파일 검사
콘쉘에서만 지원하는 옵션
-a file : 파일이 존재한다
-e file : 파일이 존재한다
-L file : 파일이 존재하고 심볼릭 링크이다
-O file : 사용자가 파일의 소유자이다
-G file : 사용자의 그룹 ID가 파일의 것과 같다
-S file : 파일이 존재하고 소켓이다
※if사용법
if 명령어
then
fi
if test 조건식
then
fi
if [ 조건식 ]
then
fi
if [[ 조건식 ]]
then
fi
※이중대괄호[[ ]]는 문자열과 파일검사에만 사용
※이중중괄호(( ))는 산술식 검사
if/elif/else
※null명령어
내장명령어, 콜론(:)
아무런 작업 안함.
단지 종료 상태를 0으로 돌려줄 뿐.
: ${EDITOR:=/bin/vi}
※case명령어
;;나올 때까지의 명령어 실행
실행이 끝나면 esac 다음으로 제어 옮김
변수와 대응되는 것이 없으면 *)
case variable in
value1)
명령어(들);;
value2)
명령어(들);;
*)
esac
※루프명령어
for, while, until, select
-for명령어
for variable in wordlist
do
명령어(들)
done
-do를 다른 단어들과 같은 행에 사용하고자 한다면 세미콜론(;)을 사용하여 구분
ex) for pal in tom, dick, harry joe; do
while명령어
while 명령어
do
명령어(들)
done
let 1 (TRUE) let 0 (FALSE)
until 명령어
do
명령어(들)
done
※selelct명령어와 메뉴
LINES 메뉴항목
COLUMNS 출력모양
프롬프트 PS3을 이용해 사용자의 입력을 기다린다
PS3 기본값 #?
입력한 값은 REPLY
루프탈출 break, 스크립트 종료 exit
selectvar in wordlist
do
명령어(들)
done
※shift명령어
지정한 횟수만큼 왼쪽으로 이동.
인자 없으면 한자만 이동.
영구히 제거.
shift [n]
※break명령어
내장명령어
루프 탈출
프로그램 종료는 exit
done 다음으로 이동
중첩루프일 경우 break n
세 개의 루프 : 가장 바깥쪽 3, 중간 루프 2, 맨 안쪽 1
※continue명령어
지정한 조건이 참이면 제어를 루프의 시작 부분으로 되돌림.
아래의 명령어들은 모두 무시
중첩루프일 경우 가장 안쪽의 루프
세 개의 루프 : 가장 바깥쪽 3, 중간 루프 2, 맨 안쪽 1
※I/O 리다이렉션과 루프
콘쉘은 루프내에서 파이프나 리다이렉션의 사용을 허용.
본쉘과 달리 루프의 자식 셀이 아닌 현재 쉘에서 실행.
루프 내에서 설정한 변수들은 루프 종료후에서 계속 사용.
루프의 출력을 UNIX명령어의 입력(파이프)로 사용
for i in 7 9 2 3 4 5
do
print $i
done | sort +n
백그라운드에서 루프 사용
for person in bob jim joe sam
do
mail $person < memo
done &
※exec명령어와 루프
exec명령어는 자식쉘을 생성하지 않고 표준입력이나 표준출력을 열고 닫을 때 사용.
※IFS와 루프
쉘의 내부 필드 구분자(internal field separator, IFS)는 스페이스, 탭, 개행문자
IFS는 단어(token)의 구분에 사용
※배열
1차원 배열에 1024
배열요소 단어나 정수
배열첨자 0부터
set -A
결합배열(associative arrays)지원
typeset -i ints[4]
※set명령어로 배열 생성
set -A 배열이름 배열요소1 배열요소2 ...
※시그널 트래핑
trap '명령어;명령어' 시그널
kill -l
시그널을 정상적으로 처리하거나(기본값), 시그널을 무시하거나, 적절한 시그널 처리 함수(interrupt handler)를 생성
의사시그널
psedu 또는 fake signal
실제 시그널은 아님
쉘 프로그램을 디버깅하기 위해 사용
DEBUG 스크립트의 각 명령어마다 trap명령어를 실행시칸다.
ERR 스크립트 내의 어떤 명령어가 0이 아닌 종료 상태값을 반환하면
trap명령어를 실행.
O 혹은 EXIT 쉘이 종료할 때 trap명령어를 실행.
시그널 재설정
trap명령어 다음에 시그널 이름이나 번호만 지정.
함수 내에서 trap 설정은 지역적
trap 2 혹은 trap INT
시그널 무시하기
trap " " 1 2 혹은 trap " " HUP INT
trap - ERR
※코프로세스
다른 명령어의 표준입력에 쓰고 그 명령어의 표준출력을 자신의 입력으로 읽어올 수 있게 하는
특수 양방향 파이프라인이다.
|&
read -p, print -p
exec 4>&p exec 4<&p
※디버깅
noexec => ksh -n : 실행않고 구문검사
xtrace => ksh -x : 추적
verbose => ksh -v : 각 행을 입력된 대로 출력 실행
PS4 +
typeset -ft 함수의 실행과정 추적
export PS4='$LINENO'
trap 'print $LINENO' DEBUG 스크립트의 각 행에 행 번호
trap 'print Bad input' ERR 0 아닌 종료 값일 때 trap
trap 'print Exiting from $0' EXIT 스크립트나 함수가 종료하면 메세지 출력
#!/bin/ksh -x
※getopts를 이용한 명령행 옵션 처리
while getopts :xyn: name
1.x와 y, n은 옵션들이다
2.명령행에서 입력한 옵션은 -나 +로 시작한다
3.-나+를 갖지 않는 옵션이 오면 getopts로 하여금 옵션 목록이 끝났음을 알려준다
4.옵션 다음에 콜론(:)을 붙이면, 이 옵션에는 인자가 필요함을 의미한다.
즉 -n옵션에는 인자가 함께 주어져야 한다.
5.옵션 앞에 콜론(:)을 붙이면 유효하지 않은 옵션이 입력되었을지라도 개발자가 이것을 처리하도록
허용함을 의미한다.예를 들어 runit -p 라고 사용했을 때 -p 옵션은 유효한 옵션이 아니다.
getopts는 이 사실을 개발자에게 알려주기는 하지만, 쉘은 따로 에러 메세지를 출력시키지 않는다.
6.getopts가 호출되면 다음 옵션을 -가 없는 상태로 변수 name에 저장한다(변수이름 상관없슴)
옵션 앞에 +가 붙으면, +기호와 함께 옵션을 name변수에 저장한다.
적절하지 않은 인자가 주어지면 name에는 ? 기호를 저장.필요한 인자 지정되지 않으면 콜론(:) 저장
7.특수변수 OPTIND는 1로 초기화한 후 getopts가 하나의 명령행 인자를 성공적으로 처리할 때마다 1씩 증가
8.OPTARG변수는 유효한 인자의 값을 가진다.유효하지 않은 옵션이 주어지면 그 옵션 OPTARG에 저장
※보안
-privileged 스크립트
ksh -p
실제 UID,GID가 유효 UID, GID와 다르면 /etc/suid_profile 실행
-restricted 쉘
ksh -r
cd 사용못함 환경변수(SHELL,ENV,PATH)들의 수정이나 설정해제가 허용안됨
첫 번째 문자 \ 명령어 실행되지 않음.
> < ! >> 리다이렉션 사용금지 set명령어 설정,해제 금지.
rksh 명령어가 제한 쉘 시작
※콘쉘 실행인자
-a : 모든 변수를 자동으로 익스포트
-c : cmd 명령어를 실행
-e : 명령어가 0이 아닌 값을 반환하면 종료
-f : 글로빙(globbing, 파일이름 전개)기능을 끈다
-h : 명령어들을 전체 경로 별명으로 처리
-i : 대화형 모드를 설정
-k : 키워드 옵션을 설정.명령어에 대한 모든 키 인자들은 환경의 일부
-m : 백그라운드에서 실행중인 명령어들이 별개의 프로세스 그룹에서 진행
^c나 로그아웃 하여도 작업이 계속 이루어진다.작업 종료시 메세지 출력
-n : 디버깅할 때 사용.명령어를 읽지만 수행은 안함.-x -v옵션과 함께 사용
-o : 테이블에 나열한 사람들은 set명령어의 옵션을 설정할 수 있도록 허용
-p : privileged모드 설정.setuid프로그램 구동을 위해 사용
-r : restricted모드 설정
-s : 기본값은 표준 입력에서 명령어를 읽는다.
-t : -c가 지정되어 있을 때 첫 번째 인자를 받아서 수행한 후 쉘을 종료
-u : 설정되지 않은 변수에 대한 참고를 에러로 간주
-v : 스크립트나 표준 입력의 각 행을 사용자가 입력한 그대로 출력한 후 실행
출력은 표준 에러로 보낸다.디버깅을 위해서 사용
-x : 스크립트나 표준 입력의 각 행에 대해 파일이름 전개, 변수 치환 및 명령어 치환을 수행하고
결과를 출력한 후 실행.모든 출력에는 PS4 프롬프트인 +기호가 삽입되면 표준에러에 출력된다.
[출처 : http://nsj0409.blog.me/20111841193]
'공학속의 배움 > UNIX' 카테고리의 다른 글
Diff 사용법 (0) | 2011.09.05 |
---|---|
ksh 나 bash 에서 프롬프트에 색깔 입히기 (0) | 2011.08.11 |
Unix Shell의 특징 (0) | 2011.08.11 |
tail 명령어 사용법 (0) | 2011.08.10 |
head 명령어 사용법 (0) | 2011.08.10 |