프로세스의 종료: kill
---------------------------------------------------------------------
1. 프로세스의 종료
kill 프로세스를 종료하거나, 프로세스에 지정한 신호를(signal)보낸다.
이 명령어는 일반적으로 시스템 관리작업을 수행하는 시스템 관리자에 의해 사용된다.
kill 명령어는 지정한 신호를 특정 프로세스에 보낸다. kil 명령어에
의해 지정 가능한 신호들은 kill -l 명령을 통해 확인할 수 있다.
다음은 ls -l 명령의 실행 결과 출력된 신호들의 목록이다.
┌───────────────────────────────┐
│$kill -l │
│HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV │
│SYS PIPE ALRM TERM USR1 USR2 CLD PWR WINCH URG POLL │
│STO TSTP CONT TTIN TTOU VTALRM PROF XCPU │
│XFSZ │
└───────────────────────────────┘
( 이상의 신호들에 대한 설명은 현 단계의 강의 수준을 벗어나기
때문에 생략한다. 자세한 내용은 다음 단계에서 설명될 관리자
기능편에서 자세히 설명된다. )
( 특정신호를 참조하는 방식은 두가지가 있다. 첫째는 위에 표시된
신호명을 사용해 참조하는 방식이고, 둘째는 위 예에서의 순서를
통해 참조하는 방법이다. 예를들면 소프트웨어 종료 신호를
TERM 또는 15로 참조할 수 있다. )
┌───────────────────┐
│ kill [-option] [-signal] PID(s) │
└───────────────────┘
kill 명령어 지정시에 신호를 지정하지 않으면, 신호중 TERM 신호가
가정된다. 몇몇 프로세스는 어떤 신호에 의해 영향을 받지 않는 경우가
있는데, 이 경우 신호 9, 즉 KILL 신호가 이러한 프로세스를 종료하기 위해
효과적이다.
다음은 명령어 사용과 관련된 사항이다.
. 명령어상에서 프로세스 0(PID)의 지정은 현재의 로그인과 관련된 모든
프로세스를 대상으로 특정 신호를 보냄을 나타낸다.
. 다수의 프로세스들이 지정되었을때, 부모 프로세스는 자식 프로세스전에
명령어상에 기술되어야만 한다.
. 명령어상에 지정하는 프로세스는 관리자(superuser)를 제외하고는,
반드시 명령어를 실행하는 사용자가 실행한 프로세스이어야 만 한다.
( 옵션 )
-l 신호들의 목록을 나열한다.
[-signal designation]
신호는 심볼릭 이름 또는 숫자 이름을 이용하여 지정할 수 있다.
( 예제 )
┌───────────────────────────────┐
│$ps -f │
│ UID PID PPID C STIME TTY TIME COMD │
│ root 4283 643 0 11:14:30 term/12 0:01 /usr/bin/login │
│userb 4284 4283 3 11:14:44 term/12 0:01 -sh │
│userb 4308 4284 2111:16:00 term/12 0:00 ps -f │
│userb 4303 4284 0 11:15:32 term/12 0:00 sleep 100 │
│userb 4304 4284 0 11:15:39 term/12 0:00 sleep 200 │
│userb 4305 4284 0 11:15:41 term/12 0:00 sleep 300 │
│userb 4306 4284 0 11:15:45 term/12 0:00 sleep 600 │
│$kill 4306 4305 │
│4306 Terminated │
│4305 Terminated │
└───────────────────────────────┘
이 예는 다수의 프로세스를 디폴트(Default) 신호로 종료하는 것을 보여주고
있다. 이때 명령어상에 지정된 프로세스들은 쉘에의해 분기된 자식 프로세스
들이기 때문에 순서에 상관하지 않고 지정하고 있다.
┌────────┐
│$kill -9 4304 │
│4304 Killed │
└────────┘
이 예는 kill 명령어에 의해 프로세스에 전달될 신호를 숫자로 지정하는
방식을 보여주고 있다. 또 위의 예제와는 달리 신호를 사용자가 명확히
지정하고 있는점도 주목하기 바란다.
┌────────────────────────────────┐
│$kill -TERM 4303 │
│4303 Terminated │
│$ps -f │
│ UID PID PPID C STIME TTY TIME COMD │
│ root 4283 643 0 11:14:30 term/12 0:01 /usr/bin/login │
│userb 4284 4283 3 11:14:44 term/12 0:01 -sh │
│userb 4308 4284 21 11:16:00 term/12 0:00 ps -f │
└────────────────────────────────┘
이 예제는 심볼릭 형식으로 신호를 지정한 예이다.
---------------------------------------------------------------------------
명령어 실행의 비정상적 종료 예방: nohup
명령어 실행의 비정상적인 종료 예방
---------------------------------------------------------------------
1. 명령어 실행의 비정상적인 종료 예방
nohup Hangup 현상과 Logout 작업으로부터 명령어 실행을 보장한다.
사용자가 Logout을 하면,그 사용자가 실행중인 모든 프로세스는 종료하게
된다. nohup 명령어는 사용자가 Logout한 후에도 명령어 수행이 계속
수행되도록 하기 위하여 지정한 명령어를 실행한다.
nuhup 명령어는 Background에서 실행하는 긴시간이 소요되는 프로그램들에
자주 사용된다. 만일 이 기능이 제공되지 않으면, 사용자는 그 프로그램이
종료될때까지 로그인 상태를 유지해야만 할 것이다.
┌────────────┐
│ nohup command line │
└────────────┘
nohup 명령어를 지정한 명령어 라인상에 방향전환(Redirection)을 사용하지
않았을 경우 명령어와 표준 에러의 출력은 명령어 라인 실행시의
작업 디렉토리내에 nohup.out 이라는 화일로 저장된다. 그런데 nohup.out
이라는 화일이 이미 존재할 경우에는 출력이 기존의 nohup.out 화일에
추가되게 (Append) 된다. 또한 nohup.out 화일을 생성 또는 추가할
디렉토리에 대해 사용자가 쓰기 권한이 없을 경우에는, nohup 명령어의
출력은 사용자의 홈(Home) 디렉토리에 nohup.out 화일로 저장된다.
nohup 명령어를 통해 다수의 명령어를 실행할 경우에는, 해당 명령어들을
사전에 하나의 화일에 저장한 후, 그 화일을 nohup 명령어를 통해
실행한다. 이렇게 하면 nohup 명령어는 화일내에 저장되어 있는 다수의
명령어들 모두를 대상으로 작업을 실행한다.
다음과 같이 명령어 라인을 지정했다고 가정하자.
$nohup pwd ; ls ; ps
이 예에서 하나의 명령어 라인상에 복수개의
명령어를 지정하기 위해 세미콜론을 사용하고 있다. 이 경우에 nohup 명령어는
오직 pwd 명령어에 대해서만 영향을미치게 된다. 그러면 위의 예에
그룹화 명령을 사용하면 어떻게 될까? 다음과 같이 지정하게 될것이다.
$nohup (pwd ; ls ; ps )
그러나 이 경우에는 쉘로부터 '명령어 라인 문법 에러'라는 에러 메세지를
받게 될 것이다. 이 형식은 허용되지 않기 때문이다.
다음은 nohup 명령어를 사용하는 예제들이다.
┌────────────────────────────────┐
│$pwd │
│/home/userb │
│$ls -al │
│total 10 │
│drwxr-xr-x 3 userb other 512 Sep 3 11:49 . │
│drwxrwxrwx 7 root root 512 Sep 3 10:16 .. │
│-rw-r--r-- 1 userb other 144 Sep 3 10:15 .profile │
│-rw------- 1 root other 58 Sep 3 11:19 .sh_history │
│dr-xr-xr-x 2 userb other 512 Sep 3 11:49 subdir │
│$cd subdir ; pwd │
│/home/userb/subdir │
│$nohup sort allnames& │
│4419 │
│ Sending output to nohup.out │
│$exit │
│Logout. │
│real 36:19.65 │
│user 4.38 │
│sys 16.21 │
│ (userb logs in) │
│$pwd │
│/home/userb │
│$ls -al │
│total 10 │
│drwxr-xr-x 3 userb other 512 Sep 27 11:49 . │
│drwxrwxrwx 7 root root 512 Sep 27 10:16 .. │
│-rw-r--r-- 1 userb other 144 Sep 27 10:15 .profile │
│-rw------- 1 root other 58 Sep 27 11:19 .sh_history │
│-rw-r--r-- 1 userb other 5392 Sep 27 11:50 nohup.out │
│dr-xr-xr-x 2 userb other 512 Sep 27 11:49 subdir │
└────────────────────────────────┘
이 예를 분석하기 위해 한가지를 주목해야 한다.
먼저 pwd 명령을 통해 작업 디렉토리가 /home/userb임을 확인한 후,
ls -al 명령을 통해 작업 디렉토리내의 화일 정보를 확인하고 있다.
ls 명령의 실행 결과에서 주목할 것이 있다. 그것은 subdir이라는
디렉토리에 대해서는 모든 사용자가 쓰기 권한이 없다는 것이다.
그후 cd 명령을 통해 작업 디렉토리를 subdir로 변경한 후 nohup
명령을 실행하고, Logout 작업을 수행했다. 그후 다시 로그인을
수행하여 사용자의 홈 디렉토리의 내용을 확인하니 그 위치에
nohup.out 화일이 생성된 것을 볼수 있다. 그 이유는 nohup 명령어를
내릴 당시의 작업 디렉토리에 대해서는 사용자가 쓰기 권한이 없었기
때문에 사용자의 홈 디렉토리에 출력 화일이 생성된 것이다.
마지막의 ls 명령을 통해 이를 확인하고 있다.
---------------------------------------------------------------------------
명령어의 예약 실행: at,batch
유닉스의 작업 예약(Scheduling) 기능
1. 작업 예약(Scheduling) 기능
at 과 batch 명령어는 지정한 명령어들을 특정한 시간에 실행하기 위한
예약 기능을 제공한다. 이러한 명령어를 사용하기 위해서는 사용자는
/etc/cron.d/at.allow 화일에 등록되어 있어야 한다. 만약 이 화일이
해당 디렉토리에 존재하지 않을 경우에는 동일 디렉토리내에 at.deny
화일이 참조된다. 이 화일은 이 명령어들을 사용하지 못하는 사용자들을
정의하고 있기 때문에, at 과 batch 명령어를 실행 요구한 사용자가
이 화일에 등록되어 있으면 작업 요구가 에러 처리된다.
이 두 화일이 모두 존재하지 않을 경우에는 root 만이 이 두 명령어를
실행 가능하다.
at 과 batch 명령어는 표준 입력 또는 입력 방향변경(Input Redirection)
으로 부터 실행할 명령어들을 받아들인다.
Batch 명령어는 시스템 자원이 여유가 있는 경우에 지정한 명령어들을
실행한다. 반면에 at 명령어는 사용자가 지정한 시간에 명령어들을 실행한다.
at 또는 batch 명령어가 실행될때, 9자의 문자열과 .a 와 .b 라는 확장자가
덧붙은 작업 식별자(Job identifier)가 표시된다. 그리고 작업 식별자와
같은 이름으로 제어 정보와 실제의 명령어들을 포함하는 각각의 요구에
상응하는 화일들을 /var/spool/cron/atjobs 화일에 생성한다.
at 과 batch의 출력은 출력 방향변경이 행해진 경우를 제외하고는
사용자에 전자우편(메일)으로 보내진다.
다음부터 at 과 batch 명령어에 대해 설명한다.
2. at 명령어
at 특정한 시간에 실행하기 위해 명령어들을 예약한다(Schedule).
┌──────────────────────┐
│ at [-option] time [date] [increment] │
└──────────────────────┘
이 명령어를 사용하기 위해서는 사용자가 at.allow 화일에 등록되어
있어야 한다. 명령어에는 시간, 날짜 그리고 증가분을 포함한다.
지정되는 각각의 요소는 설명하면 다음과 같다.
시간 시간은 필수 지정 요소이다. 시간은 1자에서 4자까지의 숫자
또는 noon, midnight, now와 같은 키워드를 지정할 수 있다.
시간을 숫자로 지정시 a.m. 또는 p.m. 이 지정된 경우를
제외하고는 24 시간 표시 방식이 적용된다. 예를들면,
at 8, at 0800, at 8:00am은 모두 오전 8시로 인식한다.
날짜 선택적으로 지정되는 날짜는 작업이 실행될 월, 일, 요일을
지정한다. 물론 today 와 tomorrow도 또한 지정할 수 있다.
만일 날짜를 지정하지 않을 경우, 지정한 시간이 현재의 시간보다
이후이면 오늘이 가정되고, 현재의 시간보다 이전이면 내일이
가정된다. 예를들면 at 8 Friday, at 8 Apr 26, at 8 tomorrow
의 형식으로 지정한다.
증가분 선택적으로 지정되는 증가분은 숫자와 minute(s), hour(s),
day(s), week(s), month(s) 또는 year(s)와 같은 상대적인
지정형식들을 의미한다. 예를들면 at 8 next day(다음날) 또는
at now +2 hours(지금부터 2시간 후)와 같다.
at 명령어는 표준입력 또는 -f 옵션을 사용하여 지정한 화일로부터
명령어들을 입력 받는다. -f 옵션에 의해 지정되는 화일은 텍스트 편집기를
이용하여 생성및 수정할 수 있다. 이러한 화일은 필요시 재사용도 가능하다.
명령어의 출력은 출력 방향변경이 지정된 경우를 제외하고는 사용자의
메일로 보내진다.
( 옵션 )
-f file 지정한 file에 있는 명령어들을 처리한다.
-m 작업이 완료되었을때 사용자에 메일을 보낸다.
-l [job_id(s)]
실행되기 위해 대기하고 있는 지정한 job_id에 대한 정보를
표시한다.
-r job_Id(s)
지정한 작업을 삭제한다.
( 예제 )
┌───────────────────────────────┐
│$at now tomorrow │
│lp .profile │
│cal │
│date │
│who -H │
│<^d> │
│warning: commands will be executed using /usr/bin/sh │
│job 686010600.a at Sat Sep 7 15:30:03 1991 │
└───────────────────────────────┘
이 예는 다음날 현재 시간에 표준 입력을 통해 지정되는 작업을 실행하도록
지정하는 예를 보여주고 있다. 그리고 ^d 를 통해 표준 입력을 끝내고
있다. at 명령어가 실행된후 작업 식별자를 돌려주는 것을 볼수 있다.
┌──────────────────────────────┐
│$cat cleanup │
│date │
│ls -lR > /home/user2 │
│find /home/user2 -atime +60 -exec rm {} \; │
│$at -m -f cleanup 1600 fri +2 weeks │
│warning:commands will be executed using /usr/bin/sh │
│job 686013999.a at Fri Sep 20 16:00:00 1991 │
└──────────────────────────────┘
cleanup 화일에 사전에 저장되어 있는 명령어들을 at 명령어에 -f 옵션을
사용하여 그 화일을 지정함으로써 작업을 예약하고 있다.
┌───────────────────────┐
│$at -l │
│686010600.a at Sat Sep 7 15:30:03 1991 │
│686013999.a at Fri Sep 20 16:00:00 1991 │
└───────────────────────┘
at 명령어로 등록된 예약된 작업들을 확인키 위해 -l 옵션을 사용하는 것을
보여주고 있다.
┌──────────────────────┐
│$at -r 686013999.a │
│$at -l │
│686010600.a at Sat Sep 7 15:30:03 1991 │
└──────────────────────┘
-r 옵션을 사용하여 예약된 작업을 삭제하는 예를 보여주고 있다.
3. batch 명령어
batch 시스템 사용량이 적을때 실행을 하기위해 명령어들을(작업을)
예약한다.
┌──────┐
│ batch │
└──────┘
이 명령을 사용하기 위해서는 사용자가 at.allow 화일에 반드시 등록되어
있어야 한다. batch 명령어는 표준 입력 또는 입력 방향변경(Redirection)된
화일로 부터 명령어들을 받아들인다. 명령어의 출력은 출력 방향변경이
행해진 경우를 제외하고는 사용자에게 메일로 보내진다. 명령어가 실행되면
.b라는 확장자가 붙은 작업 식별자를 표시해준다.
┌───────────────────────────────┐
│$batch │
│sort -o long_file.srt long_file | pr | lp │
│<^d> │
│warning: commands wil be executed using /usr/bin/sh │
│job 685986443.b at Fri Sep 6 11:47:23 1991 │
└───────────────────────────────┘
이 예는 표준 입력을 통해 batch 명령어를 실행하는 것을 보여주고 있다.
출력은 파이프를 통해 출력 방향변경된다. batch 명령어가 실행된후
작업 식별자가 되돌려지는 것을 볼수 있다.
┌───────────────────────────────┐
│$cat job_file │
│sort -o long_file.srt long_file | pr | lp │
│$batch < job_file │
│warning: commands will be executed using /usr/bin/sh │
│job 685986237.b at Fri Sep 6 11:58:57 1991 │
└───────────────────────────────┘
이 예는 batch 명령어에 의해 실행될 명령어들을 사전에 특정 화일에
저장한후 batch 명령어에 입력 방향변경을 통해 제공하는 예를 보여주고
있다.
---------------------------------------------------------------------------
예약된 작업의 확인및 삭제: atq,atrm
예약(Scheduling)된 작업의 확인및 삭제: atq,atrm
---------------------------------------------------------------------
1. 예약(Scheduling)된 작업의 확인
atq 등록되어 있는 예약된 작업들을 확인한다.
┌─────────────────┐
│ atq [-option] [user(s)] │
└─────────────────┘
atq 명령어는 at -l 명령과 같이 사용자가 등록한 at 작업을 확인할 수 있다.
그러나 atq 명령어의 출력은 at -l 명령어의 출력보다 더욱 자세한 정보를
제공한다. atq 명령어에 옵션을 지정하지 않을 경우에는 등록된 실행시간을
기준으로 정렬되어 출력된다.
만약 superuser가 atq 명령어를 실행하면, 시스템에 등록된 모든 작업이
표시된다. 또한 superuser는 atq 명령어에 사용자 식별명을 지정함으로써
특정 사용자가 등록한 작업들만을 표시할수 있다.
( 옵션 )
-c 등록 순서에 따라 예약된 작업들을 표시한다.
-n 등록된 작업의 갯수만을 표시한다.
( 예제 )
┌───────────────────────────────┐
│$at -l │
│685996200.a Fri Sep 6 14:30:00 1991 │
│685992660.a Fri Sep 6 13:31:00 1991 │
│685989060.a Fri Sep 6 12:31:00 1991 │
│685987320.a Fri Sep 6 12:02:00 1991 │
│$atq │
│Rank Execution Date Owner Job Queue Job Name │
│1st Sep 6, 1991 12:02 userb 685987320.a a stdin │
│2nd Sep 6, 1991 12:31 userb 685989060.a a stdin │
│3rd Sep 6, 1991 13:31 userb 685992660.a a stdin │
│4th Sep 6, 1991 14:30 userb 685996200.a a stdin │
└───────────────────────────────┘
이 예는 userb가 예약한 작업을 표시하기 위해 at -l 과 atq 명령어를
실행하여 결과를 보여주고 있다. 이때 atq 명령어의 실행 결과는
실행 예정시간을 기준으로 정렬되어 출력되는 것을 확인할 수 있다.
┌───────────────────────────────┐
│$atq -c │
│Rank Execution Date Owner Job Queue Job Name │
│1st Sep 6, 1991 14:30 userb 685996200.a a stdin │
│2nd Sep 6, 1991 13:31 userb 685992660.a a stdin │
│3rd Sep 6, 1991 12:31 userb 685989060.a a stdin │
│4th Sep 6, 1991 12:02 userb 685987320.a a stdin │
└───────────────────────────────┘
이 예는 -c 옵션을 통해 실행 예정시간이 아닌, 등록 시간을 기준으로
작업을 표시하도록 지정하고 있다.
┌─────┐
│$atq -n │ 이 예는 -n 옵션을 사용하여 사용자가 등록한 작업의 갯수를
│4 │ 표시하고 있다.
└─────┘
2. 예약된 작업의 삭제
atrm 등록되어 있는 예약작업을 삭제한다.
┌────────────────────┐
│ atrm [-option] [job_id(s)] [user] │
└────────────────────┘
atrm 명령어는 at -r명령과 같이 사용자가 등록한 예약 작업을 삭제한다.
atrm 명령어는 at -r 명령보다 예약된 작업을 삭제하는데 있어서 더욱 많은
제어 방식을 제공한다.
superuser(관리자)는 어떤 사용자가 등록한 작업들이라 해도 삭제할수 있다.
( 옵션 )
-a 현재 atrm 명령어를 실행하고 있는 사용자가 등록한 모든 작업들을
삭제한다. 이 경우 삭제를 확인시키기 위한 메세지들을 표시한다.
-i 삭제 여부를 묻는 프롬프트를 표시하는 형식의 대화식 삭제를 한다.
-f 삭제 완료 메세지를 표시하지 않는다.
( 예제 )
┌───────────────────────────────┐
│$atq │
│Rank Execution Date Owner Job Queue Job Name │
│1st Sep 6, 1991 12:02 userb 685987320.a a stdin │
│2nd Sep 6, 1991 12:31 userb 685989060.a a stdin │
│3rd Sep 6, 1991 13:31 userb 685992660.a a stdin │
│4th Sep 6, 1991 14:30 userb 685996200.a a stdin │
│$atrm 685996200.a │
│685992600.a:removed │
└───────────────────────────────┘
이 예제는 at 명령어를 통해 예약된 작업들을 표시한 후, atrm 명령어를
통해 하나의 작업을 삭제하는 과정을 보여준다.
여기서 작업 삭제후 삭제 메세지가 표시되는 것을 주목하기 바란다.
┌────────────┐
│$atrm -f 686000460.a │
└────────────┘
-f 옵션을 사용하여 삭제 완료 메세지를 표시하지 않도록한 예제이다.
┌─────────────────┐
│$atrm -ia │
│685992660.a: remove it? n │
│685989060.a: remove it? n │
│685987320.a: remove it? n │
└─────────────────┘
-i 옵션을 사용하여 대화식으로 등록된( 사용자가 등록한 모든 작업을
대상으로,-a 옵션때문에,) 작업을 삭제하는 과정을 보여주는 예이다.
그런데 이 예에서는 다음 예제를 위하여 삭제 여부를 묻는 프롬프트에
n를 지정해 삭제를 취소하고 있다.
┌─────────────┐
│$atrm -a │
│685992660.a: removed │
│685989060.a: removed │
│685987320.a: removed │
│$atq │
│no files in queue. │
└─────────────┘
-a 옵션을 통해 모든 작업을 한꺼번에 삭제하는 것을 보여주고 있다.
명령 실행후 atq 명령을 통해 작업의 존재 여부를 확고 있다.
---------------------------------------------------------------------------
Shell의 일반 개요및 종류별 특성
유닉스 쉘(Shell)의 일반 개요
---------------------------------------------------------------------
1. 유닉스 쉘(Shell)의 일반 개요
쉘(Shell)은 사용자와 컴퓨터의 자원들과 상호 작용하는 것을 가능하게
하기 위한 프로그램이다. 명령어 번역기(Interpreter)로서 쉘은 사용자와
시스템간의 교량 역할을 수행한다. 사용자는 쉘에 명령어들을 입력하고,
쉘은 운영체제가 실행을 할수 있도록 명령어들을 번역한다.
쉘은 위와 같은 기능외에 다음과 같은 기능도 실행한다.
몇가지 기능은 이전에 설명되었으며, 이들을 요약하면 다음과 같다.
. 프로그램 실행
유닉스 명령어들은 command [-option] [argument(s)]와 같은 형식으로
보통은 $ 인 프롬프트상에 입력된다. 쉘은 명령어가 기술되어 있는
명령어 라인을 분석하고, 그들을 인식가능한 구성요소로 분해하고,
명령어 프로그램에 유효한 옵션과 인자들을 전달한다.
이후 쉘은 프로그램을 실행하기 위하여 프로세스를 분기하고,
명령어 프로그램이 종료할때 까지 자신은 휴면상태(sleep)로 들어간다.
. 화일명 대치
쉘은 프로그램이 실행되기 전에 화일명 대치에 사용되는 특수문자들을
번역하고, 실제 화일명으로 대치한다.
. 입출력 방향전환(Redirection)
명령어 라인에 지정된 입력과 출력 방향전환은 명령어 실행전에
처리된다.
. 파이프라인(Pipeline) 처리
파이프가 명령어 라인에 지정되었다면, 쉘은 파이프상에 첫번째 지정된
명령어의 표준 출력을, 명령어 라인이 실행되기 전에 다음 명령어의
표준 입력으로 연결시킨다.
. 환경 제어
쉘은 사용자 환경을 구성하기 위한 유연성을 제공한다. 이러한 환경 제어
기능에는 명령어 검색 경로, 개개의 환경 변수들의 정의 그리고
쉘 프롬프트의 재정의등을 포함한다. 이들에 대한 자세한 설명은
차후에 다시 설명된다.
쉘은 프로그램 언어로도 사용될 수 있다. 사용자는 새로운 프로그램을
생성하기 위하여 쉘 명령어들을 화일속에 나열할 수 있다.
이러한 프로그램들은 쉘 프로그램 또는 쉘 스크립트(script)라 불리운다.
쉘 프로그램을 작성하기 위해 사용하는 쉘의 제어문들은 이후 하나씩
다시 설명된다. 또한 쉘 프로그램을 작성하기 위한 자세한 사항은
"유닉스 활용" 강의가 끝난 후 계속될 쉘 프로그래밍 강의때 자세히
설명된다.
2. 유닉스 쉘(Shell)의 종류
통상 4가지의 유닉스 쉘 프로그램이 유닉스에서 사용 가능하다.
시스템 관리자는 로그인시 사용자가 처음 사용할 쉘을 /etc/passwd 화일에
정의한다. 만약 이 화일에 쉘을 지정하지 않으면, 사용자의 기본 쉘은
Bourne Shell로 지정된다. 이를 Default Shell이라 한다. 아무리 사용자가
필요에 의해 다른 쉘을 사용한다 하더라도, 오직 한싯점에 하나의 쉘만이
사용되어 진다. 다음은 유닉스가 제공하는 4가지 기본 쉘에 대한 설명이다.
. Bourne Shell
Bourne Shell은 1975년 AT&T Bell 연구소의 Steve Bourne에 의해
개발되었다. 이 쉘은 모든 버전의 유닉스 운영체제에 포함되어 있고,
가장 널리 사용되어지는 쉘이기도 하다. Bourne Shell은 다양하고 강력한
프로그래밍 도구들을 제공한다. ( Bourne Shell에서 제공하는 프로그래밍
도구들은 이후 다시 설명된다.)
사용자가 수행하는 작업을 제한하기 위해 시스템 관리자에 의해
할당될 수 있는, Bourne Shell의 변형으로 Restricted Shell(제한쉘:rsh)
이라는 쉘이 있다. Restricted Shell은 디렉토리의 변경, 명령어 검색에
이용되는 PATH 변수의 값의 변경, /(root)를 포함하고 있는 명령어 이름
또는 경로 지정, 출력 방향변경등의 기능을 사용자에게 금지한다.
이 쉘은 전반적인 제한 기능은 제공하지 않는다.
또한 사용자가 로그인을 했을때 텍스트 편집기 같은 특정한 프로그램이
수행되도록 지정할 수 있다. 이 경우 사용자는 지정된 프로그램만을 사용할
수 있도록 제한되며, 프로그램이 종료되면 사용자는 logout 되어진다.
. Bourne Shell with Job Control(jsh)
근본적으로 이 쉘의 기능은 C Shell과 Korn Shell과 같은 작업의 실행을
관리하기 위한 작업 제어 환경을 제공한다는 점을 제외하곤 Bourne Shell과
동일하다.
. C Shell(csh)
C Shell은 켈리포니아 버클리 대학의 Bill Joy에 의해 개발되었다.
이 쉘은 버클리와 제닉스(XENIX: PC 버전의 유닉스) 환경에서 가장
일반적으로 사용되는 쉘이다.
이 쉘은 실행된 명령어 보존 기능(Command History Mechanism),
명령어 별칭(Command Alias), 작업 제어(Job Control) 기능들을 제공한다.
그러나 Bourne Shell과 호환되지 않는다는 단점이 있다. C Shell 환경에서
작성된 프로그램은 Bourne Shell 환경에서 수행되지 않는다.
C Shell Program은 C 언어로 작성된 프로그램과 유사하여 그 명칭이
C Shell로 불리운다.
. Korn Shell (ksh)
이 쉘은 AT&T Bell 연구소의 David Korn에 의해 개발되었다. 이 쉘은
Bourne 과 C Shell의 장점들과 많은 새로운 신기능들을 제공한다.
Bourne Shell에서 작성된 대부분의 쉘 프로그램들은 Korn Shell 환경에서
사용될 수 있다. 그 결과로 Korn Shell은 빠르게 확산되고 있다.
Korn Shell의 특출하고 유용한 기능들은 이후 자세히 설명된다.
---------------------------------------------------------------------------
다음 강의에서는 Korn Shell의 기능및 특성에 대해 설명합니다.
---------------------------------------------------------------------------
Korn Shell의 특성및 설치
Korn Shell의 기능
---------------------------------------------------------------------
1. Korn Shell의 기능
Korn Shell은 Bourne Shell과 C Shell의 유용한 기능들을 포함하고
있으며, 다른 쉘과 대비되는 특징적인 기능들을 갖고 있다.
Bourne Shell에서 작성한 대부분의 쉘 프로그램은 수정없이 Korn Shell에서
그대로 실행할 수 있다. 그렇다고 SVR4.0 버전의 유닉스 운영체제에서
Default Shell로 Korn Shell을 사용하는 것은 아니고, Bourne Shell을
그대로 Default Shell로 사용하고 있다.
Bourne Shell과 마찬가지로 Korn Shell은 기동될때 환경 설정 요소들이
선언되어 있는 .profile을 읽어서 작업 환경을 구축한다. 또한 Korn Shell은
사용자에 의해 생성된 환경 제어 화일들도 환경 구축을 하는데 참조하는데,
사용자가 생성한 환경 제어 화일들은 사용자의 home directory속에 있는
.profile속에 ENV 라는 변수에 지정하면 Korn Shell에 의해 처리된다.
Korn Shell의 유용한 기능은 다음과 같으며, 이후 몇차례의 연속된 강의를
통해 자세히 설명한다. 또한 Korn Shell의 고유한 쉘변수들도 이후 소개한다.
Command History 기능
Korn Shell은 명령어 보존 기능을 지원하기 위해 실행되었던 명령어들을
보존하기 위한 화일(이를 History 화일이라 한다.)을 유지 관리한다.
이 화일은 수행되었던 명령어를 지정한 편집기를 이용하여 수정하여
재수행할때 또는 직전에 수행한 명령어를 재실행하고자 할때 참조된다.
Command alias 기능
자주 사용되는 명령어 라인은 alias라 불리우는 별칭을 부여함으로써,
긴 명령어 라인을 사용할때마다 입력해야 하는 번거로움을 없애고
쉽게 실행할 수 있다.
Job Control 기능
Korn Shell은 Foreground와 Background 사이의 작업의 이동, 작업의
중지 또는 중지된 작업의 계속 수행과 같은 작업 제어 기능들을
제공한다.
Korn Shell Option과 Variables(쉘 변수)
사용자가 자신의 작업 환경을 제어할수 있도록 사용자 환경을 수정하기
위한 Korn Shell Option과 Variable들을 제공한다.
*** Restricted Shell (rksh)
Korn Shell에서도 rsh (Restricted Bourne shell)과 유사한
rksh(Restricted Korn Shell)을 제공한다.
2. Korn Shell의 설치
Korn Shell을 설치할때는 보통은 /etc/passwd 화일내에 Korn Shell을
사용자의 로그인 쉘로 선언하는 방식을 사용하나, SHELL 변수또는
ksh 명령어를 통해서도 Korn Shell을 설치할 수 있다.
Korn Shell이 기동될때, Korn Shell은 작업 환경 처리를 위해 시스템 차원의
환경 설정 화일인 /etc/profile과 사용자 차원의 환경 설정 화일인 .profile을
해독하고, Korn Shell 환경을 구성을 위해 다른 설정 정보를 가지고 있는
화일을 지정하고 있는 ENV라 불리우는 변수를 검색한다. 이 화일들엔 사용자의
Korn Shell 환경을 설정하기 위한 Korn Shell 명령어들을 추가할 수 있다.
Command History 기능
Korn Shell이 기동된 이후의 실행되는 각각의 명령어 라인은 history 화일이라
불리우는 화일에 저장된다. 이후 저장된 명령어들은 명령어 라인의 수정 또는
명령어 라인 재실행을 위해 다시 참조할 수 있게 된다.
Line Edit Mode (명령어 라인 편집 모드)
Line Edit Mode를 사용하기 위해서는 다음중 하나의 작업을 실행해야만 한다.
. EDITOR라는 쉘 변수에 Line Edit Mode에서 사용할 편집기를 지정한다.
예를들면 Line Edit Mode에서 사용할 편집기로 vi를 사용하기 위해서
EDITOR=vi라 지정한다. 주의할 것은 =을 전후에 공백을 두지 않는다.
. VISUAL이라는 쉘 변수에 Line Edit Mode에서 사용할 편집기를 지정한다.
예를들면 Line Edit Mode에서 사용할 편집기로 vi를 사용하기 위해서
VISUAL=vi라 지정한다. VISUAL 과 EDITOR 변수가 모두 지정된 경우에는
VISUAL 변수가 우선된다.
. set -o 명령에 사용할 편집기를 지정한다. 예를들면, vi를 편집기로
지정하기 위해서는 set -o vi라 지정한다. 이 set 명령어를 통해 지정한
편집기가 VISUAL과 EDITOR 변수보다 우선된다.
Korn Shell이 기동될때 자동적으로 사용할 편집기를 지정하도록 하기 위해서는
사용자의 .profile이나 ENV 변수에 지정된 화일에 위의 방식중 하나를
입력해둔다.
---------------------------------------------------------------------------
Korn Shell의 Command History 기능
---------------------------------------------------------------------
1. Command History 기능
Korn Shell상에서 실행되었던 명령어들은 Korn Shell 변수인 HISTFILE에
선언되어 있는 화일에 저장된다. 그러나 HISTFILE 변수에 화일이 선언되어
있지 않을 경우에는 사용자의 Home Directory내에 위치하는 .sh_history
화일에 저장된다. 사용자는 로그인을 한후에 이 화일에 저장되어 있는
명령어들을 사용하여 작업을 실행할 수 있다. 또한 Korn Shell의 변수인
HISTSIZE는 명령어 라인 수정및 재실행을 위해 참조할 수 있는 명령어의
최대 갯수를 선언하고 있다. 이 갯수는 현재의 명령 이전에 실행되었던
명령어중에 사용가능한 명령어의 갯수를 의미한다. 이 변수에 값을 설정할때는
HISTSIZE=new_value라는 형식으로 지정하며, 만일 이 변수에 값을
지정하지 않았을 경우에는 128이 가정된다. 그리고 실행한 명령어 라인의 수가
HISTSIZE의 값을 넘어갈 경우에는 가장 최근의 명령어가 억세스 불가하게
된다. 그러나 그 명령어들은 History File에는 보존된다.
다음은 History File내에 저장되어 있는 명령어의 억세스 방식을 설명한다.
1. history 명령어는 History 화일에 저장되어 있는 가장 최근에 실행했던
명령어중 16개를 표시해 준다. 이 명령에 의해 표시되는 출력에는 실행 순서를
나타내는 명령어 일련번호가 명령어 라인과 함께 표시된다.
2. History file에 저장되어 있는 명령어는 수정없이 r(redo) 명령어로
재실행할 수 있다. r 명령어를 사용함에 있어 인자를(Arguments) 지정하지
않을 경우에는 직전에 실행했던 명령어를 재실행한다. r 명령어의 지정 형식은
r sequence_number 인데, 이때 Sequence_number는 History File내의
일련 번호를 의미하며, 이전에 소개한 history 명령을 통해 확인할 수 있다.
3. History file에 저장되어 있는 명령어는 EDITOR, VISUAL 또는 set 명령어에
의해 지정된 편집기를 통해 편집하여 실행할 수 있다.
2. Line Edit Mode (라인 편집 모드)
우선 Line Edit Mode에서 이해해야할 것이 있다.
그것은 명령어 라인을 편집하더라도 History File내의 본래의 명령어 라인은
변경되지 않는다는 것이다. 이유는 Line Edit Mode에서는 History File을
대상으로 편집하지 않고, 저장되어 있는 라인을 버퍼에 복사하여 수정하기
때문이다. 물론 편집한 명령어를 재실행했을 경우에는 그 명령어는
가장 최근의 실행 명령으로 History File에 저장된다.
명령어를 편집하기 위해서는 <escape> 키를 눌러 편집기의 명령어 모드로
들어간다. 명령어 모드에서 커서는 명령어 라인에 영향을 주지않고 이동할 수
있다. 편집기 모드가 기동된 후에는, 이전에 실행했던 명령어 라인을
표시하기 위해서는 <k> 키를, 이후에 실행했던 명령어를 표시하기 위해서는
<j> 키를 사용한다. 해당 키를 여러번 누름으로써 특정 명령어 라인을 검색
할 수 도 있다. 그리고 표시된 명령어 라인을 수정하기 위해서는
지정한 편집기에서 제공하는 명령어들을 사용한다. vi 편집기에서 자주
사용되는 기본적인 명령들은 별도로 사용한다. 끝으로 편집기 모드를 종료하고,
편집한 명령어 라인을 실행하기 위해서는 <RETURN> 키를 누른다.
편집 모드에서 특정 문자열이 들어있는 명령어 라인을 찾기위해 /string
형식의 명령어를 명령어 모드에서 사용할 수 있다.
3. vi를 사용하는 Line Edit Mode에서 사용가능한 명령어들
다음은 vi 편집기 모드에서 빈번히 사용되는 명령어들은 다음과 같다.
자세한 내용은 ksh에 대해 설명되어 있는 메뉴얼을 설명하기 바란다.
┌─────┰─────────────────────────┐
│명령어 ┃ 설 명 │
├─────╂─────────────────────────┤
│ k ┃ History File내에 저장되어 있는 직전 명령어를 │
│ ┃ 표시한다. │
│ j ┃ History File내에 저장되어 있는 다음 명령어를 │
│ ┃ 표시한다. │
│ h ┃ 커서를 한문자 좌측으로 이동한다. │
│ l ┃ 커서를 한문자 우측으로 이동한다. │
│ b ┃ 커서를 한 워드 죄측으로 이동한다. │
│ w ┃ 커서를 한 워드 우측으로 이동한다. │
│ 0 ┃ 커서를 명령어 라인의 처음으로 이동한다. │
│ $ ┃ 커서를 명령어 라인의 끝으로 이동한다. │
│ u ┃ 직전에 변경 내용을 취소한다. │
│ x ┃ 커서 위치의 한문자를 삭제한다. │
│ d(range) ┃ 지정한 범위의 텍스트를 삭제한다. │
│ a(A) ┃ 커서 직후에 텍스트를 추가한다. │
│ i(I) ┃ 커서 직전에 텍스트를 삽입한다. │
│ c(range) ┃ 지정한 범위의 텍스트를 변경한다. │
│ R ┃ 텍스트를 대치한다. │
│ /string ┃ History File에서 지정한 string이 들어있는 │
│ ┃ 명령어 라인을 검색한다. │
└─────┸─────────────────────────┘
---------------------------------------------------------------------------
Korn Shell의 Command Alias 기능
---------------------------------------------------------------------
1. Command Alias 기능
Alias(별칭)는 긴 명령어 라인에 대한 짧은 별칭을 부여할 수 있는
기능을 제공한다. Korn Shell은 명령어들이 실행될때검색하는
Alias들의 목록을 유지관리한다. Korn Shell은 사용자가 지정한
명령어 라인의 첫번째 단어(Word)에 상응하는 Alias를 발견하면,
그 단어를 Alias에 할당되어 있는 명령어 라인으로 바꾼다.
그리고 이들을 관리하기 위해 alias 명령어를 제공하는데,
사용자는 이 명령을 통해 현재 설정되어 있는 Alias의 확인,
새로운 Alias의 생성및 지정한 Alias에 설정되어 있는 명령어 라인의
내용을 확인할 수 있다.
1) 선언되어 있는 Alias의 확인
alias 명령을 인자없이 사용함으로서 현재 선언되어 있는 alias들을
확인할 수 있다. 이 명령의 출력은 영문자순으로 정렬되어 표시된다.
몇가지 Alias들은 Korn Shell이 기동될때 자동적으로 선언된다.
다음은 Korn Shell에의해 자동적으로 설정되는 Alias를 확인하기 위해
alias 명령을 실행한 결과이다.
autoload=typeset -fu
cat=/usr/bin/cat
false=let 0
functions=typeset -f
hash=alias -t -
history=fc -l
integer=typeset -i
ls=/usr/bin/ls
mail=/usr/bin/mail
nohup=nohup
r=fc -e -
sh=/sbin/sh
stop=kill -STOP
suspend=kill -STOP $$
true=:
type=whence -v
alias 명령에 Alias name을 같이 지정함으로서 지정한 Alias에 할당되어
있는 명령어 라인을 확인할수 있다.
2) Alias의 생성
Alias는 alias 명령어를 사용하여 정의된다. 이 때의 alias 명령어의 형식은
alias name=command_line 이다. 예를들면 alias ll='ls -al' 명령은
ll 이라는 이름의 Alias에 ls -al 명령어를 할당한다. 이때 명령어상에
지정되는 Alias 이름과 그에 설정되는 명령어 라인에는 공백이 있으면 안된다.
공백과 같은 쉘 특수문자를 command_line에 지정하기 위해서는 반드시
따옴표로 묶어 주어야 한다.
3) Alias의 제거
선언되어 있는 Alias를 제거하기 위해서는 unalias 명령을 사용한다.
이 명령어를 실행하면 Korn Shell에 의해 관리되는 Alias 목록에서 삭제된다.
명령어의 형식은 unalias name이다. 예를들면 unalias ll이라 지정하면,
alias 목록에서 ll이라는 alias를 제거한다.
( 예제 )
┌──────────────────────┐
│$alias │
│( 현재 설정되어 있는 Alias들을 표시한다. ) │
└──────────────────────┘
alias 명령어에 인자를 지정하지 않음으로서 현재 선언되어 있는
Alias들을 확인하는 것을 보여주는 예이다.
┌────────────────────────────┐
│$alias clean=`find ~ -atime +60 -exec rm {} \;` │
└────────────────────────────┘
이 예에서는 find 명령어를 clean이라는 이름으로 alias로 선언하는 예를
보여준다. 이때 find 명령어에는 공백및 변환문자(metacharacter)를 사용하였기
때문에 따옴표로 묶은 것을 주목하기 바란다. 참고로 find 명령어내에서 사용된
~ 문자는 사용자의 홈 디렉토리로 변환되는 Korn Shell의 변환문자이다.
이에 대해서는 이후 자세히 설명된다.
┌───────────────────┐
│$alias clean │
│find ~ -atime +60 -exec rm {} \; │
└───────────────────┘
특정 Alias에 설정되어 있는 명령어 라인을 확인하는 방식을 보여주는
예이다.
┌─────────┐
│$unalias clean │
└─────────┘
clean이라는 Alias를 삭제하는 예를 보여주는 예이다.
---------------------------------------------------------------------------
다음 강의에서는 Korn Shell의 Job Control 기능에 대해 설명합니다.
---------------------------------------------------------------------------
Korn Shell의 Job Control 기능
---------------------------------------------------------------------
1. Job Control 기능
Korn Shell, C Shell과 Job Shell이 기동되면, Job Control 기능이
사용가능하게 된다. 여기서 Job이란 하나 또는 일련의 명령어 실행 자체를
의미한다. 사용자는 Job Control 기능을 사용하여 Job에대해 정지, 계속수행,
종료 뿐만아니라 Foreground와 Background 사이의 Job의 이동등을
행할 수 있다.
사용자가 실행한 Job은 다음과 같은 작업상태중 어느 하나에 위치한다.
. Foreground 실행
. Background 실행
. Suspended (정지)
. Terminated (종료)
Foreground 실행
Job은 제어가 쉘에 되돌려지고, 또다른 쉘 프롬프트가 표시되기 전에
즉각적으로 처리된다. 이는 사용자가 현재 실행한 Job이 완료되기 전에는
또다른 Job을 개시할 수 없음을 의미한다.
Background 실행
사용자가 Job 실행 요구를 내리게 되면, 쉘은 사용자에게 또다른 작업을
실행할 수 있도록 제어를 즉각적으로 돌려주며, 그러나 요구된 Job은
시스템에 의해 Background에서 작업 실행이 계속된다.
이와같이 Background에서 작업을 실행하기 위해서는 실행할 명령어 라인의
끝에 & 심볼을 지정한다.
만약 Background Job에서 터미널로부터 입력을 받도록 지정되어 있다면,
Job은 실행 중지된후 적당한 메세지를 표시한다. 입력을 받아들인후
실행은 계속된다. 그리고 Job이 완료된후 생성된 출력은 해당 터미널에
표시한다. "stty tostop" 명령어는 Background Job의 출력이 터미널로
표시됨으로 인해 Foreground Job의 출력이 방해 받는것을 방지할 수 있다.
Stopped (Suspended: 정지상태)
기동중인 Job을 일시적으로 정지되어 있는 상태이다. 이 Job은 재실행 또는
종료할 수 있다. 만약 사용자가 Job을 실행하고 있는 중이나 정지하고 있는
상태에서 Logout을 시도하면, 이에 따른 적당한 주의 메세지가 표시되고,
Logout을 행하지 않는다. 그러나 다시한번 ^d나 exit 명령을 내리게 되면은
이와 관련없이 Logout을 수행하고, 수행중이던 작업들은 종료된다.
단, nohup 명령으로 지정된 작업은 시스템에 의해 계속 실행한다.
Terminated (Killed: 종료상태)
Job이 정지및 종료된 상태를 나타낸다. 이 상태의 작업은 재실행할 수 없다.
2. Job Control Commands
Job을 제어하기 위해서 다음과 같은 같은 명령어들을 Korn Shell, C Shell,
Job Shell 환경에서 사용가능하다. 이와같은 명령어들을 Built-in 명령어라
부른다.
jobs [-option] 요구된 모든 Job들의 상태를 표시한다.
-l 옵션은 PID를 포함한 자세한 정보를 출력한다.
-p 옵션은 실행중인 Job들의 PID들 만을 표시한다.
fg [job_id] Foreground에 Job을 위치시킨다.
<^z> Foreground Job을 정지한다.
bg [job_id] Background에 지정한 Job을 위치시킨다.
stop [job_id] 지정한 Background을 정지한다.
kill [-signal][job_id]
지정한 Job을 종료한다.
다음은 이상의 명령에서 job_id를 지정하는 방식에 대해 설명한다.
3. Job Identification(Job 식별자)
명령어 라인에 &를 지정함으로써 Job이 Background에서 실행될 경우,
Korn Shell은 실행되는 Job을 식별하는 정보들을 표시한다.
Bourne Shell에서는 Background 실행과 관련된 프로세스 식별자
(Process ID)를 표시해주나, Korn Shell은 사각괄호로 둘러쌓인 Job 번호와
프로세스 식별자를 표시한다. Job의실행이 끝나면 다음과 같은
메세지를 표시한다.
[job_Id] + Done Command_line_sequence
jobs 명령어는 아직 끝나지 않고, 실행중인 Job의 상태를 표시한다.
출력중에 Job Id 다음에 연이어 출력되는 + 와 - 표시는 각각 현재의 작업과
이전의 작업을 나타낸다.
다음의 Job 지정자들은 Job의 실행을 조작하기 위한 Job Control Command에서
사용할 수 있다.
+ 현재의 작업을 참조한다.
- 이전의 작업을 참조한다.
%[job-id(s)] 지정한 job-id를 참조한다.
PID 지정한 process Id를 참조한다.
%string string으로 시작하는 명령어 라인으로 기동된 Job을
참조한다.
( 예제 )
┌─────────┐ 이 예는 Background에서 Job을 실행시키는 예를
│ $sleep 300& │ 보여주고 있다. 이때 Job_Id와 PID가 표시되는 것을
│ [1] 3105 │ 주목하기 바란다.
└─────────┘
┌─────────────────┐
│ $jobs │
│ [1] + running sleep 300& │
└─────────────────┘
인자없이 jobs 명령어를 사용하면 현재 실행중인 작업을 표시한다.
명령어의 출력에는 사각괄호에 둘러쌓인 job_number와 작업의 상태
그리고 명령어 라인이 표시된다. Job_Id 다음의 +표시는 가장 최근에
실행된 작업을 나타내며, - 는 이전에 수행 요구된 작업을 의미한다.
┌────────┐
│ $fg %1 │ Job 번호를 사용하여 작업을 제어하는 예를
│ sleep 300 │ 보여주고 있다. 직전 예의 sleep 명령어가
└────────┘ Foreground에서 수행됨으로 인해, 프롬프트가
표시되지 않음을 주목하기 바란다. 이때 또다른 작업 제어를 하기
위해서는 <CTRL+z> 키를 사용한다.
┌───────────────┐
│ $<CTRL z> │ <CTRL+z> 키를 사용하여 Foreground
│ [1] + Stopped sleep 300& │ 에서 실행되는 작업을 중지 시키는
└───────────────┘ 예이다.
┌──────────┐ 중지상태에 있는 작업을 bg 명령을 사용하여
│ $bg %sleep │ Background로 보내고 있다. 여기서 주목할 것은
│ [1] sleep 300& │ 작업을 지정하기 위해 실행되고 있는 명령어라인의
└──────────┘ 문자열을 이용하고 있다는 것이다.
---------------------------------------------------------------------------
Korn Shell의 Option과 변수들
---------------------------------------------------------------------
1. Korn Shell의 Option
Korn Shell은 자신이 제공하는 특수 기능들의 이용을 허용(enable)및
금지(disable)할수 있도록 몇가지의 옵션을 제공한다. 제공하는
옵션은 다음과 같다.
┌─────────────┐
│ 옵션명 초기값 │
├───────┬─────┤ ┌───────┬───┐
│ allexport │ off │ │ noclobber │ off │
│ bgnice │ on │ │ noglob │ off │
│ emacs │ off │ │ nolob │ off │
│ errexit │ off │ │ nounset │ off │
│ gmacs │ off │ │ privileged │ off │
│ ignoreeof │ off │ │ restricted │ off │
│ interactive │ on │ │ trackall │ off │
│ keyword │ off │ │ verbose │ off │
│ markdirs │ off │ │ vi │ off │
│ monitor │ on │ │ viraw │ off │
│ noexec │ off │ │ xtrace │ off │
└───────┴─────┘ └───────┴───┘
위의 옵션들에 대해서는 차후에 자세히 설명한다.
이번 과정에서는 빈번히 사용되는 몇가지의 옵션에 대해서만 소개한다.
noclobber 출력 Redirection이 기존의 화일에 손상(truncating)을
가하는 것을 예방한다.
ignoreeof ^d 키를 통한 logout을 막는다. 이 기능이 설정되어 있을
경우에는 exit 명령만을 이용해야 logout할 수 있다.
allexport 현재 쉘에설정되어 있는 모든 변수들을 자동적으로
하위 쉘에 export시키는 가를 지정한다.
noglob 화일명에 대한 Wildcard 문자들의 번역 여부를 설정한다.
이상 소개한 옵션을 on 또는 off 시키기 위해서는 set 명령어의 -o 또는
+o 옵션을 사용한다. 그 사용형태는 다음과 같다.
set -o 현재 설정되어 있는 Korn Shell의 옵션을 표시한다.
set -o [option(s)]
옵션을 ON 한다.
set +o [option(s)]
옵션을 OFF 한다.
( 예제 )
┌──────────┰─────────────────────┐
│$set -o ┃ Korn Shell 옵션의 설정상태를 표시한다. │
├──────────╂─────────────────────┤
│$set -o noclobber ┃ noclobber 옵션을 ON 한다. │
├──────────╂─────────────────────┤
│$set +o noclobber ┃ noclobber 옵션을 OFF 한다. │
└──────────┸─────────────────────┘
2. Korn Shell의 변수
변수는 연관된 값의 이름이다. 변수들은 프로그램을 작성하는데 빈번히
사용된다. 작업 환경에 연관되는 변수들은 로그인시에 자동적으로
설정되도록 하기 위해 .profile 또는 ENV 변수에 정의되어 있는 화일에
대부분 선언되어 있다. 이러한 환경 변수중 몇가지는 쉘에의해 정의되고
유지되는데 사용자는 이러한 변수들을 변경할 수 없다. 그러나 VISUAL이나
HISTSIZE과 같은 변수들은 사용자에 의해 변경될 수 있다.
또한 사용자들은 자신이 작업을 수행하기 위해서 필요로하는 변수들을
선언및 사용할 수 있다.
다음부터 소개될 대부분의 변수들은 Korn Shell에서 독특한 기능을 수행하는
변수들이다. 이들에 대한 자세한 활용 예제및 활용 방식은 차후에 계속될
쉘 프로그래밍 과정에서 설명한다.
PS1 PS1 변수는 Bourne Shell과 동일하게 프롬프트를 정의하기 위해
사용한다. 그러나 Korn Shell에서는 PS1 변수와 History 기능을
결합하여 사용할 수 있다. 예를들면, PS1 변수에History 화일내의
직전에 실행된 명령어 라인의 일련번호를 의미하는 !를 함께
지정하는 것이다. 다음은 그 실행 예이다.
$PS1="[!]usera>"
[1]usera>pwd
/home/usera 이 예에서 프롬프트에 숫자가 바뀌어가며
[2]usera> 표시되는 점을 주목하기 바란다.
사용자는 사각괄호안에 표시되는 숫자를 이용하여 이전에 실행했던
명령어 라인을 재실행할 수 있다.
PS3 PS3 변수는 쉘 프로그램에서 사용되는 select 명령어에서
사용하는 프롬프트를 정의하기 위해 제공되는 새로운 변수이다.
이 프롬프트는 select 명령어에 의해 입력을 받아들이기 위해
사용된다.
PS4 PS4 변수는 set -x 또는 ksh -x 명령어가 실행된때에 표시되는
디버그(Debug) 심볼을 정의하기 위한 변수이다.
VISUAL VISUAL 변수는 History 기능내에서 사용될 편집기를 지정하기
위해 사용된다. 편의를 위해 이 변수는 .profile내에 선언한다.
EDITOR EDITOR 변수는 History 기능내에서 사용될 편집기를 지정하기
위해 사용된다. VISUAL과 EDITOR 변수 모두가 선언되었을 경우에는
VISUAL이 우선된다.
PWD Korn Shell은 PWD 변수에 사용자가 위치한 현재 작업 디렉토리의
절대 경로를 설정해 준다. 따라서 사용자는 이 변수를 이용하여
작업 디렉토리가 표시되는 쉘 프롬프트를 생성할 수 있다.
그 예는 다음과 같다.
$PS1='[!]$PWD:'
/home/user1
OLDPWD Korn Shell에 의해 이전에 작업하던 디렉토리가 설정되는 변수이다.
cd - 명령도 이와같은 기능을 수행한다. 다음은 cd - 명령에 의해
현재의 작업 디렉토리에서 직전의 작업 디렉토리로 곧장 이동하는
예를 보여준다.
$pwd
/home/user1
$cd /home/user2
$cd -
$pwd
/home/user1
TMOUT 쉘이 일정시간 동안 사용자의 입력이 없을 경우 자동적으로 logout
처리되도록 지정할 수 있는데, 이때 이 시간을 지정하기 위해
사용되는 변수이다. 지정되는 시간의 단위는 초이다.
HISTSIZE HISTSIZE 변수는 History 기능에서 편집 또는 재실행하기 위해
참조할 수 있는 명령어의 수를 지정하기 위해 사용되는 변수이다.
Tilde (~) Tilde(~) 변수는 사용자의 홈 디렉토리가 설정되는 변수이다.
이 변수는 경로명 지정시 사용자의 홈 디렉토리를 대치할
목적으로 사용될 수 있다.
$cd ~/dira
'Academy I > Tech Academy' 카테고리의 다른 글
Unix 11 Regular Expression과 Filters: sort, tr (0) | 2014.12.04 |
---|---|
Unix 10 Shell Program에서 쉘 특수 변수의 이용 (0) | 2014.12.04 |
Unix 9 본쉘, 콘쉘 (0) | 2014.12.04 |
Unix 8 쉘프로그래밍 (0) | 2014.12.04 |
Unix 6 유틸리티 (0) | 2014.12.04 |
Unix 5 통신,네트워크 (0) | 2014.12.04 |
Unix 4 검색과 권한 (0) | 2014.12.04 |
Unix 3 관리명령어 일반 (0) | 2014.12.04 |