상세 컨텐츠

본문 제목

UNIX 명령어 정리

IT 세상

by 이현민 (지후지율아빠) 2007. 11. 12. 13:50

본문

unix의 특징은 ?


­ 높은 이식성

­ unix는 c로 짜여져 있기 때문에 이식성이 높다. 이식성이 높다는 것은 pc부터 mainframe에 이르기 까지 여러 종류의 computer에 쉽게 이식(porting)될 수 있다는 말이다.

­ 다중 사용자 지원

­ unix는 동시에 여러 사람이 사용할 수 있는 시스템이다.

­ 여러 사용자가 각각의 log-in name으로 동시에 log-in할 수도 있으며, 여러 사람이 하나의 log-in name으로도 동시에 접속할 수 있다.

­ multi - tasking

­ unix는 multi - tasking이 가능한 os이다. multi - tasking이란 여러 개의 program을 동시에 수행하는 능력을 의미한다.

­ 계층적 파일 시스템

­ unix는 최상위 디렉토리(root) 밑에 하위 디렉토리 형태로 계층적인 파일 시스템으로 구축되어 있다. 계층적인 파일 시스템이기에 파일이나 디렉토리에 위치를 부여할 수 있으며, 여러 디렉토리가 수평적으로 존재할 수 있고, 여러 개의 harddisk를 하나의 root 디렉토리 아래에 하위 디렉토리로 사용할 수 있다.




 




4.1 시동과 종료
4.2 파일과 디렉토리
4.3 기본적인 명령어
4.4 압축유틸리티 사용법
4.5 작업제어 관련 명령어


4.1 시동과 종료

4.1.1 login
: login은 사용자가 console을 이용할 때와 터미널을 이용할 때는 다소 차이가 있지만 그렇지 않는 경우도 있다. 예를 들자면 어떤 telnet 접속프로그램으로 접속할 경우 뜨지 않던 openwindows가 다른 프로그램에서는 뜰수도 있다.

4.1.2 command line의 입력형식
: UNIX는 명령어 입력 시에 대소문자 구분이 있다는 점과 항상 명령어의 사용법에 있어서 자신이 없을 때에는 아래의 형식으로 도움말을 이용토록 한다. 그리고 앞으로 나오는 프롬 프트는 '#'로 통일한다. 이러한 프롬프트에 대해서는 크게 연연하지 않아도 된다. 예를 들자면 시스템에 Solaris 2.5를 설치한 다음 처음 뜨는 root용 프롬프트는 '#'이다. 하지만 이것을 수정할 수도 있다. Solaris를 설치하게 되면 먼저 root는 Sun Shell(이하 sh)로 셋팅이 되어 있어서 그렇게 뜬다. 하지만 C Shell(이하 csh)로 설정할 경우 틀려진다. 그리고
자신만의 Shell파일(.cshrc)에서 set prompt문법을 이용하여 아예 프롬프트를 바꿀 수도 있으므로 이 부분에 대해서는 크게 신경을 쓰지 않도록 하자.

# man ls

4.1.3 비밀번호의 설정과 변경
: 비밀번호는 시스템을 사용함에 있어서 가장 소중히 다뤄야 할 부분이다. 쉽게 알 수 없는 즉 자신의 신상명세와 연관없는 것을 고르고 남들이 알지 못하도록 해야 한다. 예를 들자면 규칙을 이용하여 암호를 설정하는 습관을 가지는 것도 도움이 된다. 다음의 명령어로 암호 를 바꿀 수 있다.

# passwd

Enter New password :
Re-enter New password :

4.1.4 logout
: 시스템 사용을 종료할 때에는 실행중인 프로세스가 없는지 확인을 하고 종료한다.

# ps -a
.............

# logout

종료할 때에는 logout 과 exit 또는 Ctrl + D 이다.

4.2 파일과 디렉토리

4.2.1 파일의 종류

(1) 정규파일
: 정규파일이란 .login 이나 a.txt 같은 보통파일을 말한다.

(2) 디렉토리 파일
: UNIX에서는 정규파일과 디렉토리 파일을 다해서 파일이라고도 부른다. 디렉토리 파일은 ./data 같은 디렉토리를 의미한다.
다음의 표에서는 / 밑에 있는 디렉토리를 성격별로 나타낸 것이다.


/ : UNIX 커널의 실행화일 및 시스템 관리에 중요한 .login, .profile드의 파일이 포함된다.
/bin : UNIX의 기본 커맨드 파일들이 위치한다.
/etc : init, passwd등 시스템 관리용의 커맨드나 데이터 파일들이 위치한다.
/lib : 커맨드들이 사용하는 기본적인 파일들이 배치된다.
/temp : 커맨드 실행 중에 필요한 임시 파일들을 위치시키기 위하여 사용되는 디렉토리이
다.
/usr : 일반적으로 시스템 관리자의 파일들이 배치한다.
/usr/bin : 워드, 데이터 베이스관리 프로그램들과 개발된 프로그램등이 포함된다.
/usr/home : 사용자들의 홈 디렉토리로서 대표적으로 지정하는 것이나 시스템을 설치할
때 다른곳으로 정해줄수도 있으며 사용자계정을 만들 때에 다른 곳으로 만들어 줄 수도
있다.
/usr/include : C언어의 header 파일들이 포함된다.
/usr/man : UNIX의 매뉴얼이 위치한다.
/usr/spool : CPU와 주변장치를 중첩하여 수행시키기 위하여 주변장치로 출력되는 데이터
파일들을 임시로 저장하는 스풀용의 디렉토리다.
/usr/adm : UNIX의 사용자와 프로세스의 작동을 monitor하는 accounting error reports
같은 프로그램들이나 데이터 파일들이 포함된다.


(3) 특수화일
/dev밑의 파일들을 일컽는데 이곳에는 입출력장치의 제어기를 이곳에서 맞추어 장치를 연결할 수 있게 한다. 예를 들면 /dev/tty12는 12번 터미널을 의미한다. 이곳에서는 자신이 가지고있는 장치가 /dev 디렉토리내의 어떤 형식의 장치를 가지고 있는가를 알고만 있어도 장치를 인식할 수 있다.
4.2.2 파일명과 경로명
: UNIX 시스템의 파일명은 255문자이내에서 사용 가능하다. 주의할 것은 대·소문자를 구별 한다는 것이다. 또 한가지 "." 나 "_"로 시작되는 파일명은 시스템 파일들이 많이 사용하기 때문에 사용하지 않는 것이 바람직하다.

(1) 상대경로명
: 만약 현재의 /home/pctop/pub 에서 /home/pctop/data 로 이동하려고 할 때 cd ../pub 라고 입력하면 된다. 이때 쓰이는 방식이 상대경로 이동방식이다.

(2) 절대경로명
: 만약 현재의 /home/pub 에서 /home/a 로 이동하려고 할 때 cd /home/a 라고 입력하면 된다. 이때 쓰이는 방식이 절대경로 이동방식이다.

4.2.3 파일의 특성
파일의 보안성을 유지하기 위해서는 무엇보다도 첫째, 허가모드를 중요시 여겨야 한다. 파일의 허가모드의 순서는 다음과 같다.


user group others
rwx rwx rwx


파일의 유형에는 다음의 7가지에 한한다


- : 정규파일
d : directory
l : symbolic link
c : character type
b : block type
s : socket
p : named pipe


이 허가모드를 변경하기 위해서는 chmod 명령어를 이용해야 하며 그에 대한 상세한 설명은 4.3의 기본적인 명령어중 chmod를 참조하기 바란다.
4.3 기본적인 명령어

기본적으로 UNIX는 대소문자를 구별한다. 그리고 alias가 되어있지 않는한 소문자로 명령어 를 입력하는 것이 일반적이므로 이에 주의하여야만 한다.

id : 사용자의 이름과 번호의 표시(사용자가 속한 group id와 user id를 표시함)
# id

pwd : 사용자의 현재의 디렉토리 표시
# pwd

tty : 사용자 단말기의 장치파일명 표시
# tty

stty : 터미널 제어특성의 표시 및 지정, 현재 컴퓨터 시스템과 연결되어 있는 단말기나 콘솔의 입출력을 논리적으로 변경
#stty

date : 시스템의 날짜와 시간의 표시
#date

cal : 현재의 달력을 보고자 할 때 사용한다.
#cal

who : 현재 접속되어 있는 사용자들 표시
#who

whoami : 현재 접속해 있는 자신의 id를 표시
#whoami

finger : 시스템 사용자의 개인 정보표시(이 정보에서 이름은 가입할 당시의 comment만 찍
힘)를 위한 것이지만 이렇게 안 나올 경우도 있다.
#finger root

그것은 자신이 시스템에 오래 접속하지 못할 사정이 생겨서 다른 사용자가 이 명령어를 이용하여 검색할 때 '지금 저는 출장중입니다' 라는 메시지가 나오도록 한다면 얼마나 좋을 것인가. 자! 방법이 있다. 자신의 로그인 디렉토리(이하 홈 디렉토리)에 .plan 이라는 파일을 만들어 보자. 이때는 일반 텍스트편집기를 사용하면 된다. 예를 들면 VI Editor 같은 것이다. VI를 이용하여 '저는 출장중입니다' 라는 메시지를 쓰고 저장후 종료하면 .plan 이라는 파일을 cat을 이용하여 내용을 확인한 후 명령프롬프트 상에서 시험해보자.
만약 자신의 id가 kcs 라면 'finger kcs'를 입력해본다. 그러면 '저는 출장중입니다'라는 메시지가 뜰 것이다. 잠깐! 한글로 썼을 경우 안나타날수도 있다. 그러면 영어로 써야한다

그것은 자신이 시스템에 오래 접속하지 못할 사정이 생겨서 다른 사용자가 이 명령어를 이용하여 검색할 때 '지금 저는 출장중입니다' 라는 메시지가 나오도록 한다면 얼마나 좋을 것인가. 자! 방법이 있다. 자신의 로그인 디렉토리(이하 홈 디렉토리)에 .plan 이라는 파일을 만들어 보자. 이때는 일반 텍스트편집기를 사용하면 된다. 예를 들면 VI Editor 같은 것이다. VI를 이용하여 '저는 출장중입니다' 라는 메시지를 쓰고 저장후 종료하면 .plan 이라는 파일을 cat을 이용하여 내용을 확인한 후 명령프롬프트 상에서 시험해보자.
만약 자신의 id가 kcs 라면 'finger kcs'를 입력해본다. 그러면 '저는 출장중입니다'라는 메시지가 뜰 것이다. 잠깐! 한글로 썼을 경우 안나타날수도 있다. 그러면 영어로 써야한다.

주사용 명령어.


where 찾고자 하는 파일이나 디렉토리의 위치를 알려준다 # where index.html

ps process의 상태표시 # ps -ajx
option)
-a : 다른 사람에 의해 소유된 프로세스에 대한 정보를 포함
-c : command 이름을 표시
-C : %cpu field내에 decaying average 대신에 raw CPU time을 표기
-e : argument 외에도 환경을 표기
-g : 이 option이 없으면 interesting 프로세스만 프린트
-j : PPID, PID, PGID, SID, TT, TPGID, STDT, UID, TIME정보 포함 표기
-u : USER, %CPU, %MEN, SZ, RSS, START field 포함
-x : no controlling terminal 가진 프로세스 포함
중간용어설명)
PPID : process의 parent의 number id
PGID : process group id of process
SID : process 가 속해있는 session의 number id
TPGID : TT 아래 명시된 터미널과 관계 있는 process group의 number id
UID = 0 : Super-User


df 디스크의 사용가능한공간표시 # df -u
cp copy # cp index.html index_old.html
mv move # mv index.html index_new.html
rm remove # rm index.html
rmdir remove directory # rmdir ./images
mkdir make directory # mkdir photo
chdir change directory # chdir /usr/local
cd change directory # cd /usr/local/bin
du 디스크의 사용공간 표시(옵션이 없으면 현재의 위치에서 하위의 모든 파일들의 공간표시) # du ./

hostname 현재 접속해 있는 host의 이름을 표시 # hostname
man 해당하는 command의 manual을 참조하고자 할 때, 단 /usr/man에 그 항목이 있어야만 한다. # man ls

& background 처리를 위하여 명령어 뒤에 붙여준다. # test &

alias 특정한 명령어를 자신이 임의로 수정 # alias cx chmod
위와 같이 하면 cx는 chmod명령어를 대신한다. 이러한 작용을 shell에 추가시킬때는 다음과 같이 추가한다.
alias cx 'chmod'
alias를 해제하고자 할 때는 unalias를 사용한다.
ex) # unalias cx
그리고 현재 설정된 alias들을 보고 싶을때는 alias를 입력하면 된다. 다음은 한 예이다

path 경로를 지정
일반적을 shell에 지정하지만 명령어로서 수정할 수도 있다. 추가하는 방법은 다음곽 같다
set path = ( ~/bin /bin /usr/bin /usr/local . )
%set path = ( $path /usr/bin /usr/local /usr/local/etc )
두 번째 라인의 %set 명령어는 기존의 path에 추가할 때 사용하는 방법이다.

find 디렉토리를 탐색하여 지정화일의 위치표시 # find index.html
cat 파일의 내용을 표시, DOS에서의 type명령어와 유사 # cat index.html

