제3부. 유닉스 쉘

8. 유닉스 쉘

(1) 로그인 쉘 알아내기  chsh

□ 로그인 쉘은 로그인 후의 디폴트 쉘.  시스템관리자가 정한다.  /etc/passwd 파일

$ cat /etc/passwd □

... (사용자이름, 비밀번호, 로그인 쉘 등)

$

※ 보안을 위하여 읽지 못하게 되어 있을 수도..

□ 로그인 후에 쉘을 바꿀 수 있다.

$ chsh □

... (현재의 쉘)

$

※ 보안을 위하여 실행되지 못하게 되어 있을 수도..

(2) 쉘의 역할

□ 화면에 쉘 프롬프트를 띄운다.

□ 엔터를 기다린다.

□ 키인된 명령을 저장하고 해석한다.

□ 키인된 명령을 실행할 프로그램(대개는 명령과 같은 이름의 프로그램)을 찾는다.

□ 해당 프로그램을 실행해 주도록 커널에게 요청한다.

(3) 쉘 명령의 옵션과 인수

$ ls □

... (현재 디렉토리에 있는 파일들)

$ ls -al □

... (현재 디렉토리에 있는 파일들, 숨겨진 파일들 포함, 긴 형식으로)

$ ls -a -l □

... (위와 같음)

$ ls -al /etc □

... (/etc 디렉토리에 있는 파일들)

$ ls -alF /etc □

...

$

□ 각 명령에 대한 옵션은 매뉴얼을 참조한다.

$ man ls □

□ ls 명령의 옵션들

-a 숨겨진 파일 포함

-F 디렉토리 파일에는 /를, 실행 파일에는 *를 표시한다.

-l	긴 형식

-r	역순으로

-s	크기 순으로

-t	변경시간 순으로

-u	엑세스시간 순으로

(4) 표준 입출력

□ 표준 입력 (stdin)	...	입력을 얻는 곳. 디폴트는 키보드

□ 표준 출력	(stdout)	...	출력이 보내지는 곳. 디폴트는 터미널화면

□ 표준 에러	(stderr)	...	에러 메시지가 보내지는 곳.  디폴트는 터미널화면

(5) 리디렉션  > >> <

□ 리디렉션은 명령의 표준입력이나 표준출력을 (키보드나 화면으로부터 파일로) 바꾼 것.

□ 출력 리디렉션

$ cal 9 2001 □

... (2001년 9월 달력)

$

$ cal 9 2001 > calendar2001_9,10 □

$ cal 10 2001 >> calendar2001_9,10 □

$ □

□ 입력 리디렉션

$ mail jones □

%	... (보낼 내용을 키인해야 한다)

$ mail jones < my_message □

$ □

□ 입출력 리디렉션

$ wc  calendar2001_9,10 □

... (calendar2001_9,10에서 줄 단어 문자수)

$ □

$ wc < calendar2001_9,10 □

... (calendar2001_9,10에서 줄 단어 문자수)

$ □

$ wc < calendar2001_9,10 > wdcnt□

$ □

(6) 그룹 명령 (한 줄에 여러 명령)  ;

□ 보통의 그룹 명령

$ cal 9 2001 ; cal 10 2001 ; cal 11 2001 □

... (2001년 9월 10월 11월 달력)

$

□그룹 명령과 리디렉션

$ (cal 9 2001 ; cal 10 2001 ; cal 11 2001) > calendar2001_9,10,11 □

$

$ cal 9 2001 ; cal 10 2001 ; cal 11 2001 > calendar2001_11 □

... (2001년 9월 10월 달력)

$

□ 연습

$ pwd ; cal 9 2001 ; date  □

/export/home/prof/hskang

일	월	화	수	목	금	토

2	3	4	5	6	7	8

9	10	11	12	13	14	15

16	17	18	19	20	21	22

23	24	25	26	27	28	29

30

2001년 9월 10일 월요일 16:20:21

$ (pwd ; cal 9 2001 ; date) > temp1 □

$ cat  temp1 □

/export/home/prof/hskang

일	월	화	수	목	금	토

2	3	4	5	6	7	8

9	10	11	12	13	14	15

16	17	18	19	20	21	22

23	24	25	26	27	28	29

30

2001년 9월 10일 월요일 16:20:21

$

(7) 파이프  |

□ 파이프는 한 명령의 표준출력을 다음 명령의 표준입력으로 바꾼 것 (즉, 한 명령의 표준입력을 이전 명령의 표준출력으로)

□ 따라서, 한 명령의 표준출력과 다음 명령의 표준입력이 파이프 처럼 연결되는 효과

$ cal 2001 ; cal 2002 ; cal 2003 □

... (2001년 2002년 2003년 달력)

$

$ (cal 2001 ; cal 2002 ; cal 2003) | more □

... (2001년 2002년 2003년 달력이 한 화면씩)

$

(8) tee 명령

□ 이전 명령의 출력을 파일로 만듬과 동시에 다음 명령으로 파이프한다.