more 파일의 내용을 한면씩 화면에 표시 # cat index.html | more
pg 파일의 내용을 표시 # pg index.html
head 파일의 처음 부분을 표시(기본값은 10라인) # head index.html
tail 파일의 마지막 부분을 표시(기본값은 10라인) # tail index.html
lp 파일의 내용의 인쇄요청 # lp index.html
pr 인쇄를 위한 파일의 페이지화, 파일을 인쇄하기 위한 준비로서 페이지를 분리한다. 각 페이지는 파일명, 날짜, 시간 및 페이지 번호를 표시하는 header를 포함한다. # pr index.html

chmod change mode # chmod 755 ./htdocs
위에서 755가 의미하는 것을 해석해보면 만약 "ls -al "을 입력했을 때 다음의 형식으로 나타났다고 가정하자
# ls -al
drwxrw-rw- ./htdocs
lrwxr--r-- ./pub ----> ./public_html
위와 같이 나나났다면 처음의 d는 디렉토리를 의미하며 다음의 rwx 는 ./htdocs에 대한 소유주의 권한이 read,write,excute 의 세 가지 권한이 다 주어진 것이다. 다음의 rw- 는 소유주가 속한 그룹에게 주어진 권한이며, 다음의 rw- 는 그룹이외의 사용자에게 주어진 권한이다. 즉, 디렉토리이면서 소유주는 읽기·쓰기·실행이 가능하며 그룹에게는 읽기·쓰기 가능, 이외의 사용자는 읽기·쓰기가 가능하다. 여기서 각 권한블럭마다 3비트를 할당하고 있음을 알 수 있다. 즉 소유주에 대한 권한 rwx 를 2진으로 바꾼다면 1112 이다. 이것을 10진수로 바꾸면 7이며, 그룹에 대한 권한 rw- 를 2진으로 바꾼다면 1102 이며 10진수는 6이다. 그룹이외의 사용자도 마찬가지로 10진수 6이다. 그러므로 이 디렉토리에 대한 권한을 숫자로 표기한다면 766이다. 이것을 소유주는 읽기·쓰기·실행이 다 가능하면서 그룹과 이 외의 사용자는 읽기·실행만 가능하게 한다면 십진수로 755가 될 것이다. 그러므로 변경을 위해서는 chmod 755 ./htdocs 를 입력하면 된다. 모드부분에서 "lrwxr--r--"중 'l' 부분은 link를 의미하는 것으로서 ./public_html과 링크 되어 있음을 의미한다.
이것을 보다 쉽게 바꾸는 방법도 있다. 그룹은 g를 이 외의 사용자는 o로 나타낼 수 있는데 현재의 권한 766에서 744로 변경하고자 할 때에는 그룹이 가지고 있는 쓰기 권한을 박탈하는 동시에 이 외의 사용자에게도 쓰기 권한을 박탈해야만 한다. 이때 사용하는 용법은 다음과 같다.

chown change owner # chown webadm ./htdocs
chgrp change group # chgrp student webadm
ln link, 예 : ln -s list3 /tmp/list # ln -s /usr/local/etc/httpd/htdocs ./htdocs
UNIX에서의 link는 공간의 절약을 꾀할 수 있으나 연결상태를 잘 파악하고 사용하여야 한다. ln의 option중에서 -s의 의미는 다른 file system에 있는 것도 link할 수 있는 symbolic link를 사용함으로서 유용한 option이다.



4.4 압축 유틸리티 사용법
4.4.1 .tar
tar는 정확히 말하자면 압축유틸리티가 아니다. 이것은 단순히 여러 개의 파일을 하나의 덩어리로 결속시키는 것이다. 이렇게 해서 하나의 덩어리로 만든 다음에 압축을 하는 것이 대개의 과정이다. 결속 할 때의 사용법은 다음과 같다.

# tar -cvf <만들 파일이름>.tar <묶고자하는 파일이름>
결속된 .tar 파일을 풀고자 할 때의 사용법은 다음과 같다.
# tar -xvf <묶여있는 파일이름>.tar

4.4.2 .tar.z
위에서 .tar를 살펴본 것처럼 .tar로 결속을 시킨 다음 압축을 이행한다. 이때는 compress 라는 유틸리티를 이용하게 된다. 그렇게 하여 압축을 하면 원래의 파일에 .z가 추가적으로 붙게 된다. 압축하는 과정과 푸는 과정은 다음과 같다.

# compress filename
# uncompress filename

4.4.3 .gz 또는 .z
compress외에 gzip이라는 유틸리티도 이용되는데, 사용법은 다음과 같다.

#gzip filename (압축할 때)
# gzip -d filename

4.5 작업제어 관련 명령어

4.5.1 background 작업 프로세스의 정지와 삭제
정지는 아래의 stop 명령어로 제어될 수 있다. 그리고 현재의 진행중인 작업을 보려면 jobs라는 명령어로 체크할 수 있다. %job_number는 현재 실행중인 프로세스 번호를 적는 것 으로서 pid와 동일한 값을 갖는다.
# stop %job_number
# jobs (show job#)

삭제를 위해서는 명령어를 사용하는데 사용법은 다음과 같다. 여기서 pid는 프로세스 id이며, 'ps -a' 명령어로 알 수 있다.
# kill -9 pid

4.5.2 foreground 작업 프로세스의 정지와 삭제
현재 작업중인 프로세스를 background작업으로 돌리기 위해서는 'Ctrl + z '를 입력한다. 그리고 이렇게 background로 전환된 작업은 다음의 명령어로 제어될 수 있다.

# fg ☞ foreground 로 다시 전환시킴
# \ ☞ 종료를 시킴
# bg ☞ 계속 진행시킴

4.5.3 기타 작업제어 관련 명령어
# command& ☞ background 작업개시
# ps ☞ 현재 실행중인 프로세스 id 디스플레이
# jobs ☞ background 작업번호 및 상태 디스플레이
# nohup command& ☞ logout 후에도 명령 실행 계속유지
# fg ☞ 현재작업을 foreground 로 전환시킴
# fg %n ☞ n 번 작업을 foreground 로 전환시킴

4.5.4 history
이전에 사용된 명령어를 호출하는 명령어이다. history의 개수지정은 자신의 shell에서 변수로 지정할 수 있으며, 지정하는 방법은 다음과 같다. 개수를 50개로 한다면,

set history=50

--
nirvana
 





Log-in & log-out

unix는 log-in 절차를 통하여 시스템 보안을 유지한다.

시스템에 대한 접근을 허락하기 전에 사용하고자 하는 사람의 사용자 이름과 암호를 요구하고 시스템에 등록되어 있는지를 검사한다.

unix는 항상 대소문자를 구분한다. 사용자 이름(login name)을 입력할 때 반드시 대소문자를 구별하여 입력해야 한다.

시스템에 log-in된 이후 각 사용자 이름은 user-id라는 숫자로 관리된다.

일단 log-in하면 설정되어 있는 쉘의 종류에 따라 $ 나 % 프롬프트를 만나게 된다. unix 시스템에서 작업을 끝내고 접속을 해제하는 절차를 log-out이라 하며 쉘 prompt에서 logout 또는 exit를 입력하거나 ctrl + d로써 log-out된다.

unix의 사용자는 superuser와 enduser로 나뉜다. superuser는 시스템 관리 및 유지 보수 권한을 가지며, enduser는 unix 시스템에 등록된 일반 사용자를 지칭한다.

일반사용자는 대개 본인의 디렉토리에만 파일을 생성하거나 삭제가 가능하다. 프로세스에도 제한적 권한을 갖게 되어 오직 본인이 발생시킨 프로세스만이 제어 가능하게 된다.


명령어 사용법 (syntax)

쉘 프롬프트

unix 시스템에 접속하게 되면 $나 %를 만나게 된다.

$나 %를 쉘 프롬프트라고 부르며 쉘 프롬프트는 명령을 받아들일 준비가 되었음을 의미한다.

간단한 명령을 입력해 보기 전 명령어 사용법에 대해 알아보자.

명령어 사용법은 아래와 같다.

명령어 [-Option] [argument] 

브라켓( [ ] )으로 표현된 부분은 입력해도 되고 안해도 된다.

이 부분을 굳이 입력하지 않아도 명령 실행에는 지장이 없다는 뜻이다.

명령어 자체는 당연히 입력해야 하므로 브라켓으로 표현되어 있지 않다.

빈 칸은 명령어와 Option, 그리고 argument( 인수)를 구분하는데 사용된다.

Option은 대개 하이픈( - )으로 시작된다






기본적인 명령어

banner - 문자열 확대하기


banner는 인수로 입력된 문자열을 확대하여 화면에 출력한다.

사용법은,  banner argument [argument]

 (여기서 문법이 이루어지려면 banner 부분은 반드시 입력해야하고 적어도 하나이상의 인수도 필요하게 됨을 알 수 있다.)


man (manual)

man 명령은 명령어의 사용법을 보여준다.

help와 같은 기능을 한다.

사용법은,

man keyword | command

man을 실행하고 나서,

- 다음 page로 가려면, space bar를 누른다.

- 다음 line으로 가려면 return key를 누른다.

- 끝내려면 q를 입력한다.

사용 예를 보면,

$ man cp 

cp의 사용법을 보여준다.


Id (identifier) - 사용자 관련정보 확인하기


id 명령은 사용자의 user id, user name, group id, group name을 알려준다.

- a Option을 사용하면 user name, user id와 사용자가 소속되어 있는 모든 group 이름을 알려준다.

- hp-ux에서는 p Option임.

사용 예를 보면,


$ id

uid=103(guest) gid=20(users)


who

who 명령은 시스템에 log-in 한 사용자와 단말기port, 그리고 log-in 시간 등을 보여준다.

사용법은 who [am i]

who am i는 현재 사용자 본인의 log-in 이름을 알려준다.

Whoami 는 시스템이 로컬단말기포트와 연관시킨 사용자이름을 보고 ,

$ who       $ who am i


date - 현재 설정되어 있는 날짜와 시간을 변경하거나 출력하기

사용 예를 보면, date 명령으로 현재의 날짜와 시간을 보여줌을 알 수 있다.

$ date


 

passwd (password)

passwd 명령은 사용자의 암호를 변경할 수 있게 한다.

사용법은,


passwd [ ]


echo - 문자열 출력하기


echo는 인수로 입력된 문자열을 화면에 출력한다.

echo [argument]

현재 구동중인 쉘이 무엇인지를 확인하려면 환경 변수인 "shell" 을 참조하며, 쉘 프롬프트에서 echo $shell 하여 본다.


Module 3


파일 시스템에 대해

unix 시스템은 파일과 디렉토리를 구성하고 관리하기 위해 파일 시스템을 제공한다.

파일 시스템은 트리 형태의 계층 구조로 되어 있다.

나무를 거꾸로 세워 놓았을 때에 뿌리(root)가 제일 위로 가기 때문에

root 디렉토리라고 하며, " / "로 표현한다.

unix 시스템은 하드디스크나 cd-rom 등과 같은 하드웨어 장치를 파일로 관리한다.

이러한 파일들은 /dev 에 있으며 여기에 data 가 직접 기록되는 것은 아니고 입출구 gate 역할을 한다. 이러한 hardware 장치 파일들을 특수 파일이라 한다.

unix에서의 디렉토리 구분은 역슬래시( \ )가 아니고 슬래시( / )로 구분함을 알아두자.

unix 시스템에서의 일반적인 디렉토리 구조를 살펴보면,

 그림에서 타원은 디렉토리를 의미하며 네모는 파일을 의미한다.


주요 디렉토리에 대해 알아보면,

­ /user/bin   일반 user가 사용하는 명령어들(cp, ls, man ....)이 들어 있다. bin은 binary (이진수)의 약        자이다.

­ /etc               시스템 구성 파일(hosts, ping, ....)이 들어있다.

­ /home       대개 사용자의 home 디렉토리가 /home 아래의 하위디렉토리로 존재한다(홈 디렉토리란       시스템에 log-in했을 때의 최초의 작업 디렉토리이다).

­ /dev        모든 하드웨어 장치파일(특수파일)이 들어있는 디렉토리이다.

­ /bin               시작과 shutdown 에 사용되는 명령어들이 들어 있다.

 경로명 (path)

경로

unix 시스템에서의 파일이나 디렉토리에 대한 명령어들에게, 대상 파일이나 디렉토리의 위치를 알리기 위해 경로명을 사용하게 된다.

그래서, 경로명은 대상 파일이나 디렉토리에 도달하기 위해 거쳐야 하는 계층 구조를 의미한다고 할 수 있다.

그러니까, 그 파일이나 디렉토리의 위치를 나타낸다고 할 수 있다.


 경로에는 절대경로와 상대경로가 있다.

절대경로란 root 에서부터의 경로를 의미한다.

- 위의 계층 구조에서 ①의 절대 경로명은 /etc이다. 

- 절대경로는 언제나 변함이 없으며, 항상 “/”로 시작하게 된다.

- ③의 절대경로명은 /home/user2/file1이다.

- 절대경로는 계층에서의 현재 위치와 관계가 없다.

상대경로는 현재 위치에 따라 달라지게 된다.

- 상대경로는 현재위치에서의 상대적인 경로를 의미한다.

- 위의 계층 구조에서 user1 이 현재 위치라고 할 때 의상대경로는 ../home/user2/file1이된다.

- 상대경로는 현재 위치에서의 경로이므로 결코 “/”로 시작할 수 없다.


pwd (print working directory) - 현재 작업 디렉토리 확인하기

pwd 명령은 현재의 위치를 알려준다.

즉, 사용자가 현재 작업하고 있는 디렉토리 명을 알려준다.

사용 예를 보면,


$ pwd

/home/user3/unix01


ls (list) - 디렉토리 내의 파일 목록 보기

ls 명령은 지정한 디렉토리의 파일 목록을 보여준다.

디렉토리를 지정하지 않으면 현재 디렉토리의 파일 목록을 보여준다.

사용법을 살펴보면,

ls [-Option] [경로명] 

여기서 사용되는 Option은 다음과 같다.

о -a (all) hidden 파일의 목록도 보여준다.

. 으로 시작하는 파일의 목록도 보여준다.

о -i (inode) 각 파일들의 inode 정보를 보여준다.

о -l (long) 긴 형식으로 파일의 정보를 보여준다.

о -f (format) 디렉토리는 /를, 실행 파일은 *를, 심볼릭 링크된 파일은 l 을 붙여서 보여준다.

о -d (directory) 지정한 디렉토리 자체에 대한 정보를 보여준다.

о -r (recursive) 하위 디렉토리의 목록도 보여준다.


 $ ls /home

 /user1 /user2 /user3

 루트 디렉토리의 하위 디렉토리인 home디렉토리에 있는 파일의 목록을 알려준다.

$ ls -f /home

 user1/ user2/ user3/

 /home 디렉토리의 내용을 -f format으로 보여준다.

파일 이름 끝에 "/"가 있기에 디렉토리임을 알 수 있다.

$ ls -l /user4/unix 

long format으로 다음과 같이 보여준다.



 

cd (change directory) - 현재 디렉토리 변경하기

cd 명령어는 현재의 디렉토리를 변경해 준다.

사용법을 살펴보면

cd [경로명]

경로명을 입력하지 않으면 home 디렉토리로 간다.

home 디렉토리란 시스템에 log-in한 후 최초로 있게 되는 디렉토리를 의미한다.

예를 들어보자.

root 디렉토리로 가려면,

$ cd /

$ pwd

 /

 home 디렉토리로 가려면, $ cd

$ pwd

 /user4/unix/unix01

 바로 위 디렉토리로 이동하려면, $ cd ..

$ pwd

  /user4/unix

 위로 두 칸 올라가려면, $ cd ../..

$ pwd

 /

 절대경로를 이용하여 이동하려면, $ cd /user4/unix

$ pwd

 /user4/unix

 바로 위 디렉토리의 하위 디렉토리인 etc로 가려면, $ cd ../etc

$ pwd

 /etc



find - 파일찾기

find 명령어는 파일 시스템에서 주어진 조건으로 파일을 찾는다.

사용법을 살펴보자.

find 대상디렉토리 검색 조건 처리 방법

대상 디렉토리 : 찾기를 시작할 디렉토리를 지정한다.

검색 조건 : 찾을 조건을 지정한다.

-name filename 파일 이름으로 찾는다.

-atime +n access time 이 n일 이전인 파일을 찾는다.

-atime -n access time이 n일 이내인 파일을 찾는다.

-mtime +n n일 이전에 변경된 파일을 찾는다.

-mtime -n n일 이내에 변경된 파일을 찾는다.

-perm nnn 파일 권한이 nnn인 파일을 찾는다.

-type x 파일 타입이 x인 파일들을 찾는다.

-size n 사이즈가 n이상인 파일들을 찾는다.

-links n 링크된 개수가 n인 파일들을 찾는다.

-user username user이름으로 찾는다.

-group groupname group 이름으로 찾는다.

처리방법 : 찾은 파일을 어떻게 할 것인지를 지정한다.

-print 찾은 파일의 절대 경로명을 화면에 출력한다.

-exec cmd {}\;  찾은 파일들에 대해 cmd 명령어를 실행한다.

예를 들어보자.

$ find /user4 -name test* -print

/user4 아래에서 파일이름이 test로 시작하는 모든 파일을 찾아서 화면에 보여준다.

$ cd /

$ find . -name ping -print

root 디렉토리 밑에서 파일이름이 ping인 파일을 찾아 절대 경로명을 화면에 출력한다.

$ cd /

$ find /usr -name *.c -print

/usr 밑에 이름이 .c로 끝나는 모든 파일들을 찾아 경로명을 보여준다.

$ cd /

$ find $home -name who.txt -print

home 디렉토리 아래에 who.txt라는 파일을 찾아 경로명을 보여준다.

$ cd /

$ find . -type d -print

 파일 타입이 d인 파일을 찾아 경로명을 화면에 출력한다.

$ cd /

$ find /dev -type c -print

 /dev디렉토리 아래에서 파일 타입이 c인 파일을 찾아 경로명을 보여 준다.

$ cd /

$ find . -perm 700 -print

 파일 권한이 700인 파일을 찾아준다.

$ cd /

$ find . \ ( -perm 400 -o -perm 200 ) -print

 파일 권한이 400인 파일과 200인 파일을 찾아준다.

(주의 : “\”의 앞뒤에 space 가 반드시 있어야 한다.)

$ cd /

$ find . -size +1024 -print

 파일의 블럭 크기가 1024 이상인 파일을 찾아준다.

$ cd /

$ find . -name core -size +2048 -print

 파일 이름이 core이고 크기가 2048블럭 이상인 파일을 찾아준다.

$ cd /

$ find . -user unix01 -print

 파일 소유자가 unix01인 파일을 찾아준다.

$ cd /

$ find . -group unix -print

 사용자그룹이 unix인 파일을 찾아준다.

$ cd /

$ find . -atime +30 -print

 30일 이전에 억세스되었던 파일을 찾는다.

$ cd /

$ find . -mtime -7 -print

 7일 이내에 수정된 적이 있는 파일을 찾는다.

$ cd /

$ find . -name core -exec ls -l {} \;

 이름이 core인 파일을 찾아서 ls -l 한다.

$ cd /

$ find . -name \*.c -atime +30 -exec ls -l {} \;

mkdir & rmdir (make directory & remove directory)     - 디렉토리 만들기와 지우기

mkdir

디렉토리를 만들 때 사용한다.

일반적으로 사용자는 자신의 home 디렉토리 아래에서만 디렉토리를 만들 수 있다.

일단 디렉토리가 만들어지면 그 디렉토리 내에 “.”과 “..” 파일이 만들어진다.

사용법을 살펴보면,

mkdir 디렉토리명

 rmdir

디렉토리를 삭제한다.

디렉토리 안에 파일이 존재하면 디렉토리가 지워지지 않는다.

사용법은,

rmdir 디렉토리명

 예를 들어,

$ cd

$ pwd

 /user4/unix/unix01

$ mkdir testtest

$ cd testtest

$ ls -a

$ cd ..

$ rmdir testtest

$ ls

 DT3FT-BFH4M-GYYH8-PG9C3-8K2FJ














MODULE4


cat (catenate) - 파일내용 보기 / 파일 결합하기

파일 내용 보기

사용법을 살펴보면,

cat [-Option] file...

 파일은 절대경로 또는 상대경로로 지정할 수 있다.

Option 으로는,

-v : 파일에 포함되어 있는 제어 문자도 보여준다.

-e : 각 라인의 끝을 $로 보여준다.

반드시 -v 와 함께 사용한다.

-t : 탭문자를 ^i로 보여준다.

-vet : 화면상에 표시 불가능한 문자들을 보여준다.

 예를 들어보자.

$ cd

$ pwd

 /user4/unix/unix01

$ who > test

$ cat -vet test

 cat은 파일 내용을 한꺼번에 보여주기 때문에 "ctrl + s"로 일시 정지하여 보기도 한다.

여러 파일을 하나의 파일로 합칠 수가 있다.

파일들을 결합하는 예를 들어보면

$ cat pass* > passwd.copy 

pass로 시작하는 모든 파일을 passwd.copy라는 이름으로 합친다.

$ cat passaa passab > passwd.aabb 

passaa와 passab를 합하여 passwd.aaab를 만든다.



more

more 명령도 cat 처럼 텍스트 파일의 내용을 볼 때 사용할 수 있다.

cat 은 파일 내용을 한꺼번에 출력시키지만

more는 화면 크기로 출력시켜 준다.

파일 내용이 한 화면을 넘을 때 enter키로 한 라인씩 스크롤 하거나 space bar 로 한 화면씩 스크롤한다.

예를 들어,

$ more /etc/passwd

 enter 키와 space bar 로 스크롤 시킬 수 있다.


lp (line print) - 파일 인쇄하기

lp 명령은 인쇄할 파일을 대기 행렬(queue)에 넣게 해 준다.

lp 명령으로 인쇄할 파일을 대기 행렬에 보내면 고유한 작업 번호가 할당된다.

사용법은,

lp [-dprinter] [-Options] filename...

 여기에서,

-dprinter : 파일을 인쇄할 프린터의 이름을 지정한다.

Option 에는,

-nnumber : 인쇄할 부수를 입력한다.

-ttitle : 표지 제목을 인쇄한다.

-w : 인쇄 종료 후 사용자에게 메시지를 보낸다.

-o : 글씨체나 피치 등과 같은 프린터에 특정한 인쇄 항목을 지정한다.

사용 예는,

$ lp report 

report 라는 파일을 인쇄 대기 행렬(queue)에 보낸다.

기본 printer로 인쇄된다.

$ lp -n2 file1 file2 

file1과 file2를 2부씩 인쇄한다.

$ lp -dlaser -t"confidential" memo3 

memo3 파일을 laser라는 이름의 printer로, title을 confidential로 인쇄하게 한다.


cp (copy) - 파일 복사하기

cp명령은 파일을 복사하는데 사용한다.

사용법은 cp [-Option] source_file target_file

 다른 디렉토리로 복사할 때, 경로만 지정하면 동일한 파일명으로 복사하며,

경로와 함께 다른 파일명을 붙여주면 다른 파일명으로 복사해준다.

cp명령은 대상파일이 이미 존재하는 경우, 덮어쓸 지를 물어보지 않는다.

여기서 Option은,

-i : target_file 이 존재할 경우, 덮어쓸 것인지를 물어본다. (interactive)

-r : 하위디렉토리까지 복사한다. (recursive)

사용 예는,

$ cp f1 f1.copy

f1.copy라는 파일이 현재 디렉토리에 만들어진다.

memo라는 디렉토리가 있을 때, $ cp f1 memo

memo 디렉토리에 f1 파일이 복사된다.

$ cp f1 memo/f1.copy

memo 디렉토리에 f1.copy 파일이 만들어진다.