$ (cal 2001 ; cal 2002 ; cal 2003) | tee calendar2001,2002,2003 | more □

... (2001년 2002년 2003년 달력이 한 화면씩)

$

□ 그러나, tee 명령을 잊고, 다음과 같이 하는 것이 오히려 편하다

$ (cal 2001 ; cal 2002 ; cal 2003) > calendar2001,2002,2003 □

$ cat calendar2001,2002,2003 | more □

... (2001년 2002년 2003년 달력이 한 화면씩)

$

또는

$ (cal 2001 ; cal 2002 ; cal 2003) > calendar2001,2002,2003 □

$ more calendar2001,2002,2003 □

... (2001년 2002년 2003년 달력이 한 화면씩)

$

(9) 기타 명령들

□	cat comm crypt cut diff egrep fgrep fmt grep head more nl paste pg pr sort spell tail tr uniq wq

diff		diff 파일1 파일2 □ 파일1과 파일2의 다른 부분을 출력한다.

grep		grep [-cilnv] 패턴 파일들 □ 파일들을 모두 뒤져서, 패턴이 있는 줄을 모두 출력한다. □ 옵션 ... -n 줄번호도 -l 파일이름만 -v 패턴이 없는 줄만

sort		sort [bcdfmMnortuyz] [□필드] 파일들 □ 파일들 내에서 문장을 정렬하여 출력한다. □ 정렬 순서 ... 아스키 값에 따라 오름차순 (빈칸 숫자 대문자 소문자 순) □ 옵션 ... -b 앞 빈칸 무시 -f 대소문자 무시 -n 숫자 정렬 -r 내림차순

spell		spell □ 오타 에러를 검사한다.

□ grep 명령

$ grep hskang /etc/passwd □

... (이름이 .tmp로 끝나는 모든 파일을 뒤져서, hskang가 있는 줄을 모두 출력한다)

$ grep tank *.tmp □

... (이름이 .tmp로 끝나는 모든 파일을 뒤져서, tank가 있는 줄을 모두 출력한다)

$ grep -n tank *.tmp □

... (이름이 .tmp로 끝나는 모든 파일을 뒤져서, tank가 있는 줄을 모두 출력한다)

$

$ cat /etc/passwd | grep hskang □

... (/etc/passwd 파일에서 hskang이 있는 줄을 출력한다)

$