$ cp -r /usr/* /home

 /usr 밑의 모든 파일이 home 디렉토리에 복사된다.



mv (move) - 파일 옮기기와 이름 바꾸기

mv 명령은 파일을 이동할 때 사용된다.

source 파일의 디렉토리와 target 파일의 디렉토리가 일치하면 파일의 이름을 바꿔준다.

mv 명령으로 파일을 옮기면 실제 데이터가 옮겨지는 것은 아니고, 계층적 구조에서 파일 이름만 이동시키게 된다.

사용법은,

mv [-Option] source_file target_file

 여기서 사용되는 Option 에는 ,

-i : target 파일이 이미 존재할 때, 덮어쓸 지를 물어본다. (interactive)

사용 예를 살펴보자.

$ cd

$ ls -l > test

$ ls -l > test1

$ mv -i test test1

 remove test1? (y/n) n

$ mv test test1

$ ls test*

네번째 줄을 입력하면 덮어쓸지를 물어보게 된다.

여섯번째 줄의 명령에 의해 파일이름을 test1으로 변경한다.



ln (link) - 파일 링크하기

링크

링크란 여러 개의 파일이 하나의 데이터를 참조하도록 하는 것이며, 데이터만 참조하므로 디스크의 공간을 효율적으로 사용할 수 있다.

그래서, 주로 여러 명의 사용자가 파일을 공유하고자 할 때 쓰인다.

임의의 파일이 링크되면, 사용자는 파일의 데이터를 참조하기 위해 원래의 파일명이나 새로 링크된 파일명을 이용할 수 있다. 어떠한 파일명을 이용하든지 그 결과는 같다.

ln 명령어

ln 명령을 이용하면, 파일 시스템 상에 존재하는 하나의 파일 및 그 데이터를 참조할 수 있는 여러 개의 파일을 생성해 사용할 수 있어 매우 편리하다.

링크에는 하드 링크와 심볼릭 링크가 있다.

하드 링크

하드 링크는 일반 파일을 링크할 때 주로 이용하며, 옵션없이 ln 명령으로 링크시키면 된다.

생성된 링크 파일은 원래 파일의 inode(index node라 하며 파일에 대한 정보가 저장된 레코드)를 그대로 참조하기에 원 파일이 지워져도 아무런 문제가 되지 않는다.

원 파일을 지우더라도 내부적으로 일어나는 일은 inode의 link number 값을 하나 감소하기만 할 뿐이다.

하드 링크는 하나의 파티션을 넘어 링크시킬 수 없다.

예를 들어보면,

$ who > who.list

$ ln who.list who.list1

$ cat who.list1

$ rm who.list

$ cat who.list1

심볼릭 링크

심볼릭 링크는 주로 디렉토리를 링크할 때 사용한다.

심볼릭 링크는 하나의 파티션을 넘어 다른 영역의 파일까지 링크시킬 수 있다.

ln -s 명령으로 링크시키며 생성된 링크 파일은 원래의 파일명을 참조하게 된다. 그래서 원 파일이 삭제되면 실제 데이터 블럭을 참조하던 inode도 삭제되어, 심볼릭 링크된 파일은 의미가 없어진다. 따라서, 심볼릭 링크를 시켰을 때는 원래의 파일이 삭제되지 않도록 주의해야 한다.

아래의 예를 보자.

$ cd

$ ln -s /usr/include include

$ ls -l include

 lrwxrwxrwx  1  unix01 unix  12 mar 11:19 include-> /usr/include

$ cd include

$ pwd

 /usr/include

$ cd

$ who > who.list

$ ln -s who.list who.list.link

$ rm who.list.link

cat : 열 수 없습니다.

$ rm who.list.link

"cat : 열 수 없습니다."라는 error 발생하였다.

cp 명령은 별도의 데이터 블럭을 생성하지만,

ln으로 생성된 링크 파일은 원래 파일의 inode를 참조하거나 파일명을 참조할 뿐이며 별도의 데이터 블럭을 생성하는 것은 아니다. 그래서, 공유할 필요가 있는 파일들을 링크하거나 절대경로가 긴 디렉토리를 간편한 이름으로 참조할 경우, 링크를 사용하게 된다.



rm (remove) - 파일 지우기

rm 은 파일을 삭제할 때 사용된다.

사용법은 rm [-Option] filename

Option을 주지 않으면 삭제시 정말 지울 것인가를 물어보지 않고 그냥 지워 버린다.

Option에는,

-i : 정말 지울 것인지 물어본다. (interactive)

-r : sub 디렉토리도 삭제한다. (recursive)

사용 예를 살펴보면,

$ cd

$ touch test

$ rm -i test

마지막 줄의 명령을 입력하면 정말 지울지를 물어본다.







5.MODULE 5


파일 사용 권한이란 ?

unix 시스템의 모든 파일은 소유자가 있다.

예를 들어 $ ls -l

  -rw-r--r-- 1 user3 class 37 jul 24 11:06 f1

 파일

사용 권한

파일 소유자 파일이 속해있는 group

파일 이름

여기서 f1의 소유자(owner)는 user3이다.

소유자는 누가 그 파일에 access (파일 내용을 보거나 수정하는 행위)할 수 있는지를 제어한다. 소유자는 시스템 상의 다른 사용자에게 자신의 파일에 대한 access를 허용하거나 금지할 수 있다. 또한 소유자는 어떠한 group이 그 파일을 access할 수 있는지를 결정할 수 있다.

unix 시스템의 모든 파일은 3가지 access구조를 갖고 있다.

사용자(user): 파일 소유자에 대한 access 권한을 나타낸다.

그룹 (group): 파일이 속해 있는 group에 대한 access 권한을 나타낸다.

기타 (other): 파일 소유자가 아닌 다른 사용자에 대한 부분이다.

예를 들어 다음과 같은 구조가 의미하는 것에 대해 알아보겠다. -rw-r--r--

 또, 3가지 access구조는 각각 read, write, execute권한으로 나누어진다.

파일에 대해, - read권한이 없으면,

파일의 내용을 볼 수 없다( cat이나 more를 할 수 없다).

 - write권한이 없으면,

파일 내용을 수정할 수 없다( vi를 할 수 없다).

- execute권한이 없으면,

파일을 실행할 수 없다.

디렉토리에 대해, - read권한이 없으면,

ls를 할 수 없다.

 - write권한이 없으면,

rename이나 delete를 할 수 없다( rm, mv를 할 수 없다).

- execute권한이 없으면,

cd를 할 수 없다(현재 디렉토리로 할 수 없다).

예를 들어 ls -l 했을 때 f1의 속성이 아래와 같다면,

-rw-r--r-- 1 uses3 class 37 jul 24 11:06 f1

 - f1의소유자인 user3는

파일사용 권한이 “rw_"이기에 read와 write권한만 갖고 있고,

excute권한은 갖고 있지 않다.

즉, read권한이 있기에 cat이나 more등으로 파일의 내용을 볼 수도 있고, write권한으로 내용 수정도 가능하지만,

excute권한이 없기에 실행은 할 수 없다. 

- class group의 사용자들은

read권한만 있기에 f1의 내용만 볼 수 있을 뿐 수정도 실행도 불가능하다.

 - 다른 사용자들(소유자도 아니고 class그룹도 아닌)도 class그룹과 같이 f1의 내용만 볼 수 있을 뿐 수정이나 실행은 불가하다.

또한 memo 디렉토리에 대한 access 권한이 아래와 같다면,

drwxr-xr-x 2 user3 class 1024 jul 24 12:03 memo

 - memo 디렉토리의 소유자인 user3는

그 디렉토리에 대해 rwx권한을 모두 갖고 있기에 ls나 cd가 가능하고 cp나 rm도 가능하다.

 - class그룹은

rx권한이 있기에 ls나 cd는 가능하지만

w권한이 없기 때문에 mv나 rm은 할 수 없다. 

- 시스템의 다른 사용자(others)도

cp나 rm은 할 수 없다.

 예를 들어보자.

$ cd

$ mkdir temp

$ ll -d temp

drwxrwxrwx 2 unix01

$ chmod 100 temp

$ ll -d temp

d__x________ 2 unix01

$ ls temp

temp unreadable

$ chmod 400 temp

$ cd temp

sh: temp: permission denied.

$ chmod 500 temp

$ ll -d temp

dr_x______ 2 unix01

$ cd temp

$ pwd

/home/guest



chmod(change mode) - 파일 사용 권한 바꾸기

chmod명령어는 파일이나 디렉토리의 access권한(사용 권한)을 수정할 수 있게 해 준다. 권한 수정은 소유자나 superuser만이 가능하다.

파일이 삭제되거나 내용이 변경되지 않도록 하려면 그 파일이 있는 디렉토리와 파일에 쓰기 권한을 주지 않아야 한다.

사용법은,

chmod mode_list file...

 여기서,

mode_list : [who[operator]permission][,...]

who : user, group,other or all

operator : +, -, =

permission : read,write,execute

사용 예를 살펴보자.

$ ls -l file1

 -rw-r--r-- 1 user3 class 37 jul 24 11:06 file1

$ chmod g=rw, o= file1

 -rw-rw--- 1 user3 class 37 jul 24 11:06 file1

 group에 대한 권한은 rw로 하고 other는 권한이 없는 걸로 한다.

$ chmod u+x, g-w, o+rwx file1

 -rwx-r--rwx 1 user3 class 37 jul 24 11:06 file1

 user에게는 x 권한 추가하고, group에게는 w권한 삭제, other에게는 rwx권한을 부여한다.

chmod명령은 파일 사용 권한을 지정하기 위해 수치 표현을 지원한다.

read는 4, write는 2, execute는 1로 표현된다.

그리고, rwx 3가지 권한 모두는 7로 표현되고, rw는 6, r은 4로써 나타낸다.

예를 들어보자.

$ cd

$ ls -l > ll.list

$ ls -l ll.list

 _rw_rw_rw_ 1 unix01

$ chmod 777 ll.list

$ ls -l ll.list

 _rwxrwxrwx 1 unix01

$ chmod 440 ll.list

 _r__r_____ 1 unix01

umask - 사용 권한 설정하기

umask명령어는 새로이 생성될 파일의 사용 권한을 설정하게 해준다.

umask명령어는 새로이 생성될 파일에만 적용되기에 기존 파일에는 영향을 주지 않는다.

사용법

umask [mode]

 mode : umask 설정값은 777에서 원하는 사용 권한을 뺀 값으로 설정한다.

예를 들어, 새로이 만들어질 파일의 사용 권한을 r--r--r--(444)으로 설정하려면

$ umask 333 

원래의 default값으로 환원하려면,

$ umask 000

사용 예를 보자.

$ umask 333

$ ls -l > testfile

-r--r--r-- 1 sun01 sun 1256 feb 15 20:34 temp

chown (change owner) - 파일 소유자 변경하기

chown은 파일의 소유자를 변경할 수 있게 한다.

일단 파일의 소유자가 바뀌게 되면, 새로운 소유자나 super user만이 소유자와 mode를 변경할 수 있다.

사용법은,

chown owner[:group] filename...

owner:group을 이용하면 owner와 group을 동시에 변경할 수 있다.

사용 예는,

$ id

 uid=303(user3), gid=300(class)

$ pwd

 /home/user3

$ cp f1 /home/user2/f2

$ ls -l /home/user2/f2

 -rw-r----- 1 user3 class 3967 jan 24 13:13 f2

$ chown user2 /home/user2/f2

$ ls -l /home/user2/f2

 -rw-r----- 1 user2 class jan 24 13:13 f2



chgrp (change group)- 파일 사용자 그룹 변경하기

chgrp명령어는 파일의 사용자 그룹을 변경할 수 있게 해준다.

사용법은 chgrp newgroup filename

사용 예를 보면,

$ chgrp class2 f1 

f1 파일의 사용자 group을 class2로 변경한다.













6. MODULE


vi editor란 ?

vi editor는 unix에서 제공하는 문서편집기이다.

문서편집기이기에 vi editor로 기존 문서를 수정하거나 새로운 문서를 만들게 된다.

vi는 visual의 약자이며 이는 screen상에서 cursor를 움직여가며 편집이 가능하기에 visual이라 붙여졌다.

vi 의 사용법은,

vi [filename]

일단, vi를 실행하고 난 후에 입력되는 키는 모두 명령어로 인식된다.

이 상태를 명령어 mode라고 한다.

명령어를 입력하여 cursor를 움직이고 파일 내용을 지우거나 내용을 삽입하거나 한다.

vi를 실행해 보기 전에 vi를 끝내는 방법을 알아보자.

vi를 이용하여 파일을 편집하고 난 후 끝내려 하면 먼저 입력 mode에서 esc key를 사용하여 명령어 mode로 돌아간다.

(입력 mode란 파일내용을 직접 key-in하고 있는 상태를 의미한다)

명령어 mode에서 :wq 나 :q!를 입력하여 vi를 빠져나가게 된다.

커서 이동 명령어


vi editor내에서 cursor를 이동할 때에는 h (왼쪽으로), j (아래로), k (위로), l (오른쪽으로) key를 이용한다.

정수값을 앞에 주면 원하는 만큼 한꺼번에 이동할 수 있다.

예를 들어, 아래로 5칸 가려면 5j,

오른쪽으로 10칸 가려면 10l을 입력한다.

그러면, home 디렉토리의 파일 목록을 "ll.list"로 저장 후 vi로 열어보자.

$ cd

$ pwd

$ ll > ll.list

$ vi ll.list


화면 스크롤하기

 파일을 편집하고 있을 때, 화면을 스크롤하고 싶을 때가 있게 될 것이다.

이럴 경우 사용하게 되는 key는,

ctrl + f(forward) : 다음 page로 스크롤한다.

ctrl + b(backward) : 이전 page로 스크롤한다.

ctrl + d : 다음 page로 반 page 스크롤한다.

ctrl + u : 이전 page로 반 page 스크롤한다.

g : 파일의 맨 끝으로 간다.

ng :특정 줄 번호로 가려고 할 때 입력한다

(여기서 n은 줄 번호를 의미한다).

예를 들어 파일의 첫 라인으로 가려면 다음과 같이 입력한다. 1g 

입력 mode (i, a, o, o)

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

파일에 문자를 입력하려면 입력 모드로 들어가야 한다.

입력 mode로 만들 수 있는 key를 살펴보자.

a (append)를 입력하면

cursor 뒤로 문자를 입력할 수 있다.

i (insert)를 입력하면

cursor앞에 문자를 삽입할 수 있게 한다.

o (open line)를 입력하면

cursor가 있는 줄 앞으로 빈 줄을 삽입한다.

o (open line)를 입력하면

cursor가 있는 줄 뒤로 빈 줄을 삽입한다.

입력 mode에서 명령어 mode로 돌아가려면 esc key를 눌러야 함을 명심하기 바란다.

예를 들어, cursor 위치가 i 에 있을 때,

quik

a 를 입력하고 " c "를 입력하면 " i "뒤에 " c "를 추가하여 quick으로 만들 수 있다.

문자 삭제하기 - x, dw, dd

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

문자를 삭제해주는 명령에 대해 살펴보자.

다음과 같은 경우에 x 를 입력하면, cursor가 위치한 곳의 문자가 삭제된다.

theere 

 --->  there

3x를 입력하면 cursor가 위치한 곳 부터 문자 3개를 삭제할 수 있다.

maaaany 

 --->  many 

dw(delete word)를 이용하면, 단어를 삭제할 수 있다.

there are too many words. 

 --->  there are many words. 

 dd는 현재의 줄을 삭제한다.

ndd는 n개의 줄을 삭제한다.

text 옮기기 - p, p

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

text를 옮기는 방법은 다음과 같다.

text를 옮기려면 먼저 옮기려는 text를 삭제한다.

text를 삭제할 때마다 그 내용이 임시버퍼에 저장된다.

그런 다음, 옮기려는 위치로 커서를 이동하고 나서 p(paste)를 입력하면 text가 옮겨지게 되는 것이다.

예를 들어, too라는 글자를 문장의 맨뒤로 옮겨보자. there are too many words 

일단 dw를 입력하여 옮기고자 하는 내용을 삭제한다. there are many words 

삭제된 내용은 버퍼에 복사되고 이와 같은 문장이 된다.

there are many words too 

커서를 문장의 끝으로 옮기고 난 후 p를 입력하면 text가 붙여진다.

소문자 p(paste)는 cursor뒤에 오려 붙이기하고,

대문자 p는 cursor 앞에 붙이기를 한다.

또 다른 예로, 특정 line 3개를 옮기고자 한다.

line1

line2

line3

line4

line5

먼저 3개의 line을 지운다(3dd),

line4

line5 

그런 다음 옮기고자하는 위치로 cursor 를 옮기고 난 후, p를 입력하면,

line4

line5

line1

line2

line3

text copy하기 - yw, yy

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

y ( yank)명령은 지정된 text를 버퍼에 복사한다.

yank의 사전적 의미는 "확 잡아 당기다"이다.

yw는 단어를 복사하고,

yy는 줄을 복사한다.

예를 들어, 2개의 line을 복사하려고 한다면,

먼저 복사하고자 하는 곳에 cursor를 두고 2yy한다. line1

line2

line3

line4

다음으로 복사될 곳으로 cursor를 옮긴 후, line1

line2

line3

line4

p를 입력하면 (paste), 아래와 같이 text가 복사된다. line1

line2

line1

line2

line3

line4

 text 변경하기 - r, r, cw

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

일단, 문자를 입력하고 삭제하는 방법을 알게 되면 어떤 식으로라도 문자를 변경할 수 있긴하다. 그러나 명령어 mode와 입력 mode를 왔다갔다 해야하기에 불편하다고 할 수 있다.

r, r, cw를 사용하면 text의 일부를 간편하게 변경할 수 있다.

예를 들어 아래처럼 수정하려고 한다.

must important 

 --->  most important

먼저, 수정하고자 하는 문자에 아래와 같이 cursor를 위치하고 must important 

r (replace)명령을 입력한 후, "o"를 타이핑하면 "u"가 "o"로 수정된다.

most important

대문자 r로 수정하면 esc로 빠져 나올 때까지 수정할 수 있다.

그러니까, 다음과 같은 경우 대문자 r 명령을 입력하고, "difficult situation"을 입력한 후, esc로 빠져 나오면 아래와 같이 수정된다.

more important thing 

 --->  more difficult situation 

r 이나 r 이외에 cw(change word)는 현재 커서가 있는 위치의 단어를 변경하게 해준다.

그리고, cc 명령어는 커서가 위치한 라인을 지우고 달리 작성할 수 있게 한다.

ex 명령어

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

vi editor 내에서의 명령어 mode에서는 " : "으로 시작하는 ex명령어를 실행할 수 있다.

ex명령어를 살펴보면,

:w file_name 현재의 작업중인 내용을 file_name으로 저장한다.

 :q (quit) vi editor를 끝내고 쉘 프롬프트로 돌아간다.

 :q! vi editor를 강제로 끝내고 쉘 프롬프트로 돌아간다(편집중인 내용을 버린다).

 !쉘 명령어 쉘 명령어를 실행한다.

 :e file_name 현재 작업중인 내용을 버리고 file_name이라는 파일을 open한다.

 :set nu 각 line 앞에 번호를 붙여 보여준다.

 :set nonu set nu를 취소한다.

 :r file_name 현재의 cursor 뒤에 file_name의 내용을 읽어 들인다(read).

 zz 파일을 디스크에 저장하고 쉘프롬프트로 돌아 간다.

 text 찾기 - /, n, n

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

파일을 편집, 수정할 때 특정 문자열을 찾을 필요가 있다. 이때 사용하는 명령어가 " / "이다.

/ 를 입력한 후 찾고자 하는 text를 입력하면 현재 위치에서 파일 끝을 향하여 검색한다.

n (next)명령은 검색을 계속하게 한다.

n (next)명령은 역방향으로 검색을 계속한다.

“/”로 특정 문자열을 검색할 때 현재 위치에서 파일 끝까지 검색하여 발견되지 않으면, 파일 처음부터 검색을 계속한다.

검색을 하고자 할 때, 경우에 따라 대소문자 구별없이 찾고자 할 때가 있다. 이럴 땐, /[tt]he 처럼 검색하면, the와 the 모두를 찾을 수 있다.

text의 대치 - s, ns, s

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

s

s 명령어는 현재 위치의 문자를 esc를 누를 때까지 하나 이상의 문자로 대치할 수 있게 한다.

예를 들어보자.

파일 중 한 라인이 아래와 같고 커서의 위치가 다음과 같다고 할 때,

this is test file !

s 명령어를 입력하고 “from lee"를 타이핑 후 , esc키를 누르면,

this is test file from lee 

라고 변경된다.

ns

n은 숫자를 의미하며, 입력된 숫자만큼의 문자들이 대치된다.

s(대문자)

라인 전체를 대체할 수 있게 한다.

u

커서가 위치하고 있는 라인에서의 모든 변경사항을 취소한다(undo).

u

바로 전의 변경사항을 취소한다.

.직전의 편집내용을 취소한다.

. 명령어는 redo명령어이며 여러 장소에서 동일한 작업을 수행하고자 할 때 매우 유용하다.
















UNIX Fundamentals



unix는 1969년에 bell 연구소에서 개발하였다.

당시 bell 연구소는 전화회사였기에 software에는 관심이 없어서 그랬는지, software를 판매하기 힘들어서였는지, unix를 source code와 함께 여러 대학에 거의 헐값으로 제공하였다.

unix를 제공받은 대학 중 버클리대에서 수많은 학생들이 unix에 여러 기능을 추가하였고 충분히 개발되었다고 느꼈는지 1977년에 bsd (berkeley software distribution) version의 unix를 발표하기에 이른다.

한편 bell 연구소(at&t)에서도 unix를 계속 개발하여 1979년에 unix를 상용화하여 발표하였다.


이후 unix는 크게 두 가지 종류 즉, at&t unix와 bsd unix로 나뉘어져 발전되었다. 이렇게 unix가 두 가지 길로 나뉘어져 각자의 길을 걷게 되자, unix 사용자들은 큰 혼란을 겪게 되었고 호환성이 결여되어 간다는 문제점이 제기되었다. 그리하여 bsd와 system v(at&t의 unix)를 합하여 system v release 4(svr4)가 탄생하게 되었다.

오늘날 널리 사용되고 있고 대표적으로 사용되고 있는 unix는 sun microsystems의 sunos와 solaris, hp사의 hp-ux 그리고 ibm사의 aix와 silicon graphics의 irix등이 있으며, 이들 unix들은 bsd와 system v에 기초를 두고 나름대로의 기능들을 추가하여 독자적인 이름을 붙인 것들이다.

sunos는 bsd계열의 unix이고 solaris는 system v계열, hp-ux도 system v계열의 unix이다. 이외에는 pc version의 unix로 ms사의 xenix가 있다.



명령어 사용법 (syntax)


쉘 프롬프트

unix 시스템에 접속하게 되면 $나 %를 만나게 된다.

$나 %를 쉘 프롬프트라고 부르며 쉘 프롬프트는 명령을 받아들일 준비가 되었음을 의미한다.


간단한 명령을 입력해 보기 전 명령어 사용법에 대해 알아보자.

명령어 사용법은 아래와 같다.

명령어 [-Option] [argument] 


브라켓( [ ] )으로 표현된 부분은 입력해도 되고 안해도 된다.

이 부분을 굳이 입력하지 않아도 명령 실행에는 지장이 없다는 뜻이다.

명령어 자체는 당연히 입력해야 하므로 브라켓으로 표현되어 있지 않다.

빈 칸은 명령어와 Option, 그리고 argument( 인수)를 구분하는데 사용된다.

Option은 대개 하이픈( - )으로 시작된다


cal (calendar) - 달력 출력하기


cal 명령어는 달력을 보여준다. 인수를 지정하지 않으면, 현재의 달에 대한 달력을 출력해 준다.

cal [month [year]]


clear - 화면 지우기

clear는 현재의 터미널 출력 버퍼 내용을 지워서 터미널 스크린을 지워준다.

dos의 cls 명령과 같다.


sleep

sleep명령은 주어진 시간 동안 잠시 프로세스 수행을 멈춘다.

시간 단위는 초이다.

사용법을 살펴보면,

sleep time

 사용 예는,

$ sleep 10 ; cal 1997 

- 10초 동안 멈춘 후 cal 1997을 실행한다.




uname (unix name)

uname은 현재 사용중인 unix 시스템에 대한 정보를 알려준다.

사용법은,

uname [-Option]

 Option에서 -a 를 입력하면 모든 정보를 볼 수 있다.

정보에는 unix이름, unix version, 현재 사용중인 hardware 이름, host 이름 등이 있다.

사용 예를 보면,


$ uname -a

hp-ux edu00 b.10.20 a 9000/715 2013527418 two-user license

 - hp-ux 는 unix 이름이며,

- edu00 은 host 이름,

- b.10.20 은 버전을 나타내고,

- 9000/715 는 hardware 이름을 의미한다.


stty (set tty)

stty 명령을 이용하면 현재의 표준 입력 장치에 대한 터미널 입출력 옵션을 보거나 설정할 수 있다.

사용법을 살펴보면,


stty [argument]

 인수 없이 사용하면 현재 설정되어 있는 옵션 사항을 알 수 있다.

현재 설정되어 있는 값들의 일부가 아래와 같을 때,

intr = ^c : 현재 프로세스를 중지시킬 때. ctrl + c를 사용함.

kill = ^u : 명령어 입력에서 현재의 line을 취소할 때. ctrl+u를 사용함.

stop = ^s : 표준 출력을 잠시 멈출 때. ctrl + s를 사용함.

이미 설정되어 있는 입출력 옵션을 변경하는 예를 들어보자.

$ stty erase ^h 

- 명령어 입력시 한 글자를 지울 때 ctrl + h를 사용하도록 설정함.

$ stty -isig 

- 특수 제어 문자를 검사하지 않는다.

$ stty isig 

- 특수 제어 문자를 검사하게 한다.

$ stty -echo 

- 입력되는 문자가 화면에 나타나지 않게 한다.

$ stty echo 

- 입력되는 문자를 화면에 나타나게 한다.



커널 (kernel) 이란?

커널이란 운영체제의 일부분으로 운영체제의 핵심을 이루는 부분이다.

커널은 메모리에 상주하면서 시스템에 존재하는 자원을 관리한다.

커널은 디스크에 파일로써 존재하는 프로그램이며, 시스템이 기동될 때 boot 프로그램에 의해 구동되며 메모리에 상주하게 된다.

unix 시스템에서의 자원은 cpu, memory, 디스크, 단말기 , 네트워크 등이 있다.

커널은 사용자가 구동시킨 응용프로그램에 의해 발생되는 프로세스가 요구하는 여러 가지 요구사항에 대해 서비스를 제공한다.

예를 들어 프로세스가 임의의 파일에 데이터를 쓰도록 요구했다면,

write 시스템콜을 호출하게 되고, 호출이 성공하면 파일 시스템 관리 모듈을 거쳐 인덱스 노드 테이블의 정보를 참조해서 디바이스 드라이버를 통해서 데이터를 단말기에 출력하게 된다.


 쉘 (shell) 이란?

쉘이란 명령어 해석기라 할 수 있다.

커널과 쉘을 그림으로 표현하면,


 쉘은 user가 입력하는 명령어를 해석하여 그 해석된 명령을 운영체제인 커널(kernel)로 전달하는 역할을 한다.

unix에서 기본적으로 제공하는 쉘에는 bourne 쉘, c 쉘, korn 쉘이 있다.

이러한 쉘들은 모두 실행 파일 형태로 disk에 저장되어 있다.

bourne 쉘은

- unix에서 최초로 만들어진 쉘이며,

- bourne이 만들었기에 bourne 쉘이라 부르며,

- /usr/bin 아래에 sh라는 이름으로 존재한다.

- 시스템이 기동될 때 /etc 밑에 있는 여러 파일들을 참조하는데

 이러한 파일들이 bourne 쉘 문법으로 작성되어 있다.

c 쉘

- bill joy가 만들었다고 한다.

- /usr/bin 아래에 csh라는 이름으로 존재하며,

- bourne 쉘의 기능에 alias, history 등의 기능을 추가하였다.

- c 쉘의 프롬프트는 % 기호로 나타난다.


korn 쉘

- korn이 만들었다.

- c 쉘에 대응하기 위해 bourne 쉘을 개선하여 만들었다.

- /usr/bin 아래에 ksh 라는 파일명으로 되었다.

- korn 쉘의 프롬프트는 $ 로 나타난다.



unix 시스템에서는 모든 것이 파일로 관리된다.


디렉토리도 파일이고

일반 문서인 text 도 파일이며

하드웨어 장치마저도 파일로 존재한다.

실행 가능한 프로그램도 파일이고

커널인 os도 파일로 되어 있다.

일반적인 파일의 종류에는,

text 파일도 있고

이미지 파일도 있으며

cad data 도 있다.

그리고 실행 가능한 프로그램도 있다.

 - 실행 가능한 프로그램은 컴파일된 프로그램(cp, man등) 과

 - 일반 text 파일 형태로 되어 있는 쉘 script 가 있다

  (쉘 script는 9장에 자세히 설명되어 있음).

특수 파일의 종류에는,

디렉토리와

장치 파일이 있다.

장치 파일은 커널과 하드웨어 사이의 interface를 제공하며 어떤 실제 data가 기록되어 있는 것은 아니다. 이러한 장치 파일은 /dev 밑에 존재한다. cd 명령으로 /dev로 가서 ls -l 로 장치 파일에 대해 살펴보자.


파일 이름에서

unix 시스템에서 파일 이름은

시스템에 따라 256자까지 부여할 수 있으며, 통상 14자까지 가능하다고 볼 수 있다.

unix는 대소문자를 구별하기 때문에 파일 이름에서 file 이나 file 또는 file이 모두 별개의 파일로 인식된다.

예를 들어보자. root로 가서 ls u* 해 보자.

$ cd /

$ ls u*

 그러면 root 아래에 있는 u로 시작하는 모든 파일의 목록이 화면에 나타난다.

파일 이름을 지정할 때 특수 문자를 사용하면 편리하다.

쉘은 명령어를 처리하기 전에 이러한 특수 문자를 우선적으로 변역한다.

이렇게, 쉘에게 특수한 의미를 부여하는 문자에는,


쉘에서 *나 ?등의 특수 문자를 사용하려면 역슬래쉬(\)나 따옴표를 붙여서 사용한다.

예를 들어서, $ ls ???

 파일 이름이 세 문자인 파일의 목록을 보여준다.

$ find / -name [rr]eport

 파일 이름이 report나 report인 파일을 찾는다.

$ ls a*

 파일 이름이 a로 시작하는 모든 파일의 목록을 보여준다.

$ rm [abc]??


파일 이름이 a나 b나 c로 시작하면서 세 문자인 파일을 삭제한다.


파일 관리 명령어


pwd (print working directory) - 현재 디렉토리 확인하기

unix 시스템에 log-in 한 이후에는 시스템의 어느 한 디렉토리에 있게 된다.

현재 위치의 디렉토리를 현재 디렉토리 또는 작업 디렉토리라고 한다.

현재 어느 디렉토리에 있는지를 확인하려면

$ 프롬프트에서 pwd를 입력한다.

pwd는 현재 디렉토리의 절대경로명을 보여준다.


split - 파일 분할하기

split 명령을 이용하면 큰 텍스트 파일을 여러 개의 작은 텍스트 파일로 만들 수 있다.

사용 형식을 살펴보자.

split -n big_filename new_name

 -n은 라인 수를 의미한다.

big_filename을 주어진 라인수로 잘라 new_name 뒤에 aa부터 zz까지 순차적으로 파일을 생성한다.

예를 들어보자.

$ split -10 /etc/passwd pass

$ ls pass*

 passaa passab ....

$ cat passaa

첫번째 명령에 의해 /etc/passwd를 10라인씩 잘라 passaa., passab라는 이름으로 저장한다.

cat passaa 명령에 의해 파일 내용을 확인해 본다.


cut - 파일 필드 추출하기

cut명령은 특정 형식의 파일에서 원하는 칼럼 및 필드를 추출할 수 있다.

사용법은,

cut -c칼럼 리스트 filename

cut -f필드 리스트 -d필드 구분자 filename

예를 살펴보자.

$ who >who.txt

$ cut -c1-8 who.txt > logname.txt

$ cat logname.txt

root

unix01

.첫번째 줄의 명령에 의해 who 명령의 결과를 who.txt라는 파일로 저장한다.

두번째 줄의 명령에 의해 who.txt의 1칼럼에서 8칼럼까지를 잘라서 logname.txt라는 파일로 저장한다.

$ cut -c10-18 who.txt > terminal.txt

$ cat terminal.txt

ttyp1

ttyp2

.

who.txt의 각 라인의 10칼럼에서 18칼럼까지를 잘라서 terminal.txt에 저장한다.

$ who | cut -cl0-18 > terminal2.txt

$ who | cut -c1-8,18- > logintime.txt

$ cat logintime.txt

root 4월20일 06:30

unix01 4월 21일 07:30

.첫번째 cut 명령에 의해 who 명령의 결과를 입력으로 받아 10칼럼에서 18칼럼까지를 자른 결과를 termianl2.txt라는 파일로 저장한다.

두번째 cut 명령에 의해 who 명령의 결과에서 1칼럼에서 8칼럼까지와 18칼럼 이후로 추출하여 logintime.txt라는 파일로 저장한다.

$ cut -d: -f1 /etc/passwd >name.passwd

$ more name, passwd

root

daemon

.cut 명령에 의해 /etc/passwd 파일에서 필드 구분자(delimeter)는 ":"으로 하고 첫번째 필드를 추출하여 name.passwd라는 파일로 저장한다.

$ cat /etc/passwd | grep unix | cut -d : -f1,3 > passwd.unix

 /etc/passwd 의 내용에서 unix라는 단어가 들어가는 라인을 추출하고 그 라인에서 필드 구분자를 “:” 으로 하여 첫번째 필드와 세번째 필드를 추출하여 passwd.unix라는 파일로 저장한다.


paste - 필드 결합하기

paste 명령은 여러 개의 파일을 조합하여 레코드 형식으로 보여준다.

사용법을 살펴보면,

paste -d필드구분자 filelist

 예를 들어보자.

$ cat a

 unix01

 unix02

 unix03

$cat b

 201

 202

 203

$cat c

 200

 200

 200

 위와 같이 파일 a, b, c가 있다고 할 때,

딜리미터(필드구분자)를 “:”로 하여 파일a,b&c의 내용을 파일abc로 만드는 예제는 다음과 같다. $ paste -d: a b c > abc

$ cat abc

unix01:201:200

unix02:202:200

unix03:203:200

 paste 명령은 기존의 여러 파일을 결합하여 새로운 구조의 데이터베이스 파일을 생성해낼 수 있으며, 각 필드를 구분하는 필드 구분자도 새롭게 지정가능하다.


wc (word count) - 파일 내의 문자 숫자 정보 얻기

파일내의 라인 수, 단어 수, 문자 수에 대한 정보를 알고자 할 경우에 wc 명령을 사용한다.

사용법은 아래와 같다.

wc [-Option] filename

 여기서 사용되는 Option은,

-l : 라인수 (line)

-w : 단어수 (word)

-c : 문자수 (charactor)

예를 들어보자.

$ cd

$ who > who.list

$ wc who.list

6 30 222 who.list

 세번째 줄의 wc 명령에 의해 나타나는 결과의 의미는 다음과 같다.

who.list의 줄 수는 6, 단어 수는 30, 글자수는 222이다.

$ ls /etc | wc -l

/etc 내의 파일 개수를 알 수 있게 한다.


grep- 특정라인 추출하기

grep 명령은 쓰임새가 다양하고 자주 사용되는 명령어이다.

grep은 주어진 문자열로 하나 이상의 파일 내용을 라인 단위로 검색하여 준다.

사용법을 살펴보자.

grep [-Option]‘pattern’ [file..]

 여기서 사용되는 Option은,

-i : 대·소문자를 구별하지 않는다.

-n : pattern을 포함하고 있는 라인을 라인 번호와 함께 보여준다.

-v : pattern이 들어 있지 않은 줄들을 보여준다.

예를 보기로 하자.

$ cat filea

 aaabbbccc

 aaaccc

 bbb

$ grep “bbb” filea

 aaabbbccc

 bbb

$ ps -ef | grep unix

$ ps -ef | grep unix | grep sh

grep 명령에 의해 filea에서 bbb가 있는 라인을 추출하여 보여준다.

특수 문자를 이용하여 패턴(문자열)을 지정할 경우는 쉘이 분석하는 것을 막기 위해 인용 부호를 붙여 주는 것이 바람직하다.

첫번째 ps 명령에 의해 전체 프로세스 목록 중에서 “unix”가 있는 라인들을 추출한다.

두번째 ps 명령에 의해 "unix"를 포함한 라인을 추출한 결과에서 sh를 포함하고 있는 라인을 추출하여 화면에 보여준다.


sort - 파일 내용 정렬하기

sort 명령어는 지정한 텍스트 파일의 각 라인을 정리하여 보여준다.

사용법을 살펴보자.

sort [-Option] [field number] [file..]

여기서 사용되는 Option은,

-n : 숫자 값을 기준으로 정렬한다. (number)

-r : 정렬 순서를 역으로 한다. (reverse)

-tx : 필드 구분자를 x로 한다. (treatment)

-f : 대소문자 구별없이 정렬한다.

예를 들어보면,

$ who | grep unix | sort

who 명령의 결과 중 각 라인에서 unix가 들어가는 라인을 정렬하여 보여준다.

$ sort -nt: -k3 < /etc/passwd

/etc/passwd 파일을 “:”를 필드 구분자로 하고 세번째 필드를 기준으로 하여 숫자 기준으로 정리하여 보여준다. (본 명령은 hp-ux의 posix 쉘에서만 실행 가능하다.)

검색 패턴 지정시 자주 사용하는 특수 문자들에는,

 *   0개 이상의 문자들과 대체함.

( f*t 라고 하면 f로 시작하고 t로 끝나는 모든 문자열을 검색한다.)

  [ ]   [ ]안의 한 문자와 대치함.

( [aa]ge는 age나 age를 검색하게 한다.)

  ^   라인의 처음만 검색하게 함.

  $   라인의 끝만 검색하게 함.


 .   한 문자와 대치함.

( b.t는 가운데 하나의 문자가 어느 것이어도 됨을 의미한다.)


 uniq - 중복 라인 검사하기

uniq 명령어는 특정 파일의 데이터에서 연이어 중복된 라인이 있는지를 검사해, 중복된 라인은 한 줄만 출력해주고 중복되지 않은 라인은 정상 출력해준다.

이 때 주의할 점은 uniq 명령은 연이어 들어있는 중복된 라인만을 검사할 수 있으므로 파일 내에서 서로 떨어져 있는 중복 라인들을 검사하려면 sort로 정렬하여 검사해야 한다.

uniq 명령의 Option 중 -d는 중복된 라인만을 출력해준다.

예를 들어보자.

$ who | cut -cl-8 | sort > who.lst

$ cat who.lst

root

root

unix 01

·who 명령의 결과에서 칼럼1과 칼럼8 사이를 추출하고 정렬하여 who.lst 파일로 저장한다.

$ uniq who.lst

root

unix01

$ uniq -d who.lst

두번째 uniq 명령은 중복된 라인만을 볼 경우 사용된다.

compress 와 uncompress - 파일 압축하기와 압축풀기

compress

compress 명령은 지정된 파일을 압축하여 기존의 파일명 뒤에 .z 라는 확장자를 붙여준다.

사용 예를 보자.

$ who > who.list

$ compress who.list

$ ls who*

 who.list.z

압축된 파일의 내용을 보려면 zcat이라는 명령어를 사용한다.

uncompress

uncompress명령은 compress로 압축된 파일들을 다시 풀어준다.

압축이 풀리면 .z 파일은 없어진다.

사용 예를 보자. $ uncompress who.list.z

$ ls -s who*

 압축 : pack 보다는 compress 가 효율이 좋다.

DESCRIPTION

      pack attempts to store the specified files in a compressed form.

      Wherever possible, each input file name is replaced by a packed file

      name.z with the same ownership, modes, and access and modification

      times.  The -f option forces packing of name.  This is useful for

      causing an entire directory to be packed even if some of the files do

      not benefit.  If pack is successful, name is removed.  Packed files

      can be restored to their original form using unpack or pcat.

# pack / unpack : .z

$ pack passwd

$ pcat passwd

$ unpack passwd.z

# pcat :


 

# compress / ucompress : .Z


# zcat :

30일 이전에 억세스된 파일 중 *.c를 찾아 ls -l 한다.

$ cd /

$ find . -name core -exec rm -i {} \;

 현재 디렉토리 밑에서 이름이 core인 파일을 찾아 지운다(지우기 전에 정말 지울 지를 물어본다.)


tar (tape archive 와 restore) - 파일 백업·복원하기

tar 명령은 특정 디렉토리 아래의 모든 파일을 하나의 파일로 묶어준다.

또한, 특정 디렉토리 아래의 모든 파일을 테이프로 백업해주기도 하고 테이프에 기록된 파일을 디스크로 복원(restore) 해 주기로 한다.

명령어의 사용법을 살펴보면,

tar -key [f device_file] [file....]

 여기서 key는,

-c : 새로운 tar 파일이 만들어진다(create).

-x : tar 파일에서 추출한다(extract).

-t : tar 파일에 기록된 파일의 목록을 출력시킨다(title).

-v : 백업하거나 복원할 때 파일 이름을 화면에 보여준다(verify).

예를 들어,

디스크의 파일을 테이프로 백업하려면,

$ tar -cvf /dev/rmt/0m filename

테이프에 기록된 파일들의 목록을 보려면,

$ tar -tvf /dev/rmt/0m

테이프에 백업된 파일들을 디스크로 재저장하려면,

$ tar -xvf /dev/rmt/0m filename


입출력의 재지정에 대하여

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

출력의 재지정

쉘 명령어의 대부분은 명령 실행의 결과를 화면으로 출력한다.

ls 나 who 등이 그 예이다.

그러나, 명령 실행 결과를 화면으로 보내지 않고 파일로 저장할 수가 있는데, 이런 것을 출력의 재지정이라 한다.

입력의 재지정

쉘 명령어의 대부분은 키보드에서 입력을 받는다.

write, cat등이 좋은 예가 될 것이다.

입력의 경우에도 표준 입력 장치인 키보드로부터 입력받지 않고 파일로 입력 받을 수가 있으며, 이런 걸 입력의 재지정이라 한다.


입력의 재지정 ( < )

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

표준 입력으로부터 입력을 받는 경우, “<”를 사용하여 그 입력이 키보드대신 파일로부터 오도록 재지정할 수 있다.

입력을 재지정하는 예를 들어보자.

$ cat letter

 hello ! my name is lee

$ mail unix 01 < letter 

unix 01 이라는 사용자에게 전자 메일을 보내는데 편지 내용을 키보드가 아닌 파일로 입력한다.


출력의 재지정 ( > 와 >> )

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

대부분의 명령어들이 실행 결과를 화면으로 보내지만,

명령어 실행시 “>”와 파일 이름을 주어 출력을 모니터가 아닌 파일로 할 수 있다.

“>>”를 사용하면 기존 파일에 내용을 추가할 수 있다.

출력을 재지정하는 예를 들어보자.

$ date > date.out

$ cat date.out

$ who >> date.out 

>> 를 사용하면 기존 파일에 실행 결과를 추가(append) 한다.


파이프라인 (pipeline)

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

쉘이 제공하는 또 다른 특징 중에 파이프라인 ( | )을 통해 몇 개의 명령어들을 링크할 수 있다.

파이프라인을 사용하면 한 명령의 결과를 직접 다른 명령의 입력으로 전송할 수 있다.

파이프 라인을 사용하는 예를 들어보자.

$ who | grep user | grep unix 

who 명령의 결과가 grep user의 입력이 되고

grep user의 결과가 grep unix의 입력이 된다.

그래서, 현재 log-in중인 사용자 중에서 user와 unix라는 단어와 연관있는 사용자를 살펴볼 수 있다.

$ ps -ef | grep unix 

현재 실행중인 프로세스 중에서 “unix"라는 단어와 관련 있는 프로세스를 보여준다.


talk - 1 대 1로 대화하기

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

unix는 multiuser 시스템이기 때문에 한 시스템에 여러 user가 들어와 있을 수 있다. unix에서는 이러한 user들 사이에 통신할 수 있는 명령어들을 제공하고 있으며, network를 통해 다른 사람의 computer에도 들어갈 수 있는 명령어도 제공한다.

같은 computer를 사용하고 있는 다른 user와 1:1통신을 하려면 talk명령을 사용한다.

talk 명령으로 1:1 통신을 하는 방법은 다음과 같다.

먼저 시스템에 누가 들어와 있는지 확인한다.

$ who 

대화를 신청한다. $ talk username

talk명령이 수행되면 본인의 화면이 수평으로 분할되며 상대편이 응답할 때 까지 기다려야 한다.

만일 상대편이 log-in중이 아니라면,

“your party is not logged on”이란 message가 화면에 나타난다.

talk 명령으로 대화를 요구 받게 되면 화면에 대화를 요구한다는 message가 나타난다.

이 때 다음과 같이 대화 요구에 응답하면,

$talk 대화요구한 user_name

화면이 수평 분할 되면서 화면 상단에 연결되었다는 message가 출력된다.

[connection established]

이제, 각 사용자는 key입력을 할 수 있고 입력되는 문장은 상대편 화면의 하단에도 나타난다.

대화를 종료하려면 종료 인사를 보낸 후 ctrl+c로 talk program을 끝낸다.


write - message 전송하기

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

write명령은 다른 사용자에게 message를 보낼 때 사용하고, 여러 명에게도 보낼 수 있다.

(비교 : talk 명령은 1대1로 서로 대화할 때 사용하며, 여러 명이 동시에 사용할 수 없다)

message의 내용은 미리 작성해 놓은 파일로 보낼 수도 있고 직접 입력하여 보낼 수도 있다.

write 명령을 사용하여 message를 보내는 방법은 다음과 같다.

1. who 명령으로 현재 누가 log-in하여 있는지를 확인한다.

2. 쉘 프롬프트에서 다음과 같이 입력한다.

$ write username

3. 보낼 message를 typing하고 ctrl + d로 빠져 나온다.

4. message가 상대편에게 송신된다.

만일 보낼 message를 파일로 만들어 놓았다면 입력의 재지정(<)을 이용하여 아래처럼 입력하여 메시지를 송신할 수 있다.

$ write username < filename


여러 명에게 message를 보내려면,

$ write username1 username2 < filename

 mesg - message 수신 여부 설정

write로 message를 보내면 상대편 화면에 바로 message의 내용이 출력된다. 때로는 message를 받고 싶지 않을 때가 있는데, 이 때 사용하는 명령어가 mesg이다. 예를 들어 vi로 어떤 문서를 편집하고 있을 때 message를 받으면 화면이 엉망이 되어 버린다.

message 수신을 거부하려면,

$ mesg n


현재의 자신의 설정 상태가 message 수신 허용 상태인지 거부 상태인지를 보려면,

$ mesg

 is n

 mesg를 n으로 설정해 놓은 사용자에게 message를 보내려 하면 다음과 같은 error가 출력된다.

“permission denied”



mail - 전자 우편 보내기

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

mail

mail명령은 등록되어 있는 user에게 편지를 보낼 수 있게 하여, 상대편의 log-in 여부에 관계없이 편지를 보낼 수 있게 한다.

( 비교 : talk, write 그리고 wall 명령은 대화를 나눌 상대편이 on-line (log-in한 상태) 되어 있어야 한다. )

mail명령도 write명령처럼 "$ mail username"하면 직접 key-board로 입력하여 편지를 보내게 된다.

편지내용을 끝내려면 ctrl + d를 입력하면 된다.

이렇게 보내진 편지는 dead.letter 라는 이름으로 보관된다.

이미 작성해 놓은 파일을 이용하여 편지를 보내려면,

$ mail username < filename

 편지를 받게 될 사용자는 다음 log-in할 때 mail이 왔다는 message를 보게 된다.

“you have new mail.”

받은 편지를 보려면, 다음과 같이 입력한다.

$ mail

받은 편지들은 /var/mail 디렉토리에 log-in name과 동일한 이름으로 저장되어 있기에, cat이나 more등으로도 내용을 확인할 수 있다.


wall

wall은 통상 시스템에 log-in한 모든 사용자에게 메시지를 보낼 때 사용한다.

그래서, 시스템을 셧다운할 경우 등에 사용된다.

사용법을 살펴보면,

wall [-group name] [file]

wall명령어도 write와 마찬가지로 표준 입력 장치인 키보드로부터 입력을 받을 수도 있으며, 파일을 입력 내용으로 할 수도 있다.


telnet - 원격 host 에 접속하기

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

telnet을 이용하면 원격host로 접속할 수 있다.

원격 host로 접속한다는 것은 네트워크로 연결되어 있는 다른 컴퓨터로 log-in한다는 것을 의미한다.

사용법을 살펴보면,

telnet ip_address(원격host)

일단 연결되면 원격host에서 제공하는 login 프롬프트가 화면에 나타난다.

“login : ”프롬프트에 원격 host에 등록되어 있는 사용자명을 입력한다.

“password :” 프롬프트에 사용자의 암호를 입력한다.

정상적으로 입력하면 타 시스템에 log-in되어진다.

초기 화면은 생소하게 느껴질 수도 있으며 처음에 할당되는 login 쉘은 원격 시스템의 설정 상태에 따라 bourne 쉘 이나 c 쉘 또는 korn 쉘 일 수 있다.

telnet이 성공적으로 수행되면 자신이 마치 다른 컴퓨터 앞에 앉아 있는 것처럼 정확히 연결된다.

원격 host와의 접속을 해제하려면, 다음과 같이 입력한다.

exit 


ftp (file transfer protocol) - 파일 송수신하기

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

다른 computer와 파일을 주고 받을 때에는 ftp (file transfer protocol)를 사용한다.

물론 telnet으로 접속한 후 파일을 가져올 수도 있으나, telnet은 서로의 hostname이 등록되어 있어야 하는 등 불편한 점이 있지만, ftp는 편리하고 쉽게 파일 전송을 가능하게 해준다.

사용법을 살펴보면,

ftp [ip_adderss]

일단 ftp로 접속을 하게 되면 원격host에 등록되어 있는 user이름과 password를 입력해야 한다.

log-in이 성공적으로 수행되면,

“username logged in”이라는 message와 함께

“ftp>”프롬프트가 화면에 보여진다.

비록 “ftp>”라는 프롬프트가 화면에 보여지더라도

“username logged in”이라는 message가 없으면

log-in에 실패한 것이다.

log-in에 실패하면 다음과 같이 log-in을 재시도한다. ftp> user username

“ftp>”프롬프트에서는 ftp명령어들이 수행되어지며

ftp명령어들이 무엇이 있는지는 help 또는 ? 로 확인해 볼 수 있다.

자, 그럼 ftp 명령어들에는 무엇이 있고 어떤 역할을 하는지 살펴보자.

원격 시스템에서의 현재 디렉토리 위치를 확인하려면,

ftp> pwd

local 시스템, 즉, 본인의 computer에서의 현재위치를 확인하려면

ftp> !pwd

원격 시스템 내에서 현재 디렉토리를 변경하려면,

ftp> cd 대상디렉토리

본인의 computer 내에서 변경은,

ftp> lcd 대상디렉토리

원격 시스템의 파일 목록을 보려면,

ftp> ls

본인 시스템의 파일 목록을 보려면,

ftp> !ls

ascii mode로 전송하려면,

ftp> ascii

이진 mode (binary)로 전송하려면,

ftp> bi

하나의 파일을 전송할 때,

ftp> put file_name

하나의 파일을 가져올 때,

ftp> get file_name

여러 개의 파일을 보낼 때는,

ftp> mput file_names

여러 개의 파일을 가져오려면,

ftp> mget file_names


ftp를 끝낼 때는,

bye나 quit를 사용한다. 


프로세스의 이해

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

프로세스란 현재 실행되고 있는 프로그램을 말한다.

임의의 프로그램이 실행되어, 프로그램의 코드와 데이터가 메모리에 load되고 프로그램이 수행되기 위한 기본적인 환경이 설정되었을 때, 프로세스가 생성되었다고 한다.

프로세스를 생성시킨 프로세스를 부모 프로세스(parent process), 생성된 프로세스를 자식 프로세스(child process)라고 한다.

어떤 실행 파일은 구동되면서 2개 이상의 프로세스를 발생시키는 경우가 있다. 이러한 다중 프로세스를 생성하려면 프로그램에서 fork( )라는 시스템콜을 호출한다.


ps 명령어 (process status)

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

시스템에서 시작되는 모든 프로세스는 프로세스 id(pid)라는 고유한 식별 번호를 부여 받는다. ps 명령은 시스템에서 현재 실행중인 프로세스에 대한 정보를 pid와 부모의 pid(ppid)를 포함하여 표시한다.

사용법을 살펴보면,

ps [-Option]

 Option에는,

-e : 모든 프로세스(every)에 대한 정보를 보여준다.

-f : 전체 목록을 보여준다.

-l : 긴 목록(long format)으로 보여준다.

사용예는 다음과 같다.

$ ps

 pid  tty   time  command

 1324  ttyp2   0:00   sh

 1384  ttyp2   0:00   ps

 이와 같이 옵션없이 ps명령을 실행하면 현재의 쉘과 현재의 실행 명령어 (여기서는 ps)에 대한 정보를 보여준다.

 pid는 프로세스 id를 나타내며,

 tty는 터미널 번호를 나타내고,

 time은 프로세스 실행 후 지금까지 걸린 시간을 나타내고,

 command는 관련 명령어를 의미한다.


$ ps -ef

 uid pid ppid c stime tty time command

uid는 유저id를 의미하며,

pid는 프로세스 id를

ppid는 부모 프로세스 id를 의미하며,

stime은 시작시간을 의미하고,

tty는 터미널 번호를 의미하며,

command는 실행 명령어를 의미한다.


background 프로세스

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

전체 디스크에서 파일을 찾는 명령어나 인쇄 유틸리티 등과 같은 명령어들은 실행을 완료하는 데에 오랜 시간이 걸린다. 사용자는 이들 명령어들이 실행 완료될 때까지 다른 명령을 실행할 수 없게 된다.

하지만, 명령어를 백그라운드에서 실행하도록 하면 그 명령이 완료되기를 기다리지 않고 다른 명령을 수행할 수 있다.

사용법을 살펴보면,

명령을 백그라운드에서 수행되도록 하려면 명령 끝에 & (앰퍼샌드)를 붙여준다.

사용예는 다음과 같다.

$ grep unix * > grep.list &

[1] 193

$ ps

pid tty time command

179 0:00 sh

193 0:00 grep

194 0:00 ps

처음 명령에 의해 job number는 1로, pid는 193 으로 세팅됨.

백그라운드에서 실행중인 명령을 중지하고 싶으면

kill 명령을 사용하거나 로그아웃으로 종료될 수 있다.

또한 백그라운드로 수행중인 명령은 stop 명령으로 일시 중지될 수 있다.

하지만, 백그라운드에서 실행중인 명령은 키보드와 단절되어 있으므로 ctrl + c로 백그라운드 명령을 중지시킬 수는 없다.

stop명령으로 일시 중지된 프로세스는

bg 명령으로 다시 백그라운드로 보내거나

fg 명령으로 foreground 프로세스로 수행을 활성화 할 수 있다.


kill - 프로세스 죽이기

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

kill 명령은 백그라운드 명령을 포함하여 어떤 명령도 종료시키는 데에 사용할 수가 있다.

하지만 해당 명령의 소유자만이 종료시킬 수 있다 (super user는 가능).

실제로 kill명령은 프로세스를 죽이는 것이 아니라 프로세스에 종료 신호를 보내 자체를 종료시키도록 요구하는 것이다.

사용법을 살펴보면,

kill [-s signal_name] pid [pid...]

사용예를 살펴보면 다음과 같다(hp-ux에서 bourne 쉘 기준임).

$ cat /usr/share/man/cat1/* > tempfile &

 [1] 999

$ cat /usr/share/man/cat2/* > tempfile &

 [2] 1000

$ kill 999

 [1] -terminated cat /usr/share/man/cat1/* > tempfile &

$ kill -s int %2

 [2] + interrupt cat /usr/share/man/cat2/* > tempfile &

$ kill -s kill 0

두번째 줄에 의해

pid는 999번 이며 job넘버는 1로 할당되었음을 알 수 있다.

네번째 줄에 의해

pid는 1000번 이며 job넘버는 2로 할당되었음을 알 수 있다.

일곱번째 줄의 %2는

job number를 의미하며 int라는 시그널을 보내게 된다.

여기서 int는 interrupt를 의미한다.

(⇒ job number #2에 int신호를 보냄.)


쉘 프로그래밍 (shell programming) 이란

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

unix 시스템의 사용자는 여러 개의 쉘 명령어들을 똑같은 순서로 반복해야 하는 경우가 있을 수 있다. 이런 경우 명령어들을 파일로 저장해두고 쉘 명령어처럼 사용할 수가 있는데, 이런 파일들을 쉘 script 또는 쉘 program 이라 한다.

쉘이 쉘 program을 실행하기 위하여는 program 파일을 읽고 각 줄을 실행할 수 있어야 한다. 그래서, 해당 쉘 program 파일에 대해 read(읽기)와 execute(실행하기) 권한이 주어져야 한다.

쉘 스크립트의 문법은 쉘의 종류에 따라 다소의 차이가 있으며, 유닉스 시스템에서 초기 구동시 참고하는 파일들이 대부분 bourne 쉘 문법으로 되어 있기에 여기서는 bourne 쉘 문법을 중심으로 전개하려 한다.

자, 그럼 sample program을 만들어 보자.

$ cat sample_pgm

  # this is sample program

    who am i

   ls -f

$ chmod +x sample_pgm

$ sample_pgm

위의 sample 예제는 login name을 알아보고 현재 디렉토리의 파일 목록을 출력하는 program이다.

5번째 줄에서 실행 가능하도록 execute 권한을 부여하였다.


쉘 script의 인수(argument)

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

파일을 복사해 주는 cp 명령어를 생각해보면 cp 명령어 다음에 복사할 파일명과 복사될 파일명을 입력해야 한다.

이처럼 대부분의 명령어들이 인수를 허용하는데, 쉘 script에도 인수 이용이 가능하다.

사용법을 살펴보면,

쉘 프로그램 이름  arg1 arg2 … argn

쉘 프로그램 내에서 각 인수는 $0 (program 이름), $1(arg 1), $2(arg 2)…$n(arg n)으로 참조된다.

사용예는 다음과 같다.

$ cat sample_2

 echo your program name : $0

 echo first argument : $1

 echo second argument : $2

$ chmod +x sample_2

$ sample_2 love dream

 your program name : sample 2

 first argument : love

 second argument : dream


 쉘 변수 할당하기

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

쉘 script는 쉘 변수라는 기능을 사용하여, 보다 더 유연하게 작성될 수 있다.

쉘 변수는 문자열을 저장하는데 사용하는 하나의 이름이다.

변수 값은 문자열이 된다.

변수 이름 다음에 등호(=)와 변수 값을 기입함으로서 변수에 값을 줄 수 있다.

예를 들어 bin이란 변수에 “bin”이란 값을 주려면,

$ bin=bin

$ export bin

두번째 줄은 bin을 지역변수에서 전역변수로 바꿔주는 명령어이다.

쉘 명령에서 변수의 값을 참조하려면 변수명 앞에 $를 붙여 사용한다.

예를 들어,

$ cd/usr/$bin

$ pwd

 /usr/bin

cd 명령을 실행하기 앞서 쉘은 bin이라는 변수 이름 대신 변수의 값 “bin”으로 대체한다.

결국,

$cd/usr/bin 이라 입력한 것과 같다.


exit명령어와 return명령어

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

exit 명령어

쉘 program을 종료하고 반환 code를 설정한다.

사용법은.

exit [arg]

return 명령어

함수의 실행을 정지하고 호출 프로시저로 돌아간다.

사용법은,


return [arg]

호출 프로시저가 없을 경우 return 명령어는 exit와 같다.

return codes

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

unix의 모든 명령은 명령이 완료될 때 반환 code를 생성한다.

명령이 정상적으로 종료되었으면 0을 return시키고 오류가 났으면 0이 아닌 값을 반환한다.

리턴코드는 쉘 변수인 $?로 참조할 수 있다.

상용법을 살펴보면,

$ ls    

$ echo $?

 0

쉘 변수$?은 최종적으로 return된 값을 참조한다.

$ true

$ echo $?

 0

true명령은 항상 0을 되돌려 준다.

$ false

$ echo $?

 1

false명령은 항상 1을 반환한다.

$ cp

$ echo $?

 1

 인수가 빠져 있기에 오류가 발생함.


test 명령어

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

test 명령어

test 명령어는 표현식을 평가하고 반환code를 생성하는데 사용한다.

test 명령어는 정수와 문자열과 파일의 조건을 검사하는 데에 사용될 수 있으며, 일반적으로 if문과 while문 등의 조건부 흐름 제어에 사용한다.

사용법은,

test expression or [expression] 

표현식이 true이면 0을 return하고 false이면 0이 아닌 값을 return한다.

수식 평가

수식을 평가하는 데에의 표현식 사용법은,

[숫자 관계 숫자]

 여기서 관계는,

-lt : less than

-le : less than or equal to

-gt : greater than

-ge : greater than or equal to

-eq : equal to

-ne : not equal to

예를 들어 x를 3이라 가정하면,

$ [ $x -lt 7]

$ echo $?

0

$ [ $x -gt 7]

$ echo $?

1

문자열 평가

test 명령에서 문자열을 평가할 때의 표현식은,

[문자열1 = 문자열2] : 문자열이 같은 지를 평가함.

[문자열1 != 문자열2] : 문자열이 다른 지를 평가함.

예를 들어보자.

$ x=abc

$ [ $x =“abc”]

$ echo $?

 0

$ [ $x !=“abc”]

$ echo $?

 1

문자열에는 반드시 “”나‘’부호를 사용해야 한다.

문자열 연산자에는,

-z 문자열 : 문자열의 길이가 0이면 참

-n 문자열 : 문자열의 길이가 0이 아니면 참

파일 평가

test 문에서 파일이 디렉토리인지 파일인지를 평가할 수 있다.

사용법은,

test -Option filename

여기서 Option은,

-f : filename이 파일이면 참.

-d : filename이 디렉토리이면 참.

-s : 파일이 존재하며 크기가 0보다 크면 참.

-r : 파일이 존재하며 읽기 가능하면 참.

-w : 파일이 존재하며 쓰기 가능하면 참.

-x : 파일이 존재하며 실행 가능하면 참.

다른 연산자

test 명령어에서 다음의 연산자를 사용하면 복수 검사가 가능하다.

 -o : or

 -a : and

! : not

\(\) : grouping

예를 들어,

$ test -s filename -a -r filename 

파일이 존재하고 size가 0보다 크며 그리고(and) 읽기 가능한지를 검사함.


산술식 표현

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

본격적으로 반복문을 시작하기 전에, 쉘 script에서의 산술식 표현 방법을 알아보자.

산술식 표현 방법은,

let expression or ((expression))

예를 들어보자.

$ x=10

$ y=2

$ ((x=x+2))

$ echo $x

 12

쉘 script에서의 산술식은

let 명령을 사용하거나,

괄호를 두 개 사용하여 표현하거나

expr 명령어를 이용한다.

예를 들어보자.

$ let x=x+6

$ echo $x

  18

$ let “x=x/(y+1)”

$ echo $x

  6

산술식 표현 속에 괄호는 평가 순서를 바꾸는 데 사용될 수 있다.

이런 경우 큰 따옴표를 써야함을 유의하자.

위의 형식에 대한 바른 표현은,

let “x=x/(y+1)”또는 ((x=x/(y+1))) 또는 x=`expr $x/($y+1)`

[참고] ` (back qoute)

expr 을 사용한 예를 더 살펴보자.

$ expr 30 "*" 30

 900

if 문

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

if 문은 program을 조건에 따라 분기시킨다.

사용법을 살펴보면,

 if

  list a

 then

  list b

 fi

사용예는 다음과 같다.

 if

  test -s funfile

 then

  echo funfile exists

 fi

funfile이 존재하고 크기가 0이 아니면 “funfile exists”라는 message를 화면에 뿌린다.


반복문 (loop문)

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

반복문은 일련의 명령을 반복할 수 있게 한다.

반복을 계속할 지는 키 명령의 반환 코드에 기초하여 이루어진다.

if 문이나 case 문은 key word로 시작되고 거꾸로 된 key word로 끝나는 반면

반복문은 키워드와 어떤 조건으로 시작하고 내부는 do/done으로 둘러 쌓이게 된다.

반복문은 아래의 3가지 형태이다.

while 문

  while…

  do

 done


until 문

 until…

  do

 done


for 문

 for…

  do

 done


while 문

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

while 문은 조건이 참인 동안은 loop를 반복한다.

사용법을 살펴보면,

 while

  list a

 do

  list b

 done

사용예[1]은 다음과 같다

 $cat sample_while

 x=1

 while((x<=10))

 do

  echo x is $x

  let x=x+1

 done

 $sample_while

  x is 1

  x is 2

   ·

   ·

   ·

  x is 10

위의 예에서 알 수 있듯이 조건식인 ((x<=10))이 참인 동안은 loop 내부를 반복하게 된다. 그래서, 무한 loop에 빠지지 않아야 함을 주의하자.

사용예[2]는 다음과 같다

$ cat sample_while2

  ans=yes

  while

  [ $ans = “yes” ]

 do

  echo enter a name

  read name

  echo yes or no

  read ans

 done

$ chmod 777 sample_while2

$ sample_while2


 until 문

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

until 문은 조건식이 참이 될 때까지 loop를 반복한다.

(비교 : while 문은 조건이 참인 동안 loop가 계속된다.)

사용법을 살펴보면,

 until

  list a

 do

  list b

 done

사용예는 다음과 같다.

$ cat sample_until

  x=1

  until((x>10))

 do

  echo x is $x

  let x=x+1

 done

$ sample_until

  x is 1

  x is 2

   ·

   ·

   ·

  x is 10

 위의 예에서 알 수 있듯이 until 문은 조건이 참이 될 때 까지 반복된다.




for 문

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

for 문은 list에 있는 각 item들이 for 반복문에 순차적으로 할당되어 소진될 때 까지 loop를 실행한다.

사용법을 살펴보면,

 for var list

 do

  list

 done

사용예는 다음과 같다.

$ cat sample_for

 for x in 1 2 3 4 5

 do

  echo “ 2 * $x is \c”

  let x=x=+2

 echo $x

 done

$ sample_for

  2*1 is 2

  2*2 is 4

    ·

    ·

    ·

  2*5 is 10


break, continue, exit

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

반복문에서 loop를 중단시킬 필요가 있을 때가 있을 수 있다.

break 와 continue 는 무조건적인 흐름 제어를 제공한다.


exit

전체 프로그램이 종료되어야 할 경우 사용한다.

프로그램을 완전히 종료하고 쉘 프롬프트로 나가게 한다.


break

loop 를 종료하고 done 다음의 명령을 계속하여 수행하도록 한다.

continue

loop 의 나머지 명령을 중단하고 loop 의 맨 위로 가게 한다.

즉, continue는 단지 한번의 loop를 종료하고 loop의 맨 위에서 loop를 계속하게 하며, break는 loop를 빠져나가 다음 단계를 계속 수행하게 한다.

사용예는 다음과 같다.

$ cat sample_break

 while

  true

 do

  echo “enter file name to remove :\c”

  read file

  if test ! -f $file

  then

   cho $file is not a require file

   continue

  fi

  echo removing $ file

  rm $file

  break

 done

















기탸 유용한 것들


ail -f 옵션을 이용한 log 파일 보는 방법에 대한 설명

계속 이어지는 로그와 같은 경우 -f 옵션을 주어서 변화하는 로그를 볼 수 있도록 할 수도 있다.


mkdir & rmdir'


 

반응형

'IT 세상' 카테고리의 다른 글

[바이소프트 안내] 기업 고객의 IE 7 자동 업데이트 블럭킹 방법  (0) 2007.11.15
UNIX 사양 알아내기  (0) 2007.11.12
DOM 개념 XML  (0) 2007.11.12
JDK 톰캣 Linux 설치  (0) 2007.11.12
아스키 코드표  (0) 2007.11.12

관련글 더보기