$ ls -al /* | grep pass* □

... (/ 밑의 모든 디렉토리에 있는 파일 중에 이름이 pass로 시작하는 파일들)

$

□ sort 명령

$ sort calendar2001_9 □

... (test 파일의 각 줄을 정렬하여 출력한다.)

$

$ sort -bf +1 calendar2001_9 □

... (앞 공란과 대소문자를 무시하며, 두 번째 단어를 기준으로 정렬한다.)

$

$ sort calendar2001_? □

... (이름이 14글자이며 calendar2001_로 시작하는 모든 파일의 각 줄을 정렬하여 출력한다.)

$

$ who | sort □

... (현재 시스템을 사용하는 사람을 이름 순으로 출력한다.)

$

(10) 와일드 카드     * ? []

□ 문자열을 대신하는 기호.

□ *	...	임의의 개수의 임의의 문자

$ ls -al k* □

... (이름이 k로 시작하는 모든 파일)

$ ls -al *ball □

... (이름이 ball로 끝나는 모든 파일)

$ ls -al k*ball □

... (이름이 k로 시작하고 ball로 끝나는 모든 파일)

$ ls -al *ack* □

... (이름에 ack가 들어가는 모든 파일)

$

□ ?	...	임의의 문자 한 개

$ ls -al ?iking □

... (이름이 6글자이며, iking로 끝나는 모든 파일)

$ ls -al ???ing □

... (이름이 6글자이며, ing로 끝나는 모든 파일)

$

□ []	...	그 안에 있는 문자 한 개

$ ls -al team[abcd] □

... (teama teamb teamc teamd)

$ ls -al team[a-d] □

... (teama teamb teamc teamd)

$ ls -al team[1-4] □

... (team1 team2 team3 team4)

$ ls -al [abc]* □

... (a나 b나 c로 시작하는 모든 파일)

$

□ 연습1

$ cat out* □

... (이름이 out으로 시작하는 모든 파일의 내용)

$ cat *.tmp □

... (이름이 .tmp로 끝나는 모든 파일의 내용)

$ cat out?.tmp □

... (이름이 8글자이며, out으로 시작하고 .tmp로 끝나는 모든 파일의 내용)

$ cat out[1-3].tmp □

... (이름이 4글자이며, out으로 시작하고 1이나 2나 3으로 끝나는 모든 파일의 내용)

$

□ 연습2

$ wc *2.tmp □

... (이름이 2.tmp로 끝나는 모든 파일의 줄수 단어수 글자수)

$ wc *[2-3].tmp □

... (이름이 2.tmp나 3.tmp로 끝나는 모든 파일의 줄수 단어수 글자수)

$

□ 복합 연습

$ ls -al /* | more □

... (루트 디렉토리의 모든 서브디렉토리들 안에있는 파일들을 출력한다 )

$ ls -al /* | wc -l □

... (루트 디렉토리의 모든 서브디렉토리들 안에있는 파일들의 줄수를 출력한다 )

$ ls -al /* | sort -nr +4 | more □

... (루트 디렉토리의 모든 서브디렉토리들 안에있는 파일들을 정렬하여 출력한다 )

$ ls -al /* | grep pass* □

... (루트 디렉토리의 모든 서브디렉토리들 안에있는 파일들 중에 passwd란 이름이 들어간 파일을 찾아 출력한다.)

$

(11) 인용 부호  ` □ \ □

□ 빽 인용부호, 싱글 인용부호, 빽 슬래쉬, 떠블 인용부호

□ 빽 인용 부호	...	하나의 명령을 의미하기 위해 사용함

$ echo It is date □

It is date

$

$ echo It is `date` □

It is Mon Sep 10 16:21:20 2001

$

□ 싱글 인용 부호	...	특수 문자의 의미를 무효화 시키기 위해 사용함

$ echo What time is it? □

... (? 때문에 에러)

$ echo *** starts *** □

... (* 때문에 에러)

$

$ echo 'What time is it?' □

What time is it?

$ echo '*** starts ***' □

*** starts ***

$

□ 빽 슬래쉬	...	한 개의 특수 문자의 의미를 무효화 시키기 위해 사용함

$ echo What time is it\? □

What time is it?

$ echo \*\*\* starts \*\*\* □

*** starts ***

$

□ 떠블 인용 부호	...	특수 문자(딸라 빽인용부호 빽슬래쉬는 제외)의 의미를 무효화 시키기 위해 사용함

(12) 백 그라운드 실행  &

$ gcc -o test test.c & □

3216

$

$ kill -9 3216 □

$

9. 쉘 작업

(1) 파일을 만드는 가장 간단한 방법   cat 명령

$ cat > temp2 □

... (여러 줄 키인하고, 마지막에는 CTRL-D)

$

(2) 쉘을 잠시 멈춘다.  sleep 명령

$ sleep 5 □

$	... (5초 후에 프롬프트가 나타난다)

$ sleep 5 ; echo 슬슬 시작해 볼까나 □

$	... (5초 후에 프롬프트가 나타난다)

(3) 쉘을 잠시 멈춘다.  sleep 명령

$ sleep 5 □

$	... (5초 후에 프롬프트가 나타난다)

$ sleep 5 ; echo 슬슬 시작해 볼까나 □

슬슬 시작해 볼까나

$

(4) 프로세스 확인  ps 명령

$ (sleep 50 ; echo 슬슬 시작해 볼까나) & □

3271

$

$ ps  □

PID	TTY	TIME	COMMAND

3140	p0	0:03	sh

3271	p0	0:00	sleep 60

3290	p0	0:00	ps

$

$ kill 3271  □

Terminated (sleep 50 ; echo 슬슬 시작해 볼까나)

$

(5) 작업 보류와 백그라운드로의 전환   Ctrl-Z bg jobs 명령

$ (sleep 50 ; echo 슬슬 시작해 볼까나) □

... (Ctrl_Z를 누른다)

Stopped

$ jobs □

[1] + Stopped (sleep 50 ; echo 슬슬 시작해 볼까나)

$ bg %1 □

[1] (sleep 50 ; echo 슬슬 시작해 볼까나) &

$ kill %1 □

$

□과제□

다음을 완성한다.

※ 쉘 히스토리 기능은 사용하지 않는다.

1. 자신의 홈 디렉토리 아래에 20010910 디렉토리를 만들고, 그 곳에서 다음과 같은 파일을 만든다.

(/export/home/prof/hskang/20010910에 professor_office,name을 만들어 놓았으니 참고한다.)

friend10_phone,name	calendar2001	calendar2001_9	calendar2001_1,2,3,4

professor_office,name	calendar2002	calendar2001_10	calendar2001_5,6,7,8

presidents_year,name	calendar2003	calendar2001_11	calendar2001_9,10,11,12

2. ls 명령으로 calendar2001_1,2,3,4  calendar2001_5,6,7,8	calendar2001_9,10,11,12 만 출력한다.

3. 한 줄의 명령으로, 2001년 9월과 10월 11월 달력을 출력한다

4. 한 줄의 명령으로, 친구와 교수와 대통령을 이름 순으로 출력한다. (대소문자 무시)

5. 위의 파일 중 어느 파일의 내용에 Kang 이 있는지 한 줄의 명령으로 알아낸다.

6. 루트 디렉토리와 그 하위의 디렉토리에서 이름에 pass란 글자가 들어있는 파일은 어느 것이 있는지 한 줄의 명령으로 알아낸다.

7. 홈 디렉토리와 그 하위의 디렉토리에서 이름에 calendar란 글자가 들어있는 파일은 어느 것이 있는지 한 줄의 명령으로 알아낸다.