본문 바로가기

Server/Linux

리눅스 명령어 Linux

리눅스 명령어 Linux


adduser
사용자를 새로 등록한다.

문법
adduser

설명
이것은 슈퍼 유저만이 사용할 수 있다. 명령을 입력하면 로그온 이름 등을 차례로 물어오며, 그에 따라서 알맞게 입력해 나가면 된다.

Enter login name for new account (^C to quit): blade
Editing information for new user [blade]
Full name: Park Chan Wook ,,사용자 전체 이름을 입력
GD [100]: ,,정해주는 값을 그냥 사용한다.

그외에도 홈 디렉토리에 사용하는 셸 등을 계속 물어오는데, 대괄호 속에 내정된 것을 그냥 사용하고자 한다면 엔터키만 누르면 된다. 패스워드 등을 입력하고 나면 지금까지 입력된 정보를 보여주고, 몇 가지 생성 작업을 화면으로 보여준 후 작업을 종료한다.


at
프로그램을 지금이 아닌 나중에 실행하도록 예약한다.

문법
at -q [-m][-f 파일명] 큐(queue) 시간
at -r 작업번호
at -l

옵션
-q 큐 : 대소문자 알파벳으로 큐를 지정한다. 순서적으로 빠른 알파벳이 지정된 큐 일수록 CPU 시간 점유 우선권이 낮다.
-r 작업번호 : 큐에서 작업 번호가 지시하는 작업을 지운다. 슈퍼유저가 아니라면 자신의 작업만을 지울 수 있다.
-l : 현재 계획된 작업들의 목록을 보여준다. 슈퍼 유저라면 모든 작업들의 계획목록을 보여준다.
-m : 작업이 완결되면 사용자에게 메일을 보낸다.
-f 파일명 : 표준 입력이 아닌 지시된 파일에서 작업을 읽어온다.

설명
명령은 기본적으로 표준 입력 장치를 통해서 받으며, ^D로 입력을 종료한다. 리다이렉션을 사용하여 다른 파일의 내용을 사용할 수 있다.

/etc/at.allow 파일이 있다면 이 파일에 명단이 있는 사용자만이 at 명령을 사용할 수 있다. /etc/at.allow 파일이 없다면 /etc/at.deny 파일을 찾는다. 이 파일에 목록이 있는 사용자는 at 명령을 사용할 수 없다. 두 파일 모두 찾지 못한다면 오로지 슈퍼 유저만이 at 명령을 사용할 수 있다. 그리고 /etc/at.deny 파일이 비어 있다면 모든 사용자가 at 명령을 사용할 수 있다.

시간을 지정할 때 상당히 다양한 방법을 사용할 수 있다. hhmm 혹은 hh:mm 형태도 가능하며, noon, midnight이나 오후 4시를 의미하는 teatime이라고도 할 수 있다. 오전 오후를 쉽게 구분하려면 am pm 문자를 추가해도 된다. 이미 지나간 시간이라면 다음 날 그 시간에 수행될 것이다. 정확한 날짜를 지정하려면 mmddyy 혹은 mm/dd/yy 아니면 dd.mm.yy 형태 중 선택하라.

현재부터 얼마의 시간이 경과한 후에 수행할지를 지정하려면 + 기호를 사용하라. 이 + 기호뒤에 숫자를 명시하고, 다시 뒤에 그 숫자의 단위가 무엇인지 지정하면 된다.

사용예
at 8am work
work에 수록된 작업 사항들을 오전 8시에 수행하도록 한다.

at noon work ,,정오에 work에 수록된 작업을 수행한다.
at -f work 14:40 tomorrow
내일 오후2시 40분에 work 파일에 수록된 작업을 수행한다.


banner
인수로 주어진 문자열을 큰 글씨로 만들어서 출력한다.

문법
banner [ -w [숫자] ] 문자열
옵션
-w : 옵션 지정만 하면 80 칼럼으로 폭을 바꾼다. 지정하지 않으면 132 칼럼으로 내정되어 있다. -w 옵션 뒤에 숫자를 지정하면 원하는 폭으로 조정할 수 있다.
설명
출력은 표준 출력으로 내정되어 있다. 글자는 열 배 정도 확대된다. 글자는 에스터리스크(*)를 조합하여 만든다.

사용예
banner "hello world"
banner linux | lqr ,,디폴트 프린터에 확대한 글자를 출력한다.



bash
이것은 리눅스의 Boume 셸이다. sh를 사용하면 sh가 bash를 호출하여 실행한다. bash를 직접 사용하지 말고 sh를 사용하도록 하라.

문법
sh [ 옵션 ][ 파일 ]

설명
sh의 설명을 참조하라.



biff
전자우편의 수신을 즉시 알려주는 동작을 가능하게 할 것인지 그렇지 않은 지의 여부를 보여주거나 결정한다.

문법
biff [ y 혹은 n]

설명
유닉스 셸은 사용중이라도 주기적으로 전자우편의 수신 여부를 점검한다. 만일 사용자가 전자우편이 도착하는 즉시 알고자 한다면 biff를 사용하여 그것을 지시할 수 있다. 또는 언제라도 그 기능을 해제할 수도 있다. biff는 인수없이 사용되면 현재 어떤 상태로 되어 있는지 보여준다. 기능 설정과 해제 여부는 y 혹은 n 인수를 주어서 결정한다.

사용예
$ biff
is n ,,전자우편 수신 즉시 통고 기능은 설정되어 있지 않음
$ biff y ,,기능설정
$ biff
is y

cal
서기 원년부터 9999년까지의 달력을 볼 수 있다.

문법
cal [-jy] [ [ 달 ] 연도 ]

옵션
-j : 1월 1일부터 날짜수를 계산하는 julian 날짜를 표시한다.
-y : 올해의 달력을 표시한다.

설명
인수를 하나만 준다면 그 숫자는 연도를 의미하는 것으로 간주된다. 두 개의 숫자를 준다면 앞의 것은 월, 그 다음은 연도를 의미하는 것이 된다. 우리의 습관과는 다른 방법을 사용한다. 아무 인수도 주어지지 않으면 이번달의 달력을 표시한다. 연도를 표기할 때는 서기를 완전히 표기해야 한다. 예를들어 97은 1997년이 아니라 서기 97년의 달력을 출력할 것이다.

사용예
$ cal 1997
$ cal 4 1997



cat
cat은 catenate(사슬로 잇다. 연결하다)에서 이름이 유래한다. 이것은 파일의 내용을 화면에 출력하는 데 사용되기도 하며 파일을 다른 곳에 순차적인 스트림으로 보내기 위해 사용된다.

문법
cat [ -benstuvETA ] [ 파일명(들) ]

옵션
-b : 공백 외의 글자가 있는 모든 행의 개수를 센다.
-e : 제어 문자를 ^ 형태로 출력하면서, 각 행의 끝에 $를 추가한다. -vE와 같다.
-n : 각 행을 출력하면서 행 번호를 함께 첨부한다.
-s : 중복되고 겹치는 빈 행은 하나의 빈 행으로 처리한다.
-r : 행바꿈 문자를 제외한 제어 문자를 ^ 형태로 출력한다. -vT와 같다.
-u : 유닉스 호환성을 위해 추가된 옵션으로서 무시된다.
-v : tab과 행바꿈 문자를 제외한 제어 문자를 ^ 형태로 출력한다.
-E : 각 행마다 끝에 $ 문자를 출력한다.
-T : 시로서 탭(tab) 문자를 출력한다.
-A : -vET 옵션을 사용한 것과 같은 효과를 가진다.

설명
유닉스 시스템은 기본적으로 텍스트 자료들을 처리하는 것을 매우 중요시 여겼다. 많은 초기 설정 작업들이 텍스트 문서로 이루어지고, 텍스트 문서를 처리하는 수많은 명령들이 있다. cat 명령은 그러한 것들 중 기본적인 것이다.

cat 명령은 읽어들이는 파일 이름을 지정하지 않으면, 기본 내정값으로 표준 입력 장치를 선정한다.
$ cat

이렇게 하면 키보드로부터 입력을 받고, ^d로 입력이 끝나면 다시 표준 출력 장치인 화면으로 출력한다.

사용예
$ cat document.1 ,,document.1 파일을 화면으로 출력한다.
$ cat content report.first myreport

content와 report.first 두 개의 문서가 연결된 myreport라는 파일을 생성하게 된다.



cd
현재 작업하는 디렉토리를 변경한다.

문법
cd [ 디렉토리 ]

설명
디렉토리 이름과 cd 명령 사이에 반드시 공백이 있어야 한다. 디렉토리 이름을 주지 않고 수행하면 사용자의 홈 디렉토리로 이동한다. 자신이 이동하고자 하는 디렉토리는 자신에게 실행 권한(execution permission)이 있어야 한다.

사용예
$ cd /home
$ pwd
/home


chgrp
파일의 그룹 소유권을 바꾼다.

문법
chgrp [ -cfvR ] 그룹 파일들

옵션
-c : 실제로 소유자가 바뀐 파일에 대해서 자세히 기술한다.
-f : 파일의 그룹 소유권을 바꿀 수 없더라도 에러 메시지를 출력하지 않는다.
-v : 소유권의 바뀜에 대해서 자세히 기술한다.
-R : 디렉토리와 그 내용 파일들의 소유권을 재귀적으로 모두 바꾼다.

설명
파일의 소유자나 슈퍼 유저만이 파일의 그룹 소유권을 바꿀 수 있다. chgrp 명령 뒤에 원하는 옵션을 사용한 후 목적하는 그룹의 이름을 명시하고 대상 파일의 이름을 명시한다.

사용예
$ chgrp DoublePlus /usr/project/*
이것은 /usr/project의 모든 파일들의 소유권을 DoublePlus 그룹으로 바꾼다.



chmod
파일의 모드를 바꾼다. 파일의 모드는 권한(permission) 을 제어한다.

문법
chmod [ -cfvR ] 모드 파일명(들)
chmod [ -cfvR ] 레벨 동작 권한 파일이름(들)

옵션
-c : 실제로 파일의 권한이 바뀐 파일만 자세히 기술한다.
-f : 파일의 권한이 바뀔 수 없어도 에러 메시지를 출력하지 않는다.
-v : 변경된 권한에 대해서 자세히 기술한다.
-R : 디렉토리와 파일들의 권한을 재귀적으로 모두 바꾼다.

설명
위에서 보인 문법에서 첫 번째 보인 형식에 사용되는 모드는 파일의 권한을 8진수로 표현한 값이 된다. 파일의 권한은 세 가지가 있기 때문에 각 특성을 하나의 비트로 표현하면 0부터 7까지의 수로 표현할 수 있다. 이것은 8진법 표현이 매우 적당하다.

두 번째 형식은 어떤 사용자 레벨을 바꿀 것인가 어떻게 바꿀 것인가를 개별적으로 정하는 방법이다. 숫자를 사용하지 않고 ls 등을 사용할 때 실제로 볼 수 있는 기호 문자를 사용한다는 것과 특정 권한을 줄 것인가 뺄 것인가 지정할 수 있다는 장점이 있다. 특정한 경우 두 번째 형식이 편리하겠지만 고유한 값의 권한을 지정하는데에는 첫 번째 형식이 훨씬 편리할 것이다. 8진법을 다루는 것은 조금만 알면 너무나 쉽기 때문이다.

사용예
$ chmod 666 broadboard ,,파일을 모두가 읽고 쓸 수 있도록 한다.
$ chmod 746 broad ,,파일 권한을 -rwxr--rw-로 변경한다.
$ chmod o+x,g-w broadboard
파일 소유자는 실행권한을 추가하고, 그룹은 쓰기 권한을 금지한다.

$ chmod u=r broad ,, 다른 사용자의 권한을 읽기로 제한한다.
사용자의 다른 권한은 사라져 버린다.



chown
파일의 소유권을 다른 사람에게로 변경시킨다.

문법
chown [ -cfvR ] 사용자 파일명(들)

옵션
-c : 실제로 파일의 소유권이 바뀐 파일만 자세히 기술한다.
-f : 파일의 소유권이 바뀔 수 없어도 에러 메시지를 출력하지 않는다.
-v : 변경된 소유권에 대해서 자세히 기술한다.
-R : 디렉토리와 파일들의 소유권을 재귀적으로 모두 바꾼다.

설명
파일의 소유권을 다른 사람에게로 바꾸는 것은 슈퍼 유저만이 할 수 있다.

사용예
$ chown blade /user/sisap/*
/usr/sisap 디렉토리의 모든 파일을 blade의 것으로 바꾼다.


clear
clear 명령은 도스의 cls와 마찬가지로 화면을 지우는 동작을 한다.

문법
cmp [-ls][파일명][파일명2][오프셋1][오프셋2]

옵션
-l : 일치하지 않는 모든 바이트 값과 그 오프셋을 알 수 있다.
-s : 비교만을 수행할 뿐 아무런 메시지도 출력하지 않는다.

설명
옵션없이 두 파일 이름만을 지정하면 cmp는 두 개의 파일 처음부터 순서대로 비교를 시작한다. 만일 끝까지 차이점을 발견하지 못하면 cmp는 조용히 끝난다.

만일 중간에 다른 점을 발견한다면 더 이상의 작업은 중단하고 차이를 발견한 지점을 알려주고는 종료한다. 또한 계속해서 일치해 나가다가 두 파일 중 어느 하나가 끝나는 경우가 있을 수 있다. 다시 말해, 한 파일이 다른 파일의 앞부분에 해당하는 경우이다. 이때는 어느쪽 파일의 end of file 표시를 만나게 되었는지를 알려주고 종료한다.

$ cmp document1 document2
document1 document2 differ: char 128, line 13 ,,차이 발견
오프셋을 지정하면 파일의 어느 부분부터 비교할 것인지를 정할 수 있다. -s 옵션이 왜 필요한 지를 이해하지 못할 테지만, cmp 명령이 보이지 않게 리턴값을 들려준다는 점을 알면 이해할 수 있을 것이다. cmp는 비교 후 두 파일이 일치한다고 판단하면 0을 리턴하며, 그렇지 않으면 1을 리턴한다. 셸 스크립트 상에서 비교 결과만을 원하고 화면에 메시지가 출력되는 것을 원치 않을 때에는 이러한 옵션을 사용할 수 있을 것이다. C 언어를 아는 사람이라면 금방 이해할 수 있었으리라 생각된다.

사용예
$ cmp mail.1 mail.2 13 14



compress
파일을 압축하거나 압축을 푼다.

문법
compress [ -cCdfv ] 파일명
옵션
-c : 옵션을 사용하면 압축 결과가 표준 출력으로 나가며 파일은 변함없다.
-C : 파일을 블록으로 분화하는 것을 금지한다. 이것은 compress의 구식 버전이 파일을 읽을 수 있도록 하기 위함이다.
-f : 수행 결과 파일과 같은 이름의 파일이 있다면 물어보지 않고 덮어쓴다. 또한 파일의 크기가 줄어들지 않더라도 파일 이름에 .Z를 추가한다.
-v : 파일이 압축되면 압축 효율을 퍼센트로 보여준다.

설명
압축된 파일은 이름에 접미사 .Z가 추가된다. 압축 알고리즘에 의해 크기가 줄어드는 경우만 압축을 수행한다. -d 옵션은 역으로 압축을 풀지만 uncompress를 사용하면 옵션을 주지 않고 압축을 풀 수 있다. 압축을 푸는 경우 파일 이름 뒤에 접미사 .Z를 생략할 수도 있다.

사용예
$ compress -v roman
$ compress -d noman.Z 혹은 $ compress -d roman



cp
: 파일을 현재의 위치나 다른 디렉토리로 복사(copy)한다.

문법
cp [ -abdfilPprsuvxR ] 파일명1 파일명2
cp [ -abdfilPprsuvxR ] 파일명(들) 디렉토리

옵션
-a : 가능한한 원 파일의 구조와 속성을 그대로 복사한다.
-b : 복사할 때 덮어쓰게 되는 파일은 백업을 만든다.
-d : 심볼릭 링크는 심볼릭 링크로 복사한다. 그리고 원본 파일과의 하드 링크 관계를 유지한다.
-f : 복사 위치에 존재하는 파일을 제거하고 복사한다.
-i : 복사시 같은 이름의 파일이 존재한다면 덮어쓸 것인가 확인한다.
-I : 하드 링크를 만든다.
-P : 원본 파일의 소유자, 그룹, 권한, 시간 기록을 그대로 복사한다.
-r : 파일과 하위 디렉토리에 포함된 파일 모두를 재귀적으로 복사한다.
-s : 디렉토리가 아닌 파일의 심볼릭 링크를 만든다. 소스 파일의 이름은 전체 경로 이름으로 한다. 목적지 파일 이름은 전체 경로를 주지 않아도 현재 디렉토리로 간주되므로 상관없다.
-u : 파일의 정보를 갱신한다.
-x : 다른 파일 시스템인 하위 디렉토리는 무시한다.
-R : 디렉토리를 재귀적(recursive)으로 복사한다.

설명
만일 파일명2가 이미 존재하는 파일의 이름이라면 기존에 있던 파일은 사라지고 새로운 복사본 파일로 바뀐다. 이것이 원하지 않는 결과라면 -i 옵션을 주어서 확인 작업을 거칠 수 있다. -i 옵션은 파일명2가 이미 존재하는 이름이라면 그대로 복사할 것인지 아닌지를 선택할 수 있게 물어온다.

사용예
$ cp -i blade.Z temp.Z
$ cp -r * /somewhere
당연히 -r 옵션은 파일명2가 디렉토리 이름일 때만 사용이 가능하다.


crontab
: 실행될 프로그램들과 스케줄의 cron 데몬을 구성한다.

문법
crontab -l [ -u 사용자 ]
crontab -e [ -u 사용자 ]
crontab -d [ -u 사용자 ]

옵션
-l : crontab 파일 목록을 보여준다.
-e : 에디터를 사용하여 crontab 파일을 수정한다.
-d : 사용자의 crontab 파일을 지운다.
-u 사용자 : 특정 사용자의 crontab 파일을 다루도록 지정한다. 이 명령을 사용하려면 슈퍼 유저로 로그인해야만 한다.

설명
crontab 파일 내의 빈 핵과 # 문자로 시작되는 행은 무시된다.

파일의 각 행은 M H D m d cmd 형태로 되어 있다. 필드의 에스테리스크(*)표시는 어떠한 값이든 일치하는 조건으로 가정한다는 의미이다.
M 분을 의미한다.(0-59) H 시를 의미한다(0-23)
D 날짜를 의미한다(1-31) m 달을 의미한다(1-12)
d 요일을 의미한다(0-6) cmd 실행할 명령을 의미한다.



csh
: 이것은 유닉스 C 셸이다. 하지만 리눅스에서는 tcsh에 링크되어 있는 파일에 불과하다. 자세한 내용은 tcsh를 참조하라.



cut
: 파일에서 필드를 뽑아낸다. 필드는 필드 구분자나 문자 위치로 지정된다.

문법
cut -c문자위치 파일명(들)
cut -f필드 -d필드 구분자 [ -s ] 파일명(들)

옵션
-c문자위치 : 잘라낼 곳의 글자 위치를 지정한다. 콤마를 사용하거나 하이픈을 사용하여 범위를 정할 수도 있으며, 이런 표현들을 혼합하여 사용할 수도 있다.
-f필드 : 잘라낼 필드를 정한다. 지정하는 방법은 -c 옵션과 같다.
-d필드 구분자 : 필드를 구분하는 문자를 지정한다. 디폴트는 탭 문자다.
-s : 필드 구분자를 포함할 수 없다면 그 행은 하지 않는다.

사용예
$ cut -f1,5 -d: /etc/passwd
$ cut -c1,3-7 /usr/tmp/board


date

: 시스템은 현재의 날짜와 시간을 유지하고 있다. date 명령을 사용하면 그러한 시간을 확인할 수 있다. 또한 날짜와 시간 정보를 변경할 수 있다. 물론 시스템의 날짜와 시간은 슈퍼 유저만이 변경할 수 있다.

문법
date [yymmddhhmm [ss] ]
date +형식

설명
date 는 위와 같이 주어진 인수가 없다면 현재 시스템의 시간과 날짜를 출력한다. 주어지는 인지가 있다면 그에 따라서 시스템의 시간과 날짜를 변경한다.

yy는 연도를 나타내는 두 숫자이며(99년까지), mm은 월을 나타내는 수이다. 그리고 dd는 날짜, hh는 24시간 단위로 표현되는 시간이며, mm은 분을 의미한다. 마지막 ss는 초를 의미하는 부분인데, 명시하지 않아도 상관없다.

+형식 구문을 사용한다면 날짜가 출력되는 형태를 지정할 수 있다. 여기에 사용되는 기호는 다음과 같은 것들이 있다.

n 개행 t 수평탭
H 시간(00-23) I 시간(01-12)
k 시간(0-23) l 시간(1-12)
M 분(00-59) p AM 혹은 PM
r 시간(12단위, hh:mm:ss AM/PM)
s 초(00-61) T 시간(24단위, hh:mm:ss)
X 시간 표현(hh:mm:ss) Z 시간대(예를들어CMT)
a 요일표현(Sun-Sat) A 요일명(Sunday-Saturday)
b 달 표현(Jan-Dec) B 달이름(January-December)
D mm/dd/yy 형태의 날짜 h %b 와 같은 것
j 일년단위 날짜(001-366) m 달(01-12)
y 서기의 뒷부분 숫자(00-99) Y 서기(0000-9999)

사용예
$ date
The Oct 1 15:57:23 KST 1996


df
: 디스크의 여유 공간을 검사하여 보고한다.

문법
df [ -aikpvtx ] 파일시스템

옵션
-a : 0 블록을 가진 파일도 보고한다. 기본적으로는 무시한다.
-i : 블록 사용 대신 incode 사용 정보를 보고한다.
-k : 블록의 크기를 1K바이트로 계산한다.
-p : POSIX 형태의 출력을 한다.
-v : System V의 df와의 호환을 위한 옵션이다. 무시된다.
-t 형태 : 특정 형태의 파일 시스템으로 검사를 제한한다.
-x 형태 : 특정 형태의 파일 시스템 이외의 것으로 검사를 제한한다.

설명
이것은 바이트 크기를 사용하는 대신 블록 단위로 보고한다는 점을 유의해야 한다. 기본적으로 512바이트 크기로 한 블록을 다룬다.



diff
: 두 개의 파일을 비교한다. 이것은 두 개의 파일이 과연 어떻게 다른가를 중요시한다. 그래서 어떻게 수정되어야만 두 파일이 같아질 수 있는지를 말해준다.

문법
diff [ -ibefw ] 파일명1 파일명2

옵션
-i : 대소문자를 구분하지 않는다.
-b : 하나 이상의 공백 문자는 모두 같은 것으로 취급해서 비교한다.
-e : ed 에디터를 위한 스크립트를 생성한다.
-f : 반대 순서로 스크립트를 생성한다. 하지만 이것은 ed 에디터에 사용될 수가 없다.
-w : 탭(tab) 문자를 포함한 모든 공백 문자를 무시하고 비교 작업을 수행한다.

설명
diff가 보여주는 정보는 언뜻 보아서는 이해할 수 없다. 일단 명심해야 할 것은 표본이 되는 문서는 두 번째 파일이라는 점이다. 그래서 모든 정보는 ‘첫번째 파일이 어떻게 수정되어야 두 번째 파일과 같아지느냐’하는 것이다.

파일2에서 파일1로 첨가(append)되어야 할 것은 ‘a' 기호로 표현된다. 그리고 파일1에서 제거(delete)되어야 하는 내용은 'd'로, 두 파일의 내용이 바뀌어(change)하는 내용은 ’c'기호로 표시한다. 이러한 수정 기호와 함께 행의 번호가 함께 표시되며, 해당 줄의 내용이 함께 출력된다.
행숫자 a 파일2시작행번호 파일2끝행번호
파일1시작행번호 파일1끝행번호 d 행숫자
파일1시작행번호 파일1끝행번호 c 파일2시작행번호 파일2끝행번호

사용예
$ diff -i doc1.txt doc2.txt


du
: 지정된 특정 디렉토리나 파일들이 차지하는 공간을 보고한다.

문법
du [ -sabxL ][ 디렉토리,파일명(들) ]

옵션
-s : 총 합계만을 따진다. 하위 디렉토리의 숫자 등은 나오지 않는다.
-a : 크기가 계산된 각 파일의 크기를 보인다.
-b : 바이트 크기로 출력한다.
-x : 현재 디렉토리에 마운트된 파일 시스템만 검사된다.
-L : 심볼릭 링크 자신의 공간 대신 연결된 파일의 크기를 다룬다.

설명
디렉토리나 파일을 지정하지 않으면 현재 디렉토리로 간주된다. 크기는 1K 바이트 크기의 블록으로 보고한다.

사용예
$ du /root ,,/root 디렉토리의 공간 크기를 보고한다.



echo
: echo는 인수로 지정된 문자열을 그대로 화면에 출력한다. 이것은 인수로 주어진 문자열이 오퍼레이팅 시스템으로 읽혀진 후에 다시 그대로 화면에 ‘메아리’치는 것으로 생각할 수 있다.

문법
echo [ -ne ] 문자열

옵션
-n : 새로 개행하지 않고 출력하게 한다.
-e : 문자열 중에서 백슬래쉬와 조합되는 특수 문자를 인식하게 한다. 그러한 특수 문자들은 다음과 같은 것들이 있다.

\a 밸소리 \b 백스페이스
\f 용지바꿈(form feed) \n 행바꿈
\r 0 칼럼으로(carriage return) \f 탭(tab)
\v 수직 탭 \\ 백슬래쉬 문자
\nnn 8진법으로 표기되는 ASCII 문자 \c 출력 후 행바꿈 금지

설명
일반적으로 echo 명령은 프롬프트 상에서 사용되는 일은 없다. 하지만 스크립트 작성시 번번히 사용된다. 셸 스크립트 상에서 echo 명령은 BASIC의 PRINT 명령이나 C 언어의 printf() 함수와 같이 메시지를 출력하는 데에 자주 사용된다. 또한 전혀 필요없을 것 같은 echo의 -n 옵션도 스크립트 상에서는 유용하게 사용될 수 있다.

사용예
$ echo "The RedHat !"
The RedHat !
$ echo -e 'Linux\RedHat !'
Linux RedHat !



ed
: 풀 스크린 에디터를 사용할 수 없는 열악한 환경의 터미널을 위한 라인 에디터(line editor)이다.

문법
ed [ - ][ -s ][ -p문자열 ] 파일명

옵션
- : e, r, w, q, ! 명령에 의해 발생하는 메시지를 금지한다.
-s : 검사 작업을 금지한다.
-p문자열 : 프로프트를 원하는 문자열로 바꾼다.

설명
ed는 기능이 다양한 에디터이나 라인 에디터는 거의 사용할 일이 없을 것이다.


env
: 현재의 환경에 영향을 주지 않고 원하는 환경을 만들어 명령을 실행한다. 또는 현재의 환경을 보고한다.

문법
env [ - ][-i ][ -u 이름 ][ 이름=값 ][명령]

옵션
- : 뒤에 오는 이름=값 목록으로 환경을 제한한다.
-i : 현재의 환경을 무시하고 빈 환경 상태로 시작한다.
-u 이름 : 현재의 환경에 그 이름의 변수가 있다면 제거한다.

설명
‘이름=값’의 형식으로 특정 환경 변수를 지정해서 명령을 실행한다. 이러한 값을 필요한 대로 여러 개 나열하면 되고, 현재의 환경은 변경하지 않으므로 명령의 수행이 끝나면 환경의 상태는 이전과 다름없게 된다.

사용예
$ env HOME=/usr/victor tsh

홈 디렉토리 변수를 지정하여 셸을 실행한다.
$ env ,,현재 설정되어 있는 환경 변수들을 보여준다.



file
: 파일이 어떠한 형태의 파일인지 알아낸다.

문법
file [-czL ][ -fm 파일명 ] 파일명(들)

옵션
-c : 매직 파일의 파싱된 형태를 보여준다.
-z : 압축되어 있는 파일의 형태를 검사한다.
-L : 뒤따르는 심볼릭 링크를 야기시킨다.
-f 파일명 : 검사한 파일에 대해 리포트를 만들 파일의 이름을 지정한다.
-m 파일명 : 파일의 형태를 결정하는 데에 사용되는 매직 파일을 정한다.

설명
파일이 텍스트 문서인지 실행할 수 있는 파일인지 아니면 데이터 파일인지 등을 인식한다. 에디터를 사용해서 보거나 수정될 수 있는 파일인가 알아 보는 데에 많이 사용된다.

사용예
$ file -z /home/Book.Z



find
: 원하는 특정 파일을 디렉토리를 탐색하여 찾는다. find는 매우 강력한 도구로 특정 디렉토리들을 순회하면서 지정된 조건에 만족하는 파일을 찾는다. 파일의 조건은 이름이나 크기, 날짜 등 다양하게 지정할 수 있다.

문법
find [ 디렉토리 ] 탐색 조건

탐색 조건
-name 파일명 : 찾고자 하는 파일의 이름을 정한다. 와일드 카드도 가능하다.
-perm 모드 : 파일 권한(permission)이 일치되는 것을 찾는다. 원하는 권한은 ls로 볼 수 있는 형태와 같이 지정한다.
-type ? : 형태가 같은 파일을 찾는다. 물음표(?) 부분에 디렉토리는 d, 파이프는 p, 심볼릭 링크는 l, 소켓은 s, 블록 파일은 b, 일반 파일은 f 등의 기호를 사용한다.
-links ? : 특정 개수의 링크를 가진 파일을 찾는다. 물음표 부분에 링크의 숫자를 표기한다.
-size ? : 파일의 크기가 일치하는 것을 탐색한다. 파일 크기는 블록단위로 물음표 부분에 지정한다. 한 블록은 512바이트로 내정되어 있지만 블록 숫자 뒤에 단위로 k자를 붙이면 1키로바이트 크기의 블록 숫자로 간주된다.
-user 사용자 : 파일 사용자의 ID에 따라서 검색한다. 로그인 이름이나 번호 모두가 가능하다.
-atime ? : 최근 며칠내에 엑세스한 파일을 검색한다. 날짜수는 ?에 명시한다.
-exec 명령 : 원하는 검색 조건에 맞는 파일을 찾으면 명시된 명령을 실행한다. 명령의 끝은 \;을 사용하여 끝낸다. find가 검색해낸 파일의 이름을 인수로 사용하고 싶다면 그 위치에 {}를 사용한다.
-newer 파일 : 어떤 파일보다 최근에 갱신된 모든 파일을 검색한다.

사용예
$ find /bin -name ro*
$ find -user qwfwq -exec cat {} list\;



finger
: 시스템 상의 사용자들에 대한 정보를 보여준다.

문법
finger [ -slpm ][ 사용자 ]

옵션
-s : 사용자의 로그온 이름, 실제이름, 터미널 이름, 로그온 시간 등등을 보인다.
-I : -s 옵션 정보에 몇 가지를 추가하여, 여러 줄에 걸쳐서 보여준다.
-p : -l 옵션 정보에서 .plan과 .project 파일을 보이지 않는다.

설명
인수로 아무 것도 주어지지 않으면, finger는 현재 시스템에 로그인되어 있는 사용자들을 보여준다. 옵션이 주어지지 않으면, 기본적으로 -l 옵션을 사용한 것으로 간주된다.

사용예
$ finger
Login Name Tty Idle Login Time Office Office Phone
blade kimtaihan 2 1 Oct 20 11:31
root root 1 Oct 20 11:28


fsck
: 파일 시스템이 완전한 상태를 유지하고 있는가를 검사하고, 잘못된 것은 바로 잡는다.

문법
fsck [ -arsVN ][ 파일시스템 ]

옵션
-a : 검사도중 발견된 에러를 자동적으로 복구한다.
-r : 검사도중 에러가 발견되면 복구할 것인가를 물어온다. 이것은 하위 호환성을 위한 것으로서 사실상은 사용되지 않는다.
-s : 병렬적인 방법이 아니라 순차적인 방법으로 검색한다.
-V : 검색중 각종 정보를 자세하게 보여준다.
-N : 실제로 검사 작업을 하지는 않도록 한다.

설명
이것은 시스템이 처음 가동될 때 자동으로 호출된다. 이름은 file system check를 줄인 것으로, 파일 시스템을 스캔(scan)하여 일관성을 유지하고 있는가를 검사한다.

디스크의 블록이 bitmap에는 사용되지 않은 상태로 표시되었음에도 불구하고 inode로부터 참조된다든지 반대로 사용된 블록으로 표시되었는데도 inode로부터 참조되지 않는 일이 있는가를 검색한다. 그 외에도 inode 링크계수가 올바른지 두 개 이상의 inode가 같은 블록을 참조하는지 혹은 블록번호가 유효한 것인가 등의 여러 가지를 검사한다.

-a 옵션을 사용하였다면 검사도중 발견된 오류는 자동으로 복구된다. -r 옵션을 사용한다면 반드시 -s 옵션을 함께 사용해야 한다. fsck는 기본적으로 한꺼번에 몇 개의 검사를 병행하는 병렬 작업을 하기 때문에 하나의 에러를 발견하더라도 다른 검사는 계속 수행되고 있다. 검사 시간을 최대한 절약하기 위해서 병렬 작업을 하기 때문에 사용자의 수정과 다른 검사 작업의 호홉이 맞지 않을 수 있다. 그러므로 -s 옵션을 주어서 오직 하나의 검사 작업만 진행되도록 해야 한다. 그러나 -r 옵션은 하위 버전과의 호환성을 위한 것으로서 사용자는 -a 옵션만을 사용하는 것으로서 충분하다. 파일 시스템을 지정해 주지 않으면 /etc/fstab 파일에 나열된 파일 시스템을 검색한다.



grep/fgrep
파일내에서 특정 패턴을 검색한다. 이름은 Global Regular Express Printer 의 머리글자이다.
문법
grep [ -vclhnief ] 표현 파일명(들)
fgrep [ -vclhnief ] 문자열 파일명(들)

옵션
-V : 일치되는 내용이 없는 라인을 표시한다.
-C : 일치되는 내용이 있는 행의 개수를 센다.
-I : 일치되는 내용이 있는 파일의 이름만을 표시한다.
-h : 일치되는 내용을 찾은 파일의 이름을 표시하지 않는다.
-n : 일치 내용이 있는 행은 행번호와 함께 표시된다.
-i : 대소문자 구분을 하지 않는다.
-e 표현 : 표현이 하이픈 문자로 시작될 때 사용한다.
-f 파일 : 찾으려는 문장이나 표현이 있는 파일을 지시한다.

설명
원하는 탐색 단어 혹은 문장을 검색한다. 표현은 일반 표현식을 사용한다. fgrep은 문자열을 검색할 때 빠르게 사용할 수 있다.

사용예
$ grep catch myletter

myletter에 catch라는 단어가 있는지 검사한다.
$ grep "[Cc]atch" myletter

앞 글자가 대소문자인지 상관하지 않고 catch라는 단어를 찾는다. 이것은 다음의 fgrep 명령과 같은 동작을 한다.
$ fgrep catch myletter
halt
: halt는 아무런 경고없이 시스템을 즉시 종료시킨다.

문법
halt

설명
시스템이 halt되면 'System halted' 메시지가 나오고, 시스템은 정지한다. halt는 옵션을 가지지 않는다.

명령이 내려지면 일련의 마무리 작업을 수행한 후에 정지한다. 시스템 종료 기록도 /var/adm/wtmp 로그 파일에 추가된다.


head
: 파일의 처음 부분을 출력한다.

문법
head [ -행수 ] [ 파일이름(들) ]

옵션
-행수: 출력될 행수를 지정한다.

설명
옵션으로 주는 행 숫자는 화면에 표시될 행의 개수를 의미한다. 만일 그것이 주어지지 않는다면 기본적으로 10개의 행을 출력한다.

사용예
$ cat letter
원일이에게.
안뇽? :-)
자네가 돈을 빌려간지도 1년이 넘었네.
난 포기 안하지.
하루속히 갚기를 바라네.
독촉해서 미안하군
건강하길...
1997년 모월 모일 친구가.

문서의 앞 머리 세 줄만 확인하기 위해서 다음과 같이 할 수 있다.
$ head -3 letter
원일이에게.
안뇽? :-)
자네가 돈을 빌려간지도 1년이 넘었네.


hostname
: 현재 설정되어 있는 호스트의 이름을 표시하거나 변경한다.

문법
hostname [ 호스트이름 ]

설명
이것은 인수없이 사용된다면 현재 설정되어 있는 호스트 이름을 보여준다. 리눅스는 기본적으로 프롬프트에서 호스트의 이름을 보여줄 것이다. 혹은 사용자가 프롬프트에 호스트 이름이 나타나도록 할 수도 있다. 인수로서 새로운 호스트 이름을 지정한다면 새로 지정된 이름으로 호스트 이름을 바꾼다. 하지만 이런 작업은 수퍼 유저만이 할 수 있다.

사용예
$ hostname
Blade


id
: 시스템에 등록된 ID를 확인한다.

문법
id [ -gGnru ]

옵션
-g: 그룹 ID만을 출력한다.
-G: 추가 그룹들만을 출력한다.
-n: ID 번호대신 이름으로 출력한다.
-r: 실제 사용자나 그룹 ID를 출력한다. 다른 옵션과 함께 사용한다.
-u: 사용자의 ID만을 출력한다.

사용예
$ id -un


jobs
: 현 터미널에서 수행된 작업들을 간략하게 나열해준다.

문법
jobs [ -I ]

옵션
-I: 프로세서 번호를 추가해서 보여준다.

설명
jobs 명령에 대한 것은 fg와 bg명령에 대한 설명과 함께 3장을 참고하라.
여기서는 프로세서 번호와 jobs 볼 수 있는 작업 번호에 대해 생각해 보자.

작업번호는 한 사용자의 작업에 대한 것으로, 1번부터 순서대로 부여되지만 다른 터미널의 다른 사용자도 같은 번호의 job을 가지는 것이다. 또한 이 작업 번호는 중지되었거나 백그라운드에 있는 것들만이 작업 번호가 주어진다는 점이다. 프로세서 번호는 시스템 중심적이고, 작업 번호는 사용자 중심적인 번호인 것이다.



join
: 두 개의 정렬된 파일을 하나로 수평 병합한다.
문법
join [ -aejotv ] [파일명]1 [파일명]2

옵션
-an : 첫 번째나 두 번째 파일로부터 일치하지 않는것도 처리, n은 1이나 2이다.
-e 문자열 : 비어 있는 필드는 문자열로 대체한다.
-j n m : 파일n의 m번째 필드를 두 파일에 병합한다.
-o 파일 : 명시된 파일의 형태에 따라서 출력을 만든다.
-t 문자 : 필드 구분 문자를 정한다. 기본적으로 공백, 탭, 기행 문자다.
-v 파일 : 파일1이나 파일2의 짝이 연결되지 않는 행을 지정된 파일로 출력한다.

설명
두 파일의 내용을 하나의 파일로 병합하는데, cat을 사용하는 것처럼 한 파일의 뒤에 다른 하나를 추가하는 것이 아니라 각 행끼리 붙이기를 한다.
이 명령을 사용하면 두 개의 다른 데이터를 가진 목록을 합칠 수 있다.


kill
: 현재 수행중인 프로세서에게 시그널을 보낸다. 보통 kill 명령은 프로세서를 죽이는 데에 사용된다. 그래서 이 유틸리티의 이름도 kill이 되었다.

문법
kill [-signalID] PID
kill -l

옵션
-signalID : 프로세서에게 보낼 시그널을 지정한다. 시그널은 번호로 지정될 수도 있고 시그널 이름으로 지정될 수도 있다.
-l : 시그널 종류를 나열한다. 시그널의 종류는 시그널 번호 순서대로 이름으로 나열한다.

설명
시그널의 종류를 지정하지 않으면 프로세서를 종료시키는 의미로 디폴트 시그널 ID 15번을 보내게 된다.

예를 들면 당신이 시스템을 사용을 마치고 로그아웃할 때는 시그널 ID 1번의 HUP(hang up) 시그널이 시스템으로 전달되며, 이 시그널은 당신의 셸 상태에서 실행중인 모든 프로세서를 종료시키고(앞에서 언급한 nohup에 의한 프로세서는 제외) 로그아웃하게 한다.

사용예

$ kill -l <return>
1) SIGHUP 2) SIGNT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGPPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOL 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR

$ kill -9 16034
$ kill -kill 16034 ,,두 명령은 같은 의미이다.
$ kill -9 0

이것은 모든 프로세서를 종료시킨다.



less
: more와 유사하게 페이지 단위로 문서를 보여준다. 이것은 문서의 앞으로도 이동하는 것이 가능하다.

문법
less [ -?acCeEinqQsx ] 파일명(들)

옵션
-? : less에서 사용할 수 있는 명령들에 대한 도움말을 제공한다. 이 옵션이 사용되면 다른 인수는 무시되고, 도움말 화면을 보여준다.
-a : 마지막 라인이 화면에 출력되고 나서 탐색을 시작한다.
-c : 필요할 때 전체 화면은 다시 갱신한다.
-C : -c 옵션과 같지만 갱신할 때 화면 전체를 지우고 시작한다.
-e : 두 번째로 파일의 끝에 도달하면 자동적으로 종료한다.
-E : 파일의 끝에 도달하기만 하면 자동적으로 종료한다.
-i : 대소문자를 구분하여 탐색한다.
-n : 행번호를 추가한다.
-q : 특정 에러가 발생하지 않으면 아무 소리도 내지 않고 조용히 동작한다.
-Q : 결코 아무 소리도 내지 않는다.
-s : 연속되는 공백 라인은 하나의 행으로 처리한다.
-x 숫자 : 수치를 지정해서 탭 간격을 조정한다. 기본값은 8이다.

설명
less는 많은 옵션과 키 사용법이 있다. 온라인 레퍼런스를 참조하기 바란다.

사용예
$ less lovemessage


ln
: 두 개의 파일 사이에 링크를 만들어, 하나의 파일을 두 개 이상의 이름으로 접근이 가능하도록 한다.

문법
ln [ -s ] 파일명1 파일명2
ln 파일명들 디렉토리

옵션
-s : 하드 링크 대신 심볼릭 링크를 만든다.

설명
유닉스 파일 시스템의 링크 개념의 자세한 내용에 대해서는 다른 자료를 참고하라. 파일을 복사하는 대신 링크를 사용하면 디스크 공간을 매우 절약할 수 있다.

위에서 보면 첫 번째 형식에서 파일명2는 원하는 링크 파일의 경로와 이름이 된다. 이것은 일종의 alias(별명)라고 생각할 수 있다. 두 번째 형식에서 파일명들은 링크되기 원하는 파일들의 이름이고, 디렉토리는 링크된 파일이 지정되기 원하는 위치이다. 링크에 익숙해지면 ln명령은 cp 명령을 사용하는 것처럼 간단하게 사용할 수 있을 것이다.

사용예
$ ln project theplan ,,두 개의 이름은 같은 문서를 의미한다.


longname
: 이것은 현재 시스템에서 당신이 사용하는 로그온 이름을 보여준다.

문법
longname

설명
longname은 옵션을 가지지 않는다. 이름은 /etc/utmp 파일을 알아낸다.

사용예
$ longname


ls
: 파일 시스템 상의 파일을 목록을 보여준다.

문법
ls [ -aCxdlstucriFR ][ 파일명(들) ]

옵션
-a : 도트로 시작되는 이름을 가진 파일명도 전부 보여준다.
-C : 가로 순서로 나열하여 출력한다.
-x : 세로 순서로 나열하여 출력한다.
-d : 현재 디렉토리에 대한 정보를 출력한다.
-l : 각 파일들에 대한 소유자, 권한, 갱신일 등의 자세한 정보를 출력한다.
-s : 파일이 얼마나 많은 디스크 블록을 차지하고 있는가를 보여준다.
-t : 파일 갱신일 순서대로 정렬한다.
-u : 엑세스(access)한 날짜 순서대로 정렬한다.
-c : inode가 마지막 바뀐 시간 순서대로 정렬한다.
-r : 정렬된 순서의 역으로 출력한다.
-i : 파일의 inode 번호를 보여준다.
-F : 파일의 특성을 쉽게 알 수 있는 문자를 나타낸다. +는 실행 가능한 파일을, /는 디렉토리 이름을 의미한다. @는 심볼릭 링크를 나타내고, =는 소켓(socket)을 나타낸다. 하지만 여러분의 리눅스는 기본적으로 이러한 특성을 보여줄 것이다.
-R : 현 디렉토리의 내용은 물론이고 서브 디렉토리의 내용까지 전부 보여준다.

설명
-l 옵션을 사용하여 볼 수 있는 정보 중 권한(permission) 정보 앞에 있는 파일 형태에 대한 기호는 다음과 같다.

- 일반 파일
d 디렉토리
b 디스크의 같은 블록 형태의 장치
c 터미널과 같은 문자 형태의 장치
p 이름붙여진 파이프(pipe)
s 세마포어(semaphore)
m 공유메모리(Shared memory)

사용예
$ ls -la /root


mail
: 전자 우편을 사용하기 위해 mail이라는 명령을 사용한다. System V 같은 계열의 유닉스에서는 mailx라고 하기도 한다. BSD에서는 mail이라고 하며, 당연히 BSD 계열인 리눅스에서도 그렇게 부른다.

문법
mail [ -Hf ][ 사용자ID ]

옵션
-f : 편지가 수신된 파일을 지정하며, -f 옵션 뒤에 파일 이름을 지정한다.

설명
사용자 ID를 명시되지 않고, 인수없이 mail을 실행하면 수신된 편지를 읽을 수 있다. 편지는 mail 디렉토례 사용자ID 이름으로 만들어진 파일에 저장된다.


man
: 사용하고자 하는 유닉스 유틸리티에 대한 매뉴얼(manual)을 검색해서 보여준다.

문법
man [ 장 ] 단어
man -k 키워드

옵션
-k : 인수로 주어진 단어를 키워드로 사용하여, 해당 키워드가 발견되는 모든 매뉴얼의 내용을 검색하여 보여준다.

설명
셸을 사용할 때 어떤 명령의 사용법이 기억나지 않는 경우가 있다. 혹은 매번 사용하던 명령이라도 특수한 옵션이 필요할 때 그 기호나 사용법을 정확히 확인해야 하는 경우가 많이 있다. 물론 참고 서적을 보면 되겠지만 터미널 상에서 필요한 도움말을 언제라도 제공받을 수 있다. 시스템에 내장된 매뉴얼은 빠르게 볼 수 있을 뿐만 아니라 그 내용도 완벽한 것이어서 옵션의 종류 같은 것은 빠진 것이 없다. 만일 온라인 레퍼런스를 모두 종이로 출력한다면 그 분량은 엄청날 것이 틀림없다.

위에서 보인 첫 번째 형식은 매뉴얼의 장 번호를 이름과 함께 명시해서 검색할 수도 있다. 하지만 보통은 그것을 생략하고, 검색하고자 하는 제목만을 인수로 전달해서 사용한다. 그러면 자세한 내용을 볼 수 있을 것이다. 출력된 내용은 화살표 키를 사용해 위아래로 자유로이 스크롤할 수 있다.

사용예
$ man telnet

mcd
: MSDOS 시스템으로 현재 사용하는 디렉토리 장소를 이동한다.

문법
mcd dos디렉토리

설명
dos 디렉토리는 슬래쉬나 백 슬래쉬 모두 사용할 수 있으며, MSDOS에서 사용되는 백 슬래쉬(\)나 와일드 카드를 사용하려면 따옴표를 사용하여 셸이 번역하는 것을 미리 막아야 한다.

사용예
$ mcd a:/dos


mcopy
: MSDOS 파일 시스템으로 혹은 DOS 파일 시스템의 파일을 복사한다.

문법
mcopy [ -tnvm ] 파일명1 파일명2

옵션
-t : 텍스트 파일 복사시 CR/LF 문자를 \n 하나로 바꾼다.
-n : 파일을 덮어쓰게 되는 경우에도 경고하지 않는다.
-v : 자세히 안내문을 보여준다.
-m : 파일 갱신 시간을 보존한다.

사용예
$ mcopy -t letter a:letter.txt


mdel
: MSDOS 파일 시스템에서 파일을 제거한다.

문법
mdel [ -v ] 파일명

옵션
-v : 진행되는 상황을 자세히 보여준다.

사용예
$ mdel a:/letter.txt


mdir
: MSDOS 디렉토리의 목록을 보여준다. MSDOS 프롬프트 상의 dir과 같은 동작을 한다.

문법
mdir [ -w ][파일명]

옵션
-w : 파일 크기나 생성 날짜는 제외하고 넓은 형식으로 보여준다.

사용예
$ mdir a:/dos



mesg
: 다른 터미널의 사용자가 당신에게 write 명령 등으로 메시지를 보낼 수 있는가 아닌가를 결정한다.

문법
mesg [ y or n ]

옵션
당신의 터미널이 다른 사용자의 메시지를 받기 원한다면 y, 그렇지 않다면 n을 선택한다. 옵션을 선택하지 않으면 mesg는 현재 터미널의 메시지 수신 가능 여부를 확인하여 알려준다. 보통 기본적으로 터미널은 메시지를 수신할 수 있다.

사용예
$ mesg ,,다른 이의 메시지를 수신할 수 있는지 알려준다.
$ mesg n ,, 당신의 터미널이 메시지 수신을 거부하도록 한다.



mkdir
: 디렉토리를 새로 만들기 위해 mkdir 명령을 사용한다.

문법
mkdir [ -m mode ][ -p ] directory

옵션
-m : 디렉토리를 만들 때 같이 사용하여 사용자 권한을 줄 수 있다.
-p : 만들 디렉토리의 상위 디렉토리까지 한꺼번에 만든다.

사용예
$ mkdir blade.seoul ,,현재 디렉토리의 하위 디렉토리 작성
$ cd blade.seoul
$ mkdir -p blade/books

이것은 현재 디렉토리에서 하위 디렉토리 blade를 먼저 만든 후에 다시 그 하위 디렉토리로 books를 만든다.



more
한 화면씩 츨력을 보여주는 유틸리티, 한 번에 전체적으로 볼 수 없는 파일은 이것을 사용하여 스크롤을 제어할 수 있다.

문법
more [ -ncdflspu ][ +줄번호 ][ 파일이름(들) ]

옵션
-n : 여기서 n은 숫자를 의미하여, 숫자는 출력 윈도우의 행수를 지정한다.
-c : 위에서부터 한 행씩 지운 후 한 행씩 출력한다. 보통은 화면 전체를 지운 후 각 행을 출력하기 시작한다. 특정한 터미널을 위해 사용한다.
-d : 스페이스나 q 키를 누르라는 프롬프트를 출력한다.
-f : 화면의 행이 아닌 논리적인 행 수를 계산한다. 보통은 긴 칼럼의 행은 화면에서 행바꿈을 하여 새로운 행으로 계산된다. -f 옵션을 사용하면 이러한 행은 계산하지 않는다.
-s : 여러 개의 빈 공백행은 하나로 취급한다.
-p : 스크롤하지 않는다. 대신 화면을 지우고 출력한다.
-u : 밑줄 차기를 금지한다.

설명
more는 BSD에 있었으나 지금은 System V 등에도 있으며 리눅스는 물론이고 대부분의 유닉스가 기본적으로 가지고 있는 유틸리티이다. 기본적으로 more는 한 번에 한 페이지 단위로 파일의 내용을 출력한다.

한 화면만큼 내용을 출력한 후 화면 하단에 ‘-More-' 라는 메시지를 출력하고는 잠시 출력을 중단한다. 다시 다음 페이지로 진행하기를 원한다면 스페이스바를 누른다. 또는 중단하기를 원한다면 q 키를 눌러라. 여러 개의 파일 내용을 연속적으로 보고자 한다면 원하는 여러 개의 파일 이름을 나열하면 된다.

more 명령은 몇 가지 명령을 인식할 수 있다. 스페이스 바를 누르는 것을 포함해서 다음과 같은 조작을 하는 것이 가능하다.

<return> : 한 줄만 스크롤된다.
D : 반 페이지만 뒤로 이동한다.
<space> : 한 페이지만 뒤로 이동한다.
B : 한 페이지 앞으로 이동한다.
H : 도움말을 제공한다.
V : vi 에디터를 부른다. 에디터를 종료하면 원 위치로 돌아간다.
Q : more 를 종료한다.

사용예
$ cat document.97 | more

기본적으로 more 명령은 첫 번째 줄 내용부터 출력한다. 하지만 원하는 부분부터 출력을 원한다면 다음과 같은 방법으로 실행할 수 있을 것이다. 다음은 13번째 행부터 출력을 시작한다.
$ more +13 loveletter.txt


mount
: 다른 파티션의 디스크나 물리적으로 다른 기억 장치를 파일 시스템으로 연결한다.

문법
mount [ -vwrnta ] 장치명 디렉토리

옵션
-v : 마운트 작업을 수행하면서 자세한 정보를 출력한다.
-w : 마운트되는 파일 시스템을 읽기와 쓰기가 가능하도록 한다.
-r : 마운트되는 파일 시스템이 읽기 동작만 가능하도록 한다.
-n : 마운트 정보가 기록되는 /etc/rntab 파일에 정보를 기록하지 않는다.
-a : /etc/fstab 파일에 있는 모든 파일 시스템을 마운트하도록 한다.
-t 형태 : 마운트되는 파일 시스템의 형태를 지정한다.

설명
마운트 개념은 다른 PC용 오퍼레이팅 시스템에 비해 매우 우수한 개념이라 할 수 있다. 사용자는 다른 오퍼레이팅 시스템도 마운트하여 접근할 수 있다. -t 옵션을 사용하여 그 형식을 지정하면 대부분이 형식이 가능하다. -t 옵션으로 지정할 수 있는 형태는 msdos, hpfs, minix, ext, ext2, proc, nfs, umsdos, sysv 등으로 사용자가 원하는 모든 파일 시스템이 접근할 수 있을 것이다. 현재 시스템에 마운트된 장치의 정보는 /etc/mtab 파일에 저장되어 있다.

사용예
다음의 사용예는 다른 파티션 영역을 차지하고 있는 DOS 파일 시스템을 마운트하는 것이다. 사실, 이것은 필자가 리눅스를 설치하고 나서 실제로 했던 작업을 그대로 적어놓은 것이다. /dev/hda1 이 의미하는 바에 대해서는 본문을 참조하라(물론 이것은 독자가 설치한 방식에 따라서 다를 것이다.) 하드 디스크의 이 영역에는 Windows 95가 설치되어 있는데, 이것도 DOS 파일 시스템 형식으로 접근이 가능하며 파일의 읽기와 쓰기가 자유롭다.
$ mount -t msdos /dev/hda1 /mswin


mv
: 파일의 위치를 이동하거나 파일의 이름을 바꾸어준다.

문법
mv [ -fi ] 파일명1 파일명2
mv [ -fi ] 파일명(들) 디렉토리명

옵션
-f : 같은 이름의 파일이 존재하고 쓰기 권한이 금지되어 있더라도 물어보지 않고 덮어쓰기를 해버린다. 이런 경우 이 옵션을 사용하지 않으면 사용자에게 다시 확인을 할 것이다.
-i : 파일을 덮어쓰기 전에 사용자에게 확인한다.

설명
기존에 있던 파일을 원치않게 잃어버리는 수가 있기 때문에 확실하지 않다면 -i 옵션을 사용하는 것을 권한다.

사용예
$ mv sisap.hong victor.dongki readme.txt ../friend
$ mv blade.Z ../kimtaihan.Z
$ mv /home/blade /home/friend

만일 어떤 파일을 현재의 위치에서 다시 현재의 위치로 이동한다면 어떤일이 일어날까? 고민할 것 없다. 답은 당연히 ‘아무 일도 일어나지 않는다’ 이다. 이것은 어떤 의미를 가지지 못한다. 하지만 파일 이름을 바꾸면서 현재의 위치로 ‘이동’한다면, 그것은 파일의 ‘이름을 변경’ 하는 것과 같은 효과를 거둘 것이다.
$ mv sisap.doc LeeKiHong.doc



newgrp
: 현재 그룹 ID를 변경한다.

문법
newgrp 그룹명

설명
이 명령을 사용하여 다른 특성 그룹들의 파일을 다룰 수 있다. 그룹을 바꾸면 패스워드를 물어오는 프롬프트가 나타난다. 그러면 그에 해당하는 그룹 패스워드를 입력해야 한다.

No such group : No such file or directory

이것은 당신이 바꾸고자 하는 그룹 이름이 존재하지 않는다는 것이다. 그룹 이름을 잘못 지정하면 이러한 메시지를 볼 수 있을 것이다.

passwd
: 자신의 패스워드를 관리한다.

문법
passwd [ user ]

설명
passwd를 부르면서 사용자 이름을 지정하면 그 사용자의 암호를 관리할 수 있다. 물론 이것은 슈퍼 유저만이 할 수 있는 일이다. 암호는 암기하기는 쉬워야 하지만 타인이 추측하기는 어려워야 한다. 보통은 아무 인수없이 명령을 사용하며 암호를 바꿀 것인지 아닌지를 선택할 수 있다.

사용예
$ passwd


paste
: 하나 혹은 그 이상의 파일로부터 칼럼 형태의 출력을 만든다. 이것은 cut과 함께 사용되는 경우가 많다.

문법
paste [ -s ][ -d구분문자 ] 파일명(들)

옵션
-s : 각 파일을 순회하면서 paste를 수행한다.
-d구분문자 : 어떠한 문자로 칼럼을 구분하는지 지정한다. 기본값은 탭 문자이다.

설명
paste를 사용할 때 서로 붙여지는 파일명을 지정하는데, 이때 하이픈(-)으로 생략하면 표준 입력을 받아들이겠다는 뜻이 된다. 또한 paste의 출력은 항상 표준출력 장치로 나아간다.

사용예
$ paste -d' ' namelist.tmp /home/data.tmp
두 개의 파일을 칼럼으로 합치고 그것을 화면으로 출력한다.


ps
: 유닉스는 동시에 여러 개의 프로세서가 동작되기 때문에 사용자가 그것들의 목록과 상태를 점검할 필요가 있다. ps라는 이름은 processor status를 의미한다. ps를 사용하여 프로세서들의 상태를 점검할 수 있다.

문법
ps [ -lujsvmaxScewhm ]
ps [ -txx ]

옵션
-l : 자세한 형태의 정보를 출력한다.
-u : 각 프로세서의 사용자 이름과 시작 시간을 보여준다.
-j : 작업 중심 형태로 출력한다.
-s : 시그널 중심 형태로 출력한다.
-v : 가상 메모리 중심 형태로 출력한다.
-m : 메모리 정보를 출력한다.
-a : 다른 사용자들의 프로세서도 보여준다.
-x : 로그인 상태에 있는 동안 아직 완료되지 않은 프로세서들을 보여준다. 유닉스 시 스템은 사용자가 로그아웃하고 난 후에도 임의의 프로세서가 계속 동작하게 할 수 있다. 그러면 그 프로세서는 자신을 실행시킨 셸이 없이도 계속 자신의 일을 수행한다. 이러한 프로세서는 일반적인 ps 명령으로 확인할 수 없다. 이때 -x 옵션을 사용하면 자신의 터미널이 없는 프로세서들을 확인할 수 있다.
-S : 차일드(child) CPU 시간과 메모리 페이지 결함(fault) 정보를 추가 한다.
-c : 커널 task_structure로 부터 명령 이름을 보여준다.
-e : 환경을 보여준다.
-w : 긴(wide) 형태로 출력한다. 한 행 안에 출력이 잘리지 않는다.
-h : 헤더를 출력하지 않는다.
-r : 현재 실행중인 프로세서를 보여준다.
-n : USER 와 WCHAN 을 위해 수치 출력을 지원한다.

설명
기본적으로 ps는 현재 명령이 내려지는 셸에서 만들어진 프로세서들의 목록만을 보여준다. ps는 자신이 실행되는 당시, 현재의 셸에 의해서 수행된 프로세서들을 검사하고 보고한다는 점을 생각하자. 그러면 ps의 출력결과 리스트에 ps 자신이 있는 이유를 쉽게 이해할 수 있을 것이다. 각 필드의 의미는 다음과 같다.

COMMAND : 명령어의 이름
PID : 프로세서 ID, 각 프로세서를 구분하기 위한 고유의 ID
RSS : 프로세서에 의해 사용되는 실제 메모리의 용량(K byte 단위)
USER : 프로세서를 실행시킨 소유자의 계정을 보여준다.
SZ : 프로세서의 자료와 스텍 크기의 (K byte 단위)
TIME : 현재까지 사용된 CPU의 시간(분,초)
TT : 프로세서의 제어 터미널(t3=/dev/tty3)
%CPU : 마지막 분동안 프로세서가 사용한 CPU시간의 백분율
START : 프로세서가 시작된 시간
STAT : 프로세서의 상태

이중 STAT 필드는 몇 가지의 부호를 사용해서 프로세서의 상태를 표시하고 있다. 그것들을 정리해 보면 다음과 같다.

P : 수행 가능/수행중
T : 일시 정지
D : 디스크 입출력 대기 같은 인터럽트할 수 없는 대기상태
S : 20초 미만의 짧게 잠듦(sleep)
I : 20초 이상의 길게 잠듦
Z : 좀비(zombi) 프로세서

좀비(zomb) 상태라는 것은 프로세서가 사라질 때 시그널 처리의 문제로 완전히 소멸되지 못한 상태를 말한다.

사용예
$ ps


pwd
: 현재 작업하는 디렉토리를 알기 위해서 pwd 명령을 사용한다.

문법
pwd

설명
현 디렉토리(current directory)가 무엇인지 보여준다.

사용예
$ pwd
/home/blade



reboot
: 시스템을 리부팅한다.

문법
reboot [ -q ]

옵션
-q : 현재의 프로세서들을 종료시키지 않고, 부팅 동작만을 수행한다. 이 옵션을 사용하면 더 빠르게 리부팅할 수 있다. 다시 부팅한 기록은 로그 파일인 /var/adm/wtmp에 기록된다.

설명
이것은 모든 사용자 프로세서를 종료시키고 디스크로부터 리눅스를 다시 부팅한다. 시스템을 리부팅하기 위해 shutdown 명령의 -r 옵션을 사용할 수도 있지만 그보다 reboot 명령을 사용하는 것이 더 편리해 보인다.

사용예
$ reboot


rcp
컴퓨터 사이에서 파일을 복사할 때 사용된다. “remote cp"에서 이름이 유래한다.

문법
rcp [ -rpkx ] 파일명1 파일명2
rcp [ -rpkx ] 파일명들 디렉토리

옵션
-r : 하위 디렉토리까지 재귀적으로 모두 복사한다.
-p : 파일의 시간과 모드를 보존한다.
-k : kerberos ticktets을 요구한다.
-x : 복사되는 모든 데이터에 암호화 과정을 거친다.

설명
원격 파일과 원격 호스트 이름은 콜론을 사용하여 구분한다. 마지막 인수가 디렉토리 이름이라면 지정된 모든 파일들은 그곳으로 복사된다.

사용예
$ rcp victor.com:/root/* /home/victorfile
원격 호스트 victor.com의 /root에 있는 모든 파일들을 자신의 컴퓨터에 있는 디렉 토리 /home/vitorfile로 복사한다.



rm
파일을 지우는 명령이다. 이것은 remove의 의미를 가진 이름임을 기억하라.

문법
rm [ -firv ] 파일명

옵션
-f : 보통 지울 수 있는 권한이 없으면 안되지만, 이 옵션을 사용하면 성가신 작업을 하지 않고서도 강제로 파일을 지울 수 있다.
-i : 파일을 지울 것인가 다시 물어본다. 지우기를 원한다면 y를 누른다.
-r : 서브 디렉토리의 파일도 모두 재귀적으로 지운다.
-v : 파일을 지우기 전에 파일의 이름을 나타내준다.

설명
rm 명령의 동작은 정확히 말해서 ‘파일의 레이블을 삭제한다’라고 말할 수 있다. 단순히 파일을 지운다고 말하는 것은 틀릴 수도 있는 것이다. 왜냐하면 유닉스 상에서는 하나의 파일이 여러 다른 디렉토리에서 동시에 여러개의 이름을 가질 수 있기 때문이다. 만일 어떤 파일이 세 개의 레이블을 가지고 있다면 rm 명령으로 하나의 레이블을 지우는 것은 그 파일 자체를 지우지는 못한다. 다른 두 개의 파일 이름이 아직 유효하기 때문이다. 다시 두 번째 레이블을 지우더라도 파일은 하나의 파일 이름을 가지고 살아있으며, 마지막 하나의 파일 이름이 제거될 때에만 파일은 지워지는 것이다.

사용예
$ rm blade.Z
$ rm report.txt tempfile object.mainroutine hello.java
$ rm -r blade ,, blade와 하위 디렉토리 파일 모두를 제거



rmdir
원하는 디렉토리를 제거한다.

문법
rmdir [ -p ] 디렉토리

옵션
-p : mkdir의 -p 옵션의 반대 동작으로 하위 디렉토리와 그 상위 디렉토리 모두를 제거할 수 있다. 이때 모든 디렉토리는 비워져 있어야 한다. 수행 후 결과가 어떻게 되었는지를 보여준다.

설명
제거하기를 원하는 디렉토리는 미리 모든 파일들이 비워져 있어야 한다. 이러한 작업을 편리하게 하기 위해서는 파일을 지우는 명령인 rm 명령을 -r 옵션과 사용하면 된다.

사용예
$ rmdir -p sisap/books
디렉토리가 비워져 있다면 books를 제거한 후 sisap을 제거한다.



shutdown
시스템을 종료할 때 일반적으로 사용되는 명령이다.

문법
shutdown [ -thnrfck ] 시간 [ 메시지 ]
shutdown now

옵션
-t n : t 옵션 뒤에 n초를 명시해서, 경고 메시지를 보낸 후 n초 후에 kill 시그널을 보낸다.
-h : shutdown시 halt를 실행하게 한다.
-n : 디스크 동기화 동작의 수행을 금지한다. 이런 옵션은 보통 사용할 일이 없을 것이다.
-r : 시스템 종료를 완료하고 나서 다시 부팅 과정을 수행한다.
-f : 빠른 리부팅을 한다. 리부팅시 파일 시스템 검사를 하지 않는다.
-c : 이미 예약되어 있는 shutdown을 취소한다. 이 옵션을 준다면 시간 인수는 줄 수 없다. 하지만 메시지는 사용자들에게 줄 수 있다.
-k : 모든 동작을 제대로 수행하지만 시스템을 종료할 시간이 되면 아무 것도 하지 않는다. 보는 사람으로 하여금 ‘절로 누구 놀리나?’하는 말이 나오게 한다. k는 ‘just kidding'의 의미라고 한다.

설명
요즘은 컴퓨터를 끄기 전에 반드시 shutdown 절차를 거쳐서 시스템을 정리해야 한다는 것이 상식으로 통한다. 8비트 컴퓨터를 사용할 때는 그런 복잡한 것은 생각하지 않아도 문제 없었는데 말이다. 하드웨어와 스위치를 내리는 데에 소프트웨어의 허락을 받아야만 하는 것이다. shutdown 명령은 미리 사용자들에게 경고만을 보내고, 정해진 시간에 시스템을 종료한다. 시간은 24시간 단위의 표기법을 사용하며 종료 5분전에는 시스템에 로그인이 금지된다. 시스템 종료 시간이 가까워짐에 따라 각 사용자들에게 메시지를 주기적으로 출력하여 경고를 보낸다.

사용예
다음은 밤 11시 30분에 시스템을 종료하도록 예약하며 사용자들에게 그것을 알린다.
$ shutdown 23:30 System will be down at 11:30 PM!!
시간을 명시할 때 now를 사용하면 곧바로 시스템을 종료한다. 리눅스 사용자들은 컴퓨터를 끄기 전에 이렇게 하면 간단하다. 혼자 사용하고 있을 때 번거로운 과정은 필요 없을 테니까 말이다.



sleep
sleep이라는 명령은 이름 그대로 잠자는 일 외에는 하는 일이 없다.

문법
sleep 시간

설명
시간은 초 단위의 정수 숫자이다. 전면(foreground)에서 수행된다면 사용자의 터미널은 정해진 시간만큼 잠을 잘 것이다. 물론 정해진 시간에 즉각 일어나니 안심해라. 원한다면 ^C로 흔들어 깨울 수도 있다. sleep을 사용하는 가장 좋은 예는 3장에서 본 것과 같이 다중 작업을 시행할 때이다.

다음과 같은 확인자를 사용한다면 다른 시간 단위를 사용할 수 있다.

S 초 m 분
h 시간 d 날짜


sort
파일내의 단어 순서를 행 단위로 정렬한다.

문법
sort [ -cmuodfiMnrtb ] 파일이름(들)

옵션
-c : 파일이 정렬되었는지 검사한다. 그렇다면 아무런 출력도 하지 않는다.
-m : 특정한 파일을 병합한다. 파일은 이미 정렬되었다고 가정한다.
-u : 고유한 행만이 출력된다.
-o 파일명: 출력 파일 이름을 지정한다. 이름은 입력 파일 이름과 같을 수 있다.
-d : 사전(dictionary)과 같은 순서대로 정렬한다. 단어 정렬 순서에는 문자, 숫자, 공백 문자만이 사용된다.
-f : 대문자와 소문자를 구별하지 않는다.
-i : 정렬에 사용되는 문자 중 프린트될 수 없는 문자는 사용하지 않는다.
-M : 단어를 정렬할 때 달을 의미하는 문자를 취급한다. FEB는 JAN보다 뒤에 정렬된다.
-n : 숫자를 같은 문자가 아닌 정말로 숫자로 취급해서 수의 크기대로 정렬한다.
-r : 역순으로 정렬한다.
-t 문자 : 단어 등 필드를 구분하는 문자를 지정한다. 탭(tab)이나 공백 문자 이외의 문자를 구분 문자로 취급하도록 한다.
-b : 단어의 뒤에 오는 공백 문자는 정렬 키(key) 값으로 무시하도록 한다.

설명
sort명령의 정렬 방법에는 다음과 같은 기준이 있다.
일반적인 알파벳 순서로 정렬하되 소문자보다 대문자가 우선한다.
대소문자 보다 숫자가 우선한다. 숫자는 처음에 오는 숫자의 순서에 의한다. 즉 숫자들도 문자처럼 취급될 뿐이지, 실제 숫자의 대소는 생각하지 않는다.

사용예
$ cat sample
speaker
audio system
Hi-Fi video
1997
4th object?
good!
$ sort sample ,, 문자를 정렬
$ cat sample ,, 분류된 내용 확인
1997
4th object?
Hi-Fi video
audio system
good!
speaker


split
텍스트 파일을 작은 조각으로 나눈다. 너무 커서 다루기 불편한 텍스트 문서를 나눌 때 사용된다.

문법
split -행 수 파일명 [ 태그명 ]

옵션
-행 수 : 몇 개의 행 단위로 조각을 나누는지 정한다.

설명
파일이 나누어지면 나누어진 파일들의 접미사는 순서대로 .xaa .xab .xac ...와 같이 붙여진다. 만일 태그 이름을 지정한다면 사용자가 지정한 태그 이름은 기본값 태그 이름의 x 문자를 대체하게 된다. 태그 이름을 block이 라고 준다면 나누어진 파일들은 .blockaa .blockab .blockac 등과 같은 접미사를 가질 것이다.

사용예
$ split -400 project.a pro
project.a 파일을 400행 단위로 나눈다. 첫 조각의 접미사는 .proaa가 된다.


su
다른 사용자 계정으로 서브 셸을 생성한다. 잠시만 다른 사용자 계정으로 작업할 필요가 있을 때 사용한다.

문법
su [ - ] [ 사용자ID ][인수]

옵션
- : 하이픈 (-)을 사용하면 새로운 셸로 로그인할 때 자신의 로그인 과정을 수행한다. 옵션이 주어지지 않으면 새로운 셸은 단지 셸 역할을 수행할 뿐이다.

설명
아무런 인수없이 su를 사용하면, 이것은 root 계정으로 로그인하기를 원하는 것으로 간주된다. 그래서 많은 사람들이 su가 ‘super user'를 의미하는 말로 생각하지만, 사실은 ’substitute user'를 의미하는 말이다. 물론 수퍼 유저의 패스워드를 알고 있어야만 한다.

su의 인수로 원하는 사용자의 ID를 주면 그 사용자의 패스워드를 물어오고, 입력한 패스워드가 일치한다면 새롭게 생성된 셸을 볼 수 있다. 그렇게 다른 사람으로 작업한 후에 exit등으로 셸을 종료하면 다시 이전에 작업하던 셸로 돌아갈 수 있다. 이 명령은 혼자서 시스템을 사용하는 리눅스 사용자들에게 매우 유용하다. 기본적으로 일반 사용자 계정으로 작업하다가 필요한 경우 수퍼 유저로 로그인하고서 필요한 일이 끝나면 다시 일반 계정 셸로 돌아갈 수 있기 때문이다.

사용예
$ whoami
blade
$ su sisap
Password: ,,여기서 sisap의 패스워드를 입력
$ whoami
sisap
$ exit ,,sisap의 셸을 종료
exit
$ whoami
blade


sync
현재 시스템 디스크의 IO 버퍼에 있는 디스크 이미지를 하드 디스크로 기록한다.

문법
sync

설명
시스템을 다운시키기 전에 버퍼에 있는 이미지를 반드시 디스크로 기록해야 한다. 그렇지 않으면 디스크는 기록된 정보의 이미지와 일치하지 않는 이미지를 가지게 될지도 모른다. 사실, 이것을 사용할 경우는 극히 드물다. 왜냐하면 shutdown등의 동작을 수행하면 그들이 자동적으로 sync를 호출하기 때문이다.
사용예
$ sync ,, 버퍼의 내용을 디스크로 기록한다.

tail
문서의 끝 부분을 화면에 출력한다.

문법
tail [ -행수 ] [파일이름들]

옵션
- 행수 : 출력될 행수를 지정한다.

설명
옵션으로 주는 행 숫자는 화면에 표시될 행의 개수를 의미한다. 만일 그것이 주어지지 않는다면 기본적으로 10개의 행을 출력한다.

사용예
head 명령을 설명하면서 사용한 문서 파일을 다시 사용해 보자.

$ tail -? letter
건강하길...
1997년 모월 모일 친구가


tar
마그네틱 테이프 기록 장치를 위한 명령이다. 파일을 테이프 기록장치로 기록하거나 읽어온다.

문법
tar 동작 [ 옵션 ] 플래그인수 파일명(들)

설명
테이프와 같은 순차적 기록 장치는 디스크와는 특성이 다르다. tar명령과 마그네틱 테이프에 대한 내용은 다른 자료를 참고하기 바란다. 리눅스를 사용하는 사람들은 테이프 기록 장치를 사용하는 경우는 거의 없을 것이다.

사용예
$ tar cf /home/blade/data.tar /home/blade/data

tcsh
tcsh는 bash와 마찬가지로 리눅스에서 사용하는 c 셸 명령 번역기이다. bash 셸이 표준 Bourne 셸에 기능을 보강한 것처럼, 이것은 C 셸의 확장판으로 생각할 수 있다. 리눅스 사용자는 tcsh를 이용해서 C 셸을 사용할 수 있다.

문법
tcsh [ -cefinstvxTVX ] [ 파일명 ]

옵션
-T : tenex라고 하는 특수한 기능을 수행하도록 한다.
-V : -v 옵션과 같지만 초기화 스크립트의 수행에도 영향을 미친다.
-X : -x 옵션과 같지만 초기화 스크립트의 수행에도 영향을 미친다.

나머지 옵션들은 bash셸과 같다. 본문 4장에서 bash 셸의 옵션에 대해 설명한 부분을 참조하라.

설명
C 셸은 Bourne 셸 이후에 만들어진 셸로, 캘리포니아 버클리 대학에서 만들었다. 또한 리눅스에서 tcsh는 csh라는 이름의 링크 파일을 가지고 있다.

표준적인 C 셸의 이름이기 때문이다. 셸에 대한 내용과 bash에 대한 사용을 참조하라.


tee
파이프 연결 출력을 양방향으로 나눈다.

문법
tee [ -ia ] 파일명(들)

옵션
-i : 인터럽트를 무시하도록 한다.
-a : 지정된 파일들로 출력이 덮어쓰지 않고, 뒤에 추가되도록 한다.

설명
이것은 파이프 연결 흐름을 두 개의 방향으로 갈라지도록 한다. 마치 파이프를 연결할 때 사용되는 T자 연결관과 같다.

사용예
$ ls -l | tee list.output | more
파일 목록을 list.output이라는 파일에 기록함과 동시에 more를 사용하여 화면으로 ls 출력 내용을 볼 수 있다.

test
파일의 각종 상태를 검사하여 결과를 알려준다. 이것은 셸 스크립트 상에서 if 문이나 while 문 등과 함께 사용되는 것이 보통이다.

문법
test 표현식
[ 표현식 ]

표현식
-r 파일명 : 파일이 읽기 권한이 있으면 참
-w 파일명 : 파일이 쓰기 권한이 있으면 참
-x 파일명 : 파일이 실행하기 권한이 있으면 참
-f 파일명 : 파일이 일반(regular) 파일이면 참
-d 파일명 : 파일이 디렉토리이면 참
-b 파일명 : 파일이 존재하고 블록 장치 파일이면 참
-c 파일명 : 파일이 문자 전용 파일(character special file)이면 참
-u 파일명 : 파일이 set-user-ID 플래그가 세트되어 있으면 참
-g 파일명 : 파일이 set-group-ID 플래그가 세트되어 있으면 참
-k 파일명 : 파일이 sticky 비트가 세트되어 있으면 참
-s 파일명 : 파일의 크기가 0보다 크면 참
-t 파일 디스크립터 : 파일 디스크립터에 해당하는 파일이 열려 있고, 터미널 장치로부터 사용되고 있으면 참, 기본 디스크립터 값은 1이다.
-z 문자열 : 문자열의 길이가 0이면 참
-n 문자열 : 문자열의 길이가 t 이상이면 참
문자열 1 = 문자열2 : 문자열1과 문자열2가 같으면 참
문자열 1 != 문자열2 : 문자열1과 문자열2가 다르면 참
문자열 : 문자열이 널(null)이 아니면 참, 널 문자열이면 거짓
정수1-eq정수2 : 두 개의 정수1과 정수2가 같으면 참
정수1-ne정수2 : 두 정수가 다르면 참
정수1-gt정수2 : 정수1이 정수2 보다 크면 참
정수1-ge정수2 : 정수1이 정수2 보다 크거나 같으면 참
이외에도 -lt(작으면) -le(작거나 같으면), !(논리부정), -a(AND), -o(OR) 등과 같은 표현을 사용할 수 있으며, 괄호를 사용할 수도 있다.

설명
표현 방식이 두 가지가 있는데, 첫 번째 형식은 test 명령을 사용하는 것이고 두 번째 표현 방식은 대괄호를 사용하여 표현식을 기술하는 것이다. 물론 두 번째 방식이 더욱 많이 사용된다. 스크리트 상에서 판독력이 훨씬 좋기 때문이다. test는 표현식을 주지 않으면 에러 메시지를 발생한다.

사용예
if [ -d blade.room ]
then
cd blade.room
echo "It's changed to the blade.room"
fi
셸 스크립트에 대한 부분을 참고하고, 자신이 직접 test 구문을 사용한 스크리트를 작성해 보라.


time
프로그램이 수행되는 시간을 측정한다.

문법
time 명령

설명
time의 인수로 측정하고자 하는 명령을 준다. time은 세 가지 다른 형태의 시간 측정 결과를 보고한다. 실제로 얼마만큼의 시간이 걸렸는가 하는 real 커널이 사용한 시간을 제외하고 CPU에서 소비된 시간을 나타내는 user그리고 실제로 얼마만큼의 커널 시간을 할애했는가 하는 sys시간이 있다. sys+user 시간이 실제로 작업에 할애된 시간이며, real 값에서 sys+user 값을 뺀 결과값은 다른 프로세서 처리에 할당된 시간이다.

사용예
$ time cc project.c
컴파일하는 데에 걸리는 시간을 측정한다.


touch
파일의 엑세스 시간이나 갱신 시간을 수정한다.

문법
touch [ -amc ] MMDDhhmmYY 파일명(들)

옵션
-a : 파일의 엑세스 시간을 바꾼다.
-m : 파일의 갱신 시간을 바꾼다.
-c : 파일명이 존재하지 않는다면 새로운 파일을 만들지 않는다.

MM : 월 DD : 날짜
hh : 시간 mm : 분 YY : 연도

설명
지정된 파일들의 시간을 바꾼다. 옵션을 지정하지 않으면 엑세스 시간과 갱신 시간 모두를 바꾼다. 즉 디폴트 옵션은 -am이다. 지정된 파일의 이름이 없다면 명시된 시간을 가지는 새로운 파일을 생성한다.

사용예
$ touch -a 0615120097 bladenote
파일의 엑세스 시간을 97년 6월 15일 12시로 변경한다.

tr
특정한 문자들을 다른 문자로 변경한다. 대부분 리다이렉션과 함께 사용한다.

문법
tr [ -cd ] 변경할 문자 변경문자

옵션
-c : 파일의 모든 내용을 보이지 않고 바꾸는 작업만 보여준다.
-d : 파일에서 변경할 문자를 제거한다.

설명
문자 표현시 백슬래쉬 문자 뒤에 8진법 숫자를 써서 문자 코드를 표현할 수 있다. 또한 [c1-c2]와 같은 하이픈 표현으로 문자의 범위를 지정할 수 있으며 [c*n]과 같은 방법으로 n 만큼의 문자 반복을 표현할 수도 있다. 변경할 문자의 변경 문자의 개수는 같아야 한다.

사용예
$ tr -d "\015\032" readme.txt readable
readme.txt의 파일에서 캐리지 리턴 문자와 eof마크를 제거하고 readable파일로 리다이렉션한다.



true
셸 상에서 참의 의미를 가지는 0을 반환한다.

문법
true

설명
셸 스크립트 상에서 무한 루프를 만들 때 등의 경우 사용될 수 있다. Bourne 셸 상에서는 콜론 문자(:)로 같은 효과를 얻을 수 있다.

사용예
다음의 스크립트는 무한정 문자를 출력한다.
while true
do
echo -e "over and over..."
done

tty
현재 로그온되어 있는 터미널의 장치 이름을 알려준다.

문법
tty [ -s ]

옵션
-s : 표준 입력이 터미널 장치인지 아닌지를 시험한다. 터미널이 표준이라면 0을 반환하며 아니라면 1을 반환한다.

설명
만일 -s 옵션을 사용하지 않고서 tty를 입력했을 때 표준 입력 장치가 터미널이 아니라면 'not a tty'라는 메시지를 출력한다.

사용예
$ tty
/dev/tty1

umask
파일을 생성할 때 현재 사용되고 있는 권한(permission)값의 마스크가 무엇인지 알려주거나 그것을 새로 지정할 때 사용된다.

문법
umask [ 마스크 ]

설명
아무런 인수없이 사용하면 파일 생성시 사용되고 있는 디폴트 마스크가 무엇인지 알려준다. 마스크를 지정하면 원하는 값을 지정할 수 있다.

마스크 값은 세 자리의 8진법 숫자로 구성된다. 이것을 마스크라고 부르는 이유는 마스크 값의 각 비트가 들어오는 값을 걸러내는 역할을 하기 때문이다. 즉 마스크 값이 0이면 권한 지정에 제한을 두지 않는다는 것이고 6이라면 읽기와 쓰기에 제한을 가한다는 의미가 되기 때문이다.

사용예
$ umask 033
자신은 제한이 없지만 다른 사용자나 그룹은 쓰기와 실행을 할 수 없다.



umount
설정된 마운트 정보를 해제한다.

문법
umount 장치명 or 마운트포인트
umount -a
umount -t 파일시스템 형태

옵션
-a : 모든 파일 시스템의 마운트 정보를 해제한다.
-t : 특정 형태의 파일 시스템만을 선택하여 해제된다. 옵션 뒤에는 어떤 파일 시스템을 해제할 것인지 지정한다.

설명
마운트되어 있는 장치와의 설정을 해제한다. /dev/hda3와 같은 이름이나 /dosc와 같은 포인트 이름을 사용한다. 파일 시스템 형태를 지정할 때는 msdos, minix, hpfs 등과 같은 이름을 사용한다. 마운트 해제시 사용중인 장치는 해제하지 못한다. 예를들어 /dosc 디렉토리에 위치한 상태에서 도스파일 시스템과의 마운트를 해제하지는 못한다.

사용예
$ umount /dev/hda1

uname
시스템 이름과 다른 정보를 보여준다.

문법
uname [ -snvma ]

옵션
-s : 시스템 이름을 알려준다.
-n : 시스템의 노드(node) 이름을 알려준다.
-r : 오퍼레이팅 시스템의 증명번호를 알려준다.
-v : 오퍼레이팅 시스템의 버전(version) 번호를 알려준다.
-m : 하드웨어의 이름을 알려준다.
-a : 모든 정보를 알려준다. -snrvm 과 같다.

설명
-s 옵션은 기본값으로 내장되어 있다. 옵션이 없다면 시스템 이름을 알려준다.

사용예
$ uname -sm



uncompress
compress로 압축되어 있는 파일의 압축을 푼다.

문법
uncompress 파일명(들)

설명
사실상, compress의 -d 옵션을 사용하면 압축을 풀 수 있기 때문에 이 명령은 불필요하다. 하지만 옵션을 사용하는 것보다 의미있는 단어를 사용함으로 좀더 친숙하게 사용할 수 있다. uncompress는 자신이 압축 풀기 동작을 수행하는 것이 아니라 -d 옵션을 주어 compress를 호출한다. uncompress 자신의 파일 크기는 아주 적다.

사용예
$ uncompress blade.Z

user
여러 명의 사용자가 동시에 유닉스 시스템에 로그인하여 사용하고 있을 때 어떤 사람들이 시스템에 접속해 있는지를 알아야 할 필요가 있다. 이때 간단히 사용자들의 id 이름만을 알고자 한다면 users 명령을 사용하면 된다.

문법
users

설명
이 명령은 아무런 옵션이 없다. 시스템이 네트워크에 연결되어 있다면 이 명령은 모든 네트워크 상에서 작업하는 사용자들을 보여주지는 못한다. 단지 그 명령이 사용되는 지역 호스트 상의 사용자들을 보여줄 수 있다.

사용예
$ users
sisap blade


uudecode․uuencode

uuencode는 USENET과 같이 ASC2 코드만을 다루는 미디어를 위해 바이너리 코드를 변환한다. uudecode는 그 반대의 동작을 수행한다.

문법
uudecode [파일명]
uuencode [파일명] 이름

설명
기본적으로 표준 입력으로 읽거나 쓴다. uuencode는 디코딩되었을 때 사용될 파일의 이름도 함께 명시한다. e-mail 이나 USENET 은 바이너리 코드를 사용하지 않기 때문에 이 작업으로 바이너리 파일을 보내고 받을 수 있다.

사용예
$ uuencode canexe.Z canexe.Z > exemail.uu
canexe.Z 라는 파일을 인코딩 작업을 거친 후 exemail.uu라는 파일로 저장한다. 이 파일을 디코딩하면 canexe.Z라는 이름으로 파일이 만들어진다.

vi
거의 유닉스 표준이라고 말할 수 있는 풀 스크린 에디터이다. 이것은 유닉스 시스템의 일부라고 말할 수 있으므로 레퍼런스에 포함했다.

문법
vi [ 파일명(들) ]

설명
이것은 매우 강력한 기능의 스크린 에디터이다. 메뉴 방식이 아니라 명령 입력 방식이기 때문에 처음 학습이 불편하다는 단점이 있지만 사용법을 알면 매우 빠르게 작업을 수행할 수 있다. vi대한 자세한 내용은 이 책의 앞부분이나 다른 참고 서적을 참조하라.

사용예
$ vi manual.book ;; vi를 실행 후 manual.book을 읽어들인다.

w
현재 시스템에 접속한 사용자들의 정보를 출력한다.

문법
w [ 사용자 ]

설명
이것은 who 명령과 유사한 동작을 한다. 인수로 사용자 ID를 지정한다면 특정 사용자에 대한 정보를 얻을 수 있으며, 인수없이 사용된다면 현재 시스템에 접속한 모든 사용자들의 정보를 자세히 출력한다. 출력 내용의 첫줄에는 시스템 가동 현황을 보여준다.

사용예
$ w
11: 32 am up 4 min, 2 users, load average : 0.00, 0.05, 0.02
User tty From login@ idle JCPU PCPU what
root tty1 11:28am w
blade tty2 11:31am -sh


wall
현재 시스템에 로그온되어 있는 모든 사용자들에게 메시지를 보낸다.

문법
wall [ 파일명 ]

설명
메시지는 각 사용자의 터미널에 나타나게 된다. 인수로 파일 이름이 주어지지 않으면 표준 입력으로부터 데이터를 받아들이며, ^D로 입력을 종결하고 메시지를 발송한다. 이것을 사용하려면 슈퍼 유저로 로그인되어야 한다. 사용자가 자신의 터미널을 메시지 수신 거부 상태로 만들어 놓더라도 슈퍼 유저는 그것을 무시할 수 있다.

사용예
$ wall
30 minutes latter, this system will be halted!! ^D


wc
파일내의 단어 수 등의 정보를 출력한다.

문법
wc [ -cwl ] 파일이름(들)

옵션
-c : 문자(character)의 개수만을 알고 싶을 때 사용한다.
-w : 단어(word)의 개수만을 알고 싶을 대 사용한다.
-I : 행(line)의 숫자를 알고 싶을 때 사용한다. 혹은 개행 문자의 개수를 알고자 할 때 사용될 수도 있다.

설명
wc라는 이름은 word counter를 의미하는 것이 아닌가 생각한다. 아무런 옵션을 주지 않고서 사용하면 행수, 단어수, 문자수를 모두 검사해서 보고한다. 텍스트 문서 속에서 단어란 공백(space)문자, 탭(tab)문자 그리고 개행(newline)문자에 의해 구분되는 문자들의 집합을 의미한다.

사용예
$ wc sample.txt
11 29 197 sample.txt


which
등록된 path를 통해서 특정 프로그램을 찾는다.

문법
which 프로그램

설명
만일 사용자의 path가 매우 긴 경우에 유용하게 사용될 수 있다. find와 유사한 기능이지만 path안에 있는 프로그램을 찾을 때 간단하게 사용된다.
사용예
$ which tetries
지정된 path 안에서 tetries 프로그램을 찾는다.



who
현재의 시스템에 접속한 사용자의 이름이나 로그온 정보를 보여준다.

문법
who [ -uTHqs ] [로그온 정보파일 ]
who am I

옵션
-u : 현재 시스템에 누가 로그온되어 있는지 보여준다.
-T : 사용자의 터미널이 메시지를 보낼 수 있는지를 알려준다. +기호는 메시지를 쓸 수 있고, -는 그렇지 않음을 보여준다.
-H : 헤더 라인을 프린트한다.
-q : 사용자 이름과 카운트가 구분된 목록을 보여줌, 다른 옵션은 무시된다.
-s : 호환을 위해 포함된 옵션으로 무시된다.

설명
아무런 인수없이 who 명령을 사용한다면 users명령처럼 지역 호스트상의 사용자 목록을 보여준다.

자신이 누구인지를 알려면 인수로 am I를 사용한다. 그러면 다음과 같은 바보같은 질문이 될 것이다.

$ who am I
이런 명령도 가끔은 필요할 것이다. 가령 친구의 계정으로 로그인했는데 그것을 잊어버렸을 경우라든지 아무도 없는 학교 실습실에 켜진 채 놓여진 터미널을 발견했을 때 누가 사용하다가 자리를 비웠는지 알고 싶을 때 등이다.

사용자가 로그인하거나 로그아웃할 때마다 /var/adm/wtmp 파일에 기록된다. 이 파일을 보면 사용들이 들어오고 나간 것을 확인할 수 있다. 이 파일 이름을 who 명령의 인수로 주면 그것을 볼 수 있는 것이다.


write
사용자의 터미널 사이에 메시지를 전달한다.

문법
write [ 사용자 ][ tty ]

설명
메시지를 전달하고자 하는 사용자의 이름을 지정한다. 만일 한 사용자의 이름으로 두 명 이상이 사용중이면 특정 터미널을 지정하여(tty) 메시지를 전달할 수 있다. write는 표준 입력 장치로 전달할 메시지를 입력받는다. 각행에서 리턴 키를 누를 때마다 메시지가 전달되며, ^D를 누르면 그만둔다.

메시지가 수신되면 ‘Message from 보낸사람 터미널’등의 정보를 보여주어서 누가 어느 터미널에서 메시지를 보내는지를 알 수 있도록 한다. 보내고자 하는 사람이 로그인되어 있지 않다면 ‘user is not logged on이라고’ 알려주며 만일 그 사람의 터미널이 메시지 수신을 거부하고 있는 상태라면 ‘permission denied 라는’ 말을 보여준다. 그는 아마도 mesg n 명령을 사용했을 것이다.

사용예
$ write victor
Do you have the linux-CDROM ?
^d


용어 정리

@ 파일 보기
1) cat
(옵션)
-n : 행 번호 표시
2) tac
3) more
- Space Bar : 다음 화면
- b : 이전 화면
- q : 종 료
4) less : more와 동일한 기능
5) head : 텍스트 파일 시작 20행을 화면에 출력해주는 명령어
(옵션)
-n 출력행수 ex) head -n 40 abc.txt
6) tail : 텍스트 파일 끝부분 20행을 화면에 출력해주는 명령어
(옵션)
-n 출력행수 ex) tail -n 40 abc.txt
-f 로그 파일을 실시간으로 모니터링

@ BASH 편집 명령 (emacs)
1) 커서이동
. Ctrl + b (<--으로 이동)
. Ctrl + f (-->으로 이동)
. Esc , b (<--으로 한 단어 이동)
. Esc , f (--> 으로 한 단어 이동)
. Ctrl + a : 줄 처음으로 이동
. Ctrl + e : 줄 마지막으로 이동
2) 삭제
. Ctrl + d (-->으로 한칸 삭제)
. Ctrl + h (<--으로 한칸 삭제) & Back Space
. Esc , d (-->으로 한 단어 삭제)
. Esc , Back Space (<-- 으로 한 단어 삭제)
. Ctrl + k : 커서 기준 오른쪽 모두 삭제
. Ctrl + u : 커서 기준 왼쪽 모두 삭제
3) 명령 히스토리
.bash_history 저장
(명령) history
. Ctrl + p : 다음 명령어
. Ctrl + n : 히스토리 탐색
. Ctrl + r : 형식문자를 붙여준다
. Ctrl +

명령치환
예) $cat bash_history
$^cat^more

@ 파일형식 알아내기
1) type : bash에 있는건지 파일로 존재하는지 확인
ex) type -type 명령
2) which : 파일의 경로를 확인해주는 명령어
3) file : 파일의 형식을 확인해주는 명령어
-- 정확한 경로를 지정해줘야 한다.

@ 디렉토리 관리
/ 루트 디렉토리
/bin 일반명령
/etc 설정파일
/var 내용 변경되는 작업 파일
/tmp 임시파일
/usr 배포판 추가 명령
/home 사용자 로그인 디렉토리
/proc 가상 디렉토리 메모리 사용
/var/log 로그파일
/usr/local 관리자 설치파일
/usr/src 리눅스 커널
/sbin 관리자 명령

@ 디렉토리 관리
1. 주요 디렉토리

2. 예약된 디렉토리 명.
/ : 루트 디렉토리
. : 현재 디렉토리
.. : 부모 디렉토리
~ : 로그인 디렉토리 (Home 디렉토리) 틸드라고 불림

3. 절대 경로 & 상대 경로
. 절대 경로 : /(root) 디렉토리부터 경로지정
. 상대 경로 : 현재 작업디렉토리부터 경로 지정

4. 관련 명령
1) cd
2) mkdir
3) rmdir
4) du : 디렉토리의 사용량
(옵션)
-s : (size) 사용량 크기 표시
-h : 읽기 편한 단위

% 콘솔에서 x 윈도우 해상도 설정하기
1 루트계정 로그인
2 시스템 로케일 변경
# LANG=en_US
-- 현재 로케일 보는 방법 : echo $LANG
3 setup 설정

% Single모드 (응급복구모드) : 화면주사율 또는 root계정 비번 분실시
- 멀티 로그인이 안되고, 네트워크는 차단됨 . 오로지 root 계정만 사용가능
1. Grub 화면에서 리눅스 부팅 메뉴 선택
2. 'e' 를 눌러서 메뉴 편집
3. kernel 로 시작 하는 메뉴에서
4. 'e' 를 눌러서 메뉴 편집'
5. 공백 1을 주고 그 뒤에 single 입력후 엔터로 고정
6. 'b'를 눌러서 부팅
7. # 이 나오면 사용함.

@네트워크 설정하기
1. 관련 명령어
1) ping : 상대방이 통신이 가능한지 알아보는 명령어
2) ifconfig : 루트 계정에서만 가능
인터페이스명 -- eth0 : 랜카드
- lo : 로컬루프백
. HW addr : MAC(Media Access Contrl ) 주소
. inet addr : 인터넷 주소 IP addr
. Bcast : Broad cast addr.
. Mask : Subnet mask
. UP/DOWN : 인터페이스 활성 / 비활성
. RX : 수신 , TX 전송
. Carrier : 수신 에러
. Collision : 충돌 에러
2. 명령
1) traceroute
. 목적네트워크 까지 몇개의 라우터를 지나치는지 보여주는 명령어
예) tracerout 58.121.73.141
% hop : 라우터 수
2) nslookup , dig : 도메인 서비스 클라이언트

3. 설정 파일
1) /etc/hosts
2) /etc/resolv.conf
3) /etc/sysconfig/network
4) /etc/sysconfig/network scripts/ifcfg-eth0
▣ 프로세스 관리
1) ps (Process)
. 표시내용
PID : Process ID
TTY : 터미널 타입 => tty 0 ~ 6 가상콘솔(Ctrl+Alt+F2 는 콘솔창, Ctrl+Alt+F7 는 X 윈도우창)
=> pts/0 ~ 가상터미널 (Pseudo Terminal Service)
TIME : 접속 시간
CMD : 실행중인 명령(Command)

. 옵션
-a : all user
-u 사용자 : 프로세스를 실행한 모든 사용자
-x : daemon, 서버용 프로그램, 터미널을 사용하지 않는 프로세스 포함, TTY부분 ? 표시
=> 위 옵션 3가지는 주로 같이 사용된다.
[root@Network ~]# ps -aux

-e : 사용자의 모든 프로세스 표시
-l : long
-f : pstree 표시 순서
=> 위 옵션 3가지도 주로 같이 사용된다.
[root@Network ~]# ps -elf

. 상태코드
R : Running
S : Sleeping
D : Disk wait
W : Swap
Z : zombie
T : Teminate

2) pstree : 트리구조 보여준다.
. 옵션
-a : 파라미터, Parameter
-n : Process Number 갯수
-p : PID 표시
-u : UID 표시
-h : highlight 실행중인 프로세스, 다른부분보다 진하게 표시된다.

3) top : 프로세스 상태 모니터링, 주로 서버관리자 사용한다.

4) kill : 프로세스에 시그널 전송, 프로세스 종료
[root@Network ~]# kill -9 PID => -9 옵션은 강제종료, 즉 PID 를 강제 종료시킨다.
[root@Network ~]# ping 218.234.13.1 >/dev/null & =>ping 을 동작시킨다.

5) killall
[root@Network ~]# killall ping => ping 이라는 이름을 찾아 내가 실행한것 전부 kill 한다.

6) nice : 우선순위 변경, 일반 사용자 우선순위 하향조정만 가능하다.
[root@Network ~]# nice -n +5 ping 218.234.13.1 >/dev null & => ping 5번째로 늦춘다.
[root@Network ~]# ps -l
[root@Network ~]# nice nice => 일반 사용자일 경우

7) renice : 실행중인 프로세스의 우선순위 변경

※ 참고사항
kill 의 시그널 종류
[root@Network20 ~]# kill -l
시그널 이름 설 명
1 SIGHUP(HUP) 연결 끊기. 프로세스의 설정파일을 다시 읽는데 사용된다.
2 SIGINT(INT) 인터럽트, Ctrl + c
3 SIGQUIT(QUIT) 종료
4 SIGILL(ILL) 잘못된 명령
5 SIGTRAP(TRAP) 트렙 추적
6 SIGIOT(IOT) IOT 명령
7 SIGBUS(BUS) 버스 에러
8 SIGFPE(FPE) 고정소수점 예외
9 SIGKILL(KILL) 죽이기. 이 시그널은 잡히지 않는다.
10 SIGUSR1(USR1) 사용자 정의 시그널1, 환경설정파일을 다시 읽어들인다.
11 SIGSEGV(SEGV) 세그멘테이션 위반
12 SIGUSR2(USR2) 사용자 정의 시그널2
13 SIGPIPE(PIPE) 읽을 것이 없는 파이프에 대한 시그널
14 SIGALRM(ALRM) 경고 클럭
15 SIGTERM(TERM) 소프트웨어 종료 시그널, 일반적으로 kill 시그널이 전송되기 전에 전송된다. 잡히는 시그널이기 때문에 종료되는 것을 트랙할 수 있다.
16 SIGTKFLT 코프로세서 스택 실패
17 SIGCHLD(CHLD) 자식 프로세스의 상태변화
18 SIGCONT(CONT) STOP 시그널 이후 계속 진행할 때 사용.
19 SIGSTOP(STOP) 정지. 이 시그널 역시 잡을 수 없다. Ctrl + z
20 SIGTSTP(TSTP) 키보드에 의해 발생하는 시그널로 Ctrl+Z로 생성된다.
21 SIGTTIN 백그라운드에서의 제어터미널 읽기
22 SIGTTOU 백그라운드에서의 제어터미널 쓰기
23 SIGURG 소켓에서의 긴급한 상태
24 SIGXCPU CPU 시간 제한 초과
25 SIGXFSZ 파일 크기제한 초과
26 SIGVTALRM 가상 시간 경고
27 SIGPROF 프로파일링 타이머 경고.
28 SIGWINCH 윈도우 사이즈 변경
29 SIGIO 기술자에서 입출력이 가능함.
30 SIGPWR 전원 실패
31 UNUSED 사용 안함


1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN+1
34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+5
38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+9
42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13
46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14
50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10
54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6
58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2
62) SIGRTMAX-1 63) SIGRTMAX
- 보통 32번까지의 시그널은 대부분의 UNIX 계열에서 비슷한 값을 보여주며, 33번부터 62번까지는 아마도 OS 마다 약간식의 차이를 보여줄것이다. Linux 상에서 33 번 부터 62 번까지는 리얼타임 시그널을 위해서 예약된 시그널들이다.

- 대부분의 프로세스는 시그널을 받으면 기본 행동을한다.(보통 종료수행)
SIG_IGN 이용해 SIGINT(ctrl + c) 를 무시하도록 한다.
signal(SIGINT, SIG_IGN);
기본 행동을 취하게 하려면
signal(SIGINT, SIG_DFL);
시그널 발생시 프로세스는 작업을 해당 지점에서 중지하고 handler 로 지정된 함수를 호출한다.
그리고 작업이 끝난후 다시 중지된 지점으로 되돌아와 프로세스는 계속 진행한다.

- kill 함께 사용하는 시그널
1) 단절 2) 인터럽트 3)제거(kill) 15) kill로 부터의 소프트 웨어 종료 신호
@ SSH 쉘 접속하기

=>윈도우에서 서버로 ssh 쉘 접속하기
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

중간쯤에 putty-0.59-installer.exe 를 다운로드 받아 설치하세요.

실행파일 실행시키면 바로 설정창이 뜹니다. 설정할 부분은
. session => host ip 에 서버쪽 IP주소를 입력 ssh 에 표시되어 있는지 확인
. keyboard => backspace 부분 => Control-H 선택
. keyboard => function key => Linux 선택
. window => translation => UTF-8 선택
. window => appearance => Font setting => change => 굴림체 & 크기 설정 (자신이 보기 편하게)
. SSH => SSH Protocol => 2 선택되어 있는지 확인

open =>예 => ID & PW 입력

※ putty 와 동일한 기능의 툴은 시큐어 CRT 프로그램이 있다.

▣ 부팅과정

1. POST : Bios 에 의해 진행, Cmos Setup
2. 부트 로더 (Boot Loader )
MBR (Master Boot Record) - 물리디스크의 Prymary Master의 첫번째 섹터에 위치
물리디스크의 파티션내에 설치
3. OS Kernel 실행
ls -al /boot
vmlinuz-2.6.20-1.2944.fc6 파일
2 -> 주번호(major Number)
6 -> 부번호(minor Number) , 짝수는 안정버젼이며 홀수는 개발버젼
20 -> 패치번호(patch Number)

4. /sbin/init 실행
ls /etc/inittab 또는 /etc/inittab
- 설정내용
* Run Level
0 System halt ->시스템종료
1 Single Mode Booting (비상 복구 모드; root 패스워드 분실, 파티션 오류, 백업할때)
2 Multi User
3 Multi User (Network 지원)
4 Unused (사용안하는 공간)
5 X Window Booting (기본 셋팅값)
6 Reboot

runlevel 변경을 위해 init 명령을 사용한다.
init 3 => 런레벨 3으로 설정

▣ /etc/inittab

more /etc/inittab
- 설정내용
id:runlevel:action:process => 4개의 필드로 구성
id:5:initdefault:

id -> 이름구분,다른 레코드와 구분
runlevel -> 런레벨 5 설정, 즉 X 윈도우로 부팅
action -> init 의 행동
. respawn : 프로세스 종료시 자동 재시작
. wait : 특정 runlevel에서 한번 실행되고 init는 해당 프로세스 종료시까지 대기
. once : 특정 runlevel에서 한번만 실행
. boot : 시스템 부팅시 실행, runlevel 필드 무시
. bootwait
. off : 아무 동작도 안함
. ondemand
. initdefault : 시스템 부팅후에 지정된 runlevel 실행
. sysinit
. powerwait : UPS 장치가 연결된 경우 전원이 다운될 때 UPS로부터 신호를 받아 실행
. powerfail : 전원 다운시 프로세스 완료를 기다리지 않고 실행
. powerokwait
. powerfailnow : UPS 배터리가 소모되어 전원이 차단될 경우 실행
. ctrlaltdel : CTRL+ALT+DEL 키 조합이 입력될 때 실행
. kbrequest : 특정 키입력에 의해 실행 kbd-0.94 패키지 필요
process : init가 실행할 명령
ex)
1:2345:respawn:/sbin/mingetty tty1
1 -> 이름 구분, 2345 -> 멀티유저, 콘솔, X 윈도우 동작 가능상태 즉, 부팅환경에서 동작
respawn -> 없어지지않는 콘솔 명령창 ctrl+alt+F1 ~ ctrl+alt+F7
tty1 -> 가상콘솔 이용 가능갯수, tty1 ~ tty6까지 있다면 전부 6개 이용 가능
ex)
ca:ctrlaltdel:/sbin/shutdown -t3 -r now
ca -> 이름 구분, 런레벨 없으니 부팅과 상관없는 내용,
ctrl+alt+del 누르고 3초후에/ 리부팅 / 지금즉시
ex)
pf:powerfail:/sbin/shutdown -f -h +2 메시지내용
pf -> 이름 구분, 런레벨 없으니 부팅과 상관없는 내용
powerfail -> UPS 를 말하며 전원이 나가면 ups 작동될때 시그널 신호를 받는다.
로그인한 사용자들에게 메시지 내용 그대로 전송한다.

※ UPS : 일반적인 UPS 는 서버를 안정적으로 끄기위한 시간을 벌기 위해 필요(10분~30분)
백화점처럼 대형일 경우는 2시간 이상

ex)
pr:12345:powerwait: ~~~
pr -> 이름 구분,
전원이 나가고 응급 복구모드 실행중일때 사용
@ 리눅스 명령어 종합정리 IV

▣ 포그라운드와 백그라운드
. 포그라운드(ForeGround) : 사용자가 터미널에서 실행, 직접 종료 가능
. 백그라운드(BackGround) : 자동으로 실행(데몬, daemon), 사용자 직접 종료 불가능

ex1) ① 포그라운드 실행
[hoon@Network19 ~]$ping 218.234.13.1 => Ctrl + C 로 종료가능
② 백그라운드 실행( & 는 백그라운드 표시 )
[hoon@Network19 ~]$ping 218.234.13.1 > /dev/null & => 출력을 null 로 보낸다.
※ 윈도우에서는 서비스, 리눅스에서는 데몬(백그라운드 동작)

- 설정
. 서버PC : 가상콘솔창을 2개를 띄운다. ctrl+alt+F2, ctrl+alt+F3
. 클라이언트 PC : putty 메뉴부분에서 duplicate session 클릭해서 콘솔창을 2개 띄운다.

ex2)
[hoon@Network19 ~]$ping 218.234.13.1 & => Ctrl + C 를 눌러도 ping 은 계속 동작한다.
[hoon@Network19 ~]$ps -au | grep hoon => hoon 계정이 실행시킨 프로세스를 보여준다.
내용중에서 ping 부분을 찾고 Process ID를 메모한다. (hoon계정 PID : 4872)
[hoon@Network19 ~]$kill -9 4872 => PID 4872 를 강제 종료시킨다. ping 이 멈춘다.

ex3)
[hoon@Network19 ~]$ping 218.234.13.1 > ping.log &
[hoon@Network19 ~]$jobs
[1] 30715 => [1]은 첫번째 백그라운드 작업(job Number, 30715 는 Process ID
[hoon@Network19 ~]$ping 218.234.13.1 > ping2.log &
[hoon@Network19 ~]$jobs
[2] 30722 => [2]은 두번째 백그라운드 작업(job Number, 30722 는 Process ID

▣ jobs : 백그라운드 작업 목록 표시

▣ fg : 백그라운드 동작중인것을 포그라운드로 바꿀때 사용
[hoon@Network19 ~]$fg %n (n : jobs Number)

▣ bg : 일시정지됨, 포그라운드 작업을 백그라운드로 변경
ex) [hoon@Network19 ~]$ping 218.234.13.1 > ping3.log => ping을 ping3.log 파일안에 표시
빈 공란이 표시되어 있음
Ctrl + z => Ctrl + z 를 눌러 ping을 일시 정지한다.
[hoon@Network19 ~]$ps -u => STAT 값이 T 로 표시(현재 동작중인 작업 일시정지)
[hoon@Network19 ~]$bg => 백그라운드 실행
[hoon@Network19 ~]$ps -u => STAT 값이 S 로 표시(백그라운드 실행중 표시)

※ 일반사용자가 X 윈도우를 통해 접속할 경우
w 명령어 => From 부분 :0.0 으로 표시된다.
콘솔창을 통해 접속할 경우
TTY 부분 tty1 번 ~ 표시

※ 참고 자료 : http://jeongsam.net/myblog/95
=====================================================================================

▣ RunLevel

/etc/rc.d

* 부팅 실행순서
① kernel 실행(/boot/vmlinuz)
② /sbin/init (PID => 1)
-> 참조하는 설정파일 ┏ /etc/rc.d/rc.sysinit (스크립트)
┗ /etc/inittab (환경설정 파일) => RunLevel 결정
③ /etc/rc.d/rc5.d (디렉토리내의 스크립트 실행 <- initdefault 5라고 가정할 때)
④ /etc/rc.d/rc.local (스크립트 실행)
⑤ 로그인 프로세스

- 설명
런레벨 결정단계

주체 => /sbin/init
┃ ┗> 참조 ① /etc/inittab
┃ ┗> id:5:initdefault:
┃ ↓
┗━━━━━> ② /etc/rc.d/rc5.d 이 디렉토리를 참조
rc5.d 폴더안에 여러개의 파일들이 들어있는데
Ko1 ~ (실행 안되는 파일)
S01 ~ (실행되는 파일) => 부팅할때 ok 라고 보여지는 부분의 파일들이다.

ex) S05 kudzu ~~ => /etc/rc.d/init.d 디렉토리안에 있는 kudzu 를 실행
파일속성들을 확인해보면 심볼릭링크 걸려있다. (속성 : l)

=> 종료할 때는 rc0.d 폴더안에 있는 파일을 모두 실행시킨다.
@ 리눅스 명령어 종합정리 IV

▣ 포그라운드와 백그라운드
. 포그라운드(ForeGround) : 사용자가 터미널에서 실행, 직접 종료 가능
. 백그라운드(BackGround) : 자동으로 실행(데몬, daemon), 사용자 직접 종료 불가능

ex1) ① 포그라운드 실행
[hoon@Network19 ~]$ping 218.234.13.1 => Ctrl + C 로 종료가능
② 백그라운드 실행( & 는 백그라운드 표시 )
[hoon@Network19 ~]$ping 218.234.13.1 > /dev/null & => 출력을 null 로 보낸다.
※ 윈도우에서는 서비스, 리눅스에서는 데몬(백그라운드 동작)

- 설정
. 서버PC : 가상콘솔창을 2개를 띄운다. ctrl+alt+F2, ctrl+alt+F3
. 클라이언트 PC : putty 메뉴부분에서 duplicate session 클릭해서 콘솔창을 2개 띄운다.

ex2)
[hoon@Network19 ~]$ping 218.234.13.1 & => Ctrl + C 를 눌러도 ping 은 계속 동작한다.
[hoon@Network19 ~]$ps -au | grep hoon => hoon 계정이 실행시킨 프로세스를 보여준다.
내용중에서 ping 부분을 찾고 Process ID를 메모한다. (hoon계정 PID : 4872)
[hoon@Network19 ~]$kill -9 4872 => PID 4872 를 강제 종료시킨다. ping 이 멈춘다.

ex3)
[hoon@Network19 ~]$ping 218.234.13.1 > ping.log &
[hoon@Network19 ~]$jobs
[1] 30715 => [1]은 첫번째 백그라운드 작업(job Number, 30715 는 Process ID
[hoon@Network19 ~]$ping 218.234.13.1 > ping2.log &
[hoon@Network19 ~]$jobs
[2] 30722 => [2]은 두번째 백그라운드 작업(job Number, 30722 는 Process ID

▣ jobs : 백그라운드 작업 목록 표시

▣ fg : 백그라운드 동작중인것을 포그라운드로 바꿀때 사용
[hoon@Network19 ~]$fg %n (n : jobs Number)

▣ bg : 일시정지됨, 포그라운드 작업을 백그라운드로 변경
ex) [hoon@Network19 ~]$ping 218.234.13.1 > ping3.log => ping을 ping3.log 파일안에 표시
빈 공란이 표시되어 있음
Ctrl + z => Ctrl + z 를 눌러 ping을 일시 정지한다.
[hoon@Network19 ~]$ps -u => STAT 값이 T 로 표시(현재 동작중인 작업 일시정지)
[hoon@Network19 ~]$bg => 백그라운드 실행
[hoon@Network19 ~]$ps -u => STAT 값이 S 로 표시(백그라운드 실행중 표시)

※ 일반사용자가 X 윈도우를 통해 접속할 경우
w 명령어 => From 부분 :0.0 으로 표시된다.
콘솔창을 통해 접속할 경우
TTY 부분 tty1 번 ~ 표시

※ 참고 자료 : http://jeongsam.net/myblog/95
=====================================================================================

▣ RunLevel

/etc/rc.d

* 부팅 실행순서
① kernel 실행(/boot/vmlinuz)
② /sbin/init (PID => 1)
-> 참조하는 설정파일 ┏ /etc/rc.d/rc.sysinit (스크립트)
┗ /etc/inittab (환경설정 파일) => RunLevel 결정
③ /etc/rc.d/rc5.d (디렉토리내의 스크립트 실행 <- initdefault 5라고 가정할 때)
④ /etc/rc.d/rc.local (스크립트 실행)
⑤ 로그인 프로세스

- 설명
런레벨 결정단계

주체 => /sbin/init
┃ ┗> 참조 ① /etc/inittab
┃ ┗> id:5:initdefault:
┃ ↓
┗━━━━━> ② /etc/rc.d/rc5.d 이 디렉토리를 참조
rc5.d 폴더안에 여러개의 파일들이 들어있는데
Ko1 ~ (실행 안되는 파일)
S01 ~ (실행되는 파일) => 부팅할때 ok 라고 보여지는 부분의 파일들이다.

ex) S05 kudzu ~~ => /etc/rc.d/init.d 디렉토리안에 있는 kudzu 를 실행
파일속성들을 확인해보면 심볼릭링크 걸려있다. (속성 : l)

=> 종료할 때는 rc0.d 폴더안에 있는 파일을 모두 실행시킨다.
@리눅스 명령어 종합정리 V

▣ 로그인과정
① /bin/login 실행 => 로그인 확인
② /bin/bash 로그인 쉘 실행

※ PATH => 환경변수, 실행파일의 탐색경로 지정
ex) [hoon@Network21 ~]$echo PATH => PATH를 그대로 모니터에 출력
PATH
[hoon@Network21 ~]$echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/hoon/bin
=> 예를들어 PATH에 저장되어 있는 ls 명령어를 앞쪽의 디렉토리부터 순서대로
찾아나간다.

[hoon@Network21 ~]$echo /sbin/ifconfig eth0
=> 일반사용자 로그인 했을경우, PATH에 sbin에 대한 정보가 들어있지않다. 구체적인
경로까지 표시해줘야 한다.
ex) [hoon@Network21 ~]$ifconfig => 에러 메시지 나타난다.
command not found

- 해결방법 -> 환경변수 PATH에 경로를 추가해줘야 한다.
. a=4; a : 변수, = : 대입연산자, 4 : 값 ( C 언어를 예로 든것이다.)
. 리눅스에서는
[hoon@Network21 ~]$PATH=$PATH:/sbin
[hoon@Network21 ~]$ifconfig
eth0

lo

=> PATH라는 환경변수에 /sbin 경로 추가하였다. 결과는 ifconfig 실행시키면 내용을
보여준다.
- shell 에서는 변수를 대문자로 표시
- $는 일반 문자열과 구분하기위하여 표시
- 현재 띄운 콘솔창에서만 변수 적용된다. 즉, 다른 콘솔창에서는 적용 안된다.
- 별도로 전체적인 변수 적용하려면 export 명령어로 PATH에 경로 추가해줘야 한다.
(관련 설정파일 -> .bash_profile)
[hoon@Network21 ~]$ls -al .bash_profile => 숨김파일이라 -a 옵션 적용
[hoon@Network21 ~]$file .bash_profile => 파일 형식을 알아본다.
ASCII TEXT 형식
[hoon@Network21 ~]$cat .bash_profile => 아스키 TEXT 파일, 경로지정없이 본다.
=> export 명령어로 /sbin 경로 추가해주면 일반 로그인 사용자로 새로운 콘솔창을
띄워도 ifconfig 실행시키면 내용을 볼수가 있게 된다.

[hoon@Network21 ~]$ps -au | grep hoon => grep 뒤의 문자열이 포함된것을 찾는다.
[hoon@Network21 ~]$who am i
pts/5 ~~~ => 자신의 터미널 번호가 pts/5 인것을 알수있다.

※ kill 명령어 시그널 신호
- 1, 10 => 주로 아파치 서버에서 사용
- 2 => 정지, ctrl + c
- 15 => 정상종료, kill 옵션 없으면 이 번호가 자동 실행
- 19 => stop, ctrl + z
@ SSH 쉘 접속하기

=>윈도우에서 서버로 ssh 쉘 접속하기
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

중간쯤에 putty-0.59-installer.exe 를 다운로드 받아 설치하세요.

실행파일 실행시키면 바로 설정창이 뜹니다. 설정할 부분은
. session => host ip 에 서버쪽 IP주소를 입력 ssh 에 표시되어 있는지 확인
. keyboard => backspace 부분 => Control-H 선택
. keyboard => function key => Linux 선택
. window => translation => UTF-8 선택
. window => appearance => Font setting => change => 굴림체 & 크기 설정 (자신이 보기 편하게)
. SSH => SSH Protocol => 2 선택되어 있는지 확인

open =>예 => ID & PW 입력

※ putty 와 동일한 기능의 툴은 시큐어 CRT 프로그램이 있다.

▣ 부팅과정

1. POST : Bios 에 의해 진행, Cmos Setup

2. 부트 로더 (Boot Loader )
MBR (Master Boot Record) - 물리디스크의 Prymary Master의 첫번째 섹터에 위치
물리디스크의 파티션내에 설치

3. OS Kernel 실행
ls -al /boot
vmlinuz-2.6.20-1.2944.fc6 파일
2 -> 주번호(major Number)
6 -> 부번호(minor Number) , 짝수는 안정버젼이며 홀수는 개발버젼
20 -> 패치번호(patch Number)

4. /sbin/init 실행
ls /etc/inittab 또는 /etc/inittab
- 설정내용
* Run Level
0 System halt ->시스템종료
1 Single Mode Booting (비상 복구 모드; root 패스워드 분실, 파티션 오류, 백업할때)
2 Multi User
3 Multi User (Network 지원)
4 Unused (사용안하는 공간)
5 X Window Booting (기본 셋팅값)
6 Reboot

runlevel 변경을 위해 init 명령을 사용한다.
init 3 => 런레벨 3으로 설정

▣ /etc/inittab

more /etc/inittab
- 설정내용
id:runlevel:action:process => 4개의 필드로 구성
id:5:initdefault:

id -> 이름구분,다른 레코드와 구분
runlevel -> 런레벨 5 설정, 즉 X 윈도우로 부팅
action -> init 의 행동
. respawn : 프로세스 종료시 자동 재시작
. wait : 특정 runlevel에서 한번 실행되고 init는 해당 프로세스 종료시까지 대기
. once : 특정 runlevel에서 한번만 실행
. boot : 시스템 부팅시 실행, runlevel 필드 무시
. bootwait
. off : 아무 동작도 안함
. ondemand
. initdefault : 시스템 부팅후에 지정된 runlevel 실행
. sysinit
. powerwait : UPS 장치가 연결된 경우 전원이 다운될 때 UPS로부터 신호를 받아 실행
. powerfail : 전원 다운시 프로세스 완료를 기다리지 않고 실행
. powerokwait
. powerfailnow : UPS 배터리가 소모되어 전원이 차단될 경우 실행
. ctrlaltdel : CTRL+ALT+DEL 키 조합이 입력될 때 실행
. kbrequest : 특정 키입력에 의해 실행 kbd-0.94 패키지 필요
process : init가 실행할 명령

ex)
1:2345:respawn:/sbin/mingetty tty1
1 -> 이름 구분, 2345 -> 멀티유저, 콘솔, X 윈도우 동작 가능상태 즉, 부팅환경에서 동작
respawn -> 없어지지않는 콘솔 명령창 ctrl+alt+F1 ~ ctrl+alt+F7
tty1 -> 가상콘솔 이용 가능갯수, tty1 ~ tty6까지 있다면 전부 6개 이용 가능
ex)
ca:ctrlaltdel:/sbin/shutdown -t3 -r now
ca -> 이름 구분, 런레벨 없으니 부팅과 상관없는 내용,
ctrl+alt+del 누르고 3초후에/ 리부팅 / 지금즉시
ex)
pf:powerfail:/sbin/shutdown -f -h +2 메시지내용
pf -> 이름 구분, 런레벨 없으니 부팅과 상관없는 내용
powerfail -> UPS 를 말하며 전원이 나가면 ups 작동될때 시그널 신호를 받는다.
로그인한 사용자들에게 메시지 내용 그대로 전송한다.

※ UPS : 일반적인 UPS 는 서버를 안정적으로 끄기위한 시간을 벌기 위해 필요(10분~30분)
백화점처럼 대형일 경우는 2시간 이상

ex)
pr:12345:powerwait: ~~~
pr -> 이름 구분,
전원이 나가고 응급 복구모드 실행중일때 사용
1. 홈디렉토리의 모든파일 (하위디렉토리)
삭제 : $rm -rf *

2. 크기가 0인 파일 만들기 (test.txt)
$ touch test.txt

3. 그룹 사용자들에게 쓰기 권한 추가
$ chmod g+w test.txt

4. SUID 설정
$ chmod 4664 test.txt => chmod u+s test.txt

◎ chmod (Change Mode)
. 대상 : u,g, o. a
. 연산자 : +, -, =
. 모드(권한, 퍼미션) : r, w, x
. SUID, SGID, STICK bit
--> 명령을 실행 할때 모든 사용자가 root 권한으로 실행한것 처럼 하는 권한을 주는 것.

SUID SGID St | r w x | r w x | r w x
4 2 1 | 4 2 1 | 4 2 1 | 4 2 1

4 7 5 5
4 6 4 4 -> 얜 의미가 없다... 실행 권한이 없으니...

프롬프트 .bash_profile 지웠을때...
--> 재로그인 하면 프롬프트가 이상해진다... 복구 시키는 방법
echo $PS1
[\u@\h \W]\$
[jamesblue@network01 ~]$

echo PS1=""[\u@\h \W]\$ "" > .bash_profile

$ usermod -s /sbin/nologin 아이디 --> 특정 아이디를 login 못하게 하는..

$ usermod -s /sbin/login 아이디 --> 위의 제한을 푸는 방법
시작 설정 파일
BASH는 MS-DOS의 AUTOEXEC.BAT, CONFIG.SYS와 같이 설정 내용을 자동으로 읽어들이고 지정된 명령을 실행하는 3개의 특별한 파일이 있다.

.bash_profile 로그인시 설정 내용을 읽어들임.
.bashrc 쉘 실행시 내용을 읽어들임.
.bash_logout 로그아웃시 읽어들임.

.bash_profile은 로그인시에 반영되므로 내용을 변경하면 로그아웃한 후 다시 로그인해야 반영이 된다. 그러나 source 명령을 사용하여 로그아웃없이 바로 반영할 수 있다.

$ source .bash_profile

$ . .bash_profile # source 대신 .을 사용해도 된다.

사용자의 환경 설정을 위해 다음의 내용들을 설정 파일들에 추가할 수 있다.
alias
복잡한 설정의 명령을 별칭을 이용하여 간단한 명령으로 바꾸어 실행할 수 있다.
사용 방법은 다음과 같다.

alias name=command

name은 별칭으로 사용할 이름이며 command는 실행할 명령이다.

$ alias dir='ls -l | more'

하나의 명령일 때는 작은 따옴표가 필요없으나 두 단어 이상일 경우는 반드시 작은 따옴표로 묶는다.
alias의 해제는 unalias name이다.

$ unalias dir

변수
인용 부호
인용부호는 큰 따옴표와 작은 따옴표를 사용하며, 큰 따옴표의 경우 '$'로 시작하는 변수는 값으로 출력하는 반면에 작은 따옴표는 변수명 자체를 출력한다.

$ TEST='World.'
$ echo "Hello, $TEST"
Hello, World.
$ echo 'Hello, $TEST'
Hello, $TEST
$

위와 같은 이유로 보통 큰 따옴표를 사용한다.

내장 변수
편집 모드용 변수
BASH에서 사용되는 변수이다.

변수 설명
HISTCMD 히스토리 파일에서 현재 명령의 번호
HISTCONTROL HISTCONTROL=ignorespace로 설정하면 공백으로 시작하는 명령은 히스토리에 포함되지 않는다.
HISTIGNORE HISTIGNORE='l*:c*&' 설정시 l과 e로 시작하는 명령은 히스토리에서 제외된다.
HISTFILE 히스토리 파일명
HISTFILESIZE 히스토리에 저장될 명령의 최대 행수
HISTSIZE 히스토리에서 기억될 명령의 최대 개수
FCEDIT fc 명령과 함께 사용될 편집기

메일용 변수

변수 설명
MAIL 수신 메일을 확인할 파일명
MAILCHECK 새 메일 확인을 위한 시간 간격
MAILPATH 수신 메일을 확인할 파일명 목록. ':'으로 구분. 변수 미사용시 MAIL 변수 사용

프롬프트 변수
BASH에서 사용되는 변수는 PS1, PS2, PS3, PS4가 있다. 이중 PS1은 BASH 사용시 화면에 표시되는 프롬프트를 설정하며, PS2는 2차 프롬프트로 '>'로 표시된다. PS3와 PS4는 쉘프로그래밍과 디버깅에 이용된다. PS1에서 설정할 수 있는 프롬프트 문자열은 다음과 같다.
현재 프롬프트를 변경하기 위해서는 다음과 같이 명령을 실행한다.

PS1="My host is \h\$ "

위와 같이 일반 문자열과 프롬프트 변경 문자열을 사용하여 프롬프트의 모양을 변경할 수 있다.


프롬프트 변경 문자열 설명
\a 아스키 beep 문자
\d '요일, 월, 일' 형식으로 날짜 표시
\H 호스트명 표시. FQDN(Fully Qualified Domain Name) 전체 도메인 이름 표시
\h "host.domain" 형식의 호스트명에서 host부분을 표시
\n 줄바꿈 표시
\s 현재 쉘 이름
\T 시:분:추 형식(12시간제) 표시
\t 시:분:추 형식(24시간제) 표시
\@ am/pm 형식(12시간제) 표시
\u 현재 사용자명 표시
\v BASH 버전 표시
\V BASH 릴리즈 표시
\w 현재 작업 디렉토리 경로 표시
\W 현재 작업 디렉토리명만 표시
\# 현재 명령 번호 표시
\! 현재 명령의 히스토리 저장 번호
\$ root 사용자(UID=0)일 경우 '#', 일반 사용자(UID<>0)의 경우 '$'로 표시
\\ '\'를 표시

명령 검새 경로 설정 #
PATH 변수에 명령이 포함된 경로를 추가하며, 경로와 경로는 ':'로 구분한다.

$ PATH=$PAHT:. # 기존 경로에 현재 디렉토리를 추가

위와 같이 설정하여 현재 디렉토리에 저장된 명령을 실행할 수 있지만 보안상의 문제로 보통 홈디렉토리 아래에 bin 디렉토리를 만들고 PATH=$PATH:~bin; 형식으로 설정하는 것이 일반적이다. BASH는 사용자가 입력한 명령을 PATH 변수에 등록된 경로에서 찾아 실행한다.

기타

변수명 설명
HOME 홈디렉토리명
SECONDS BASH가 실행된 시간
BASH BASH의 경로
BASH_VERSION BASH의 버전
BAHS_VERSINFO BASH의 주버전 번호
PWD 현재 작업 디렉토리의 절대경로
OLDPWD cd 명령으로 이동전 디렉토리의 절대경로

하위 프로세스
환경 변수
환경변수는 로그인 쉘과 하위 프로세스에서 인식하고 사용할 수 있는 변수이며, 보통 시스템 설정이나, 사용자 설정에 사용되는 변수로 다음과 같이 설정한다.

export var_name

$var_name은 변수명이며 export 명령으로 일반 변수가 환경변수로 지정된다. 다음과 같이 변수 설정과 환경 변수 설정을 동시에 지정할 수 있다.

export var_name=value

터미널 종류
TERM 변수는 terminfo 데이터베이스에서 선택된 터미널이며, vt100, vt220, linux 등이 있다. 넷텀과 같은 터미널 에물레이터를 설정시 서버측의 TERM 변수값을 다음과 같이 확인하여 설정을 맞추는 것이 좋다.

$ echo $TERM
linux

위와 같은 경우 넷텀에서 터미널을 linux로 맞춰준다.

환경설정 파일
앞서 설명한 바와 마찬가지로 BASH의 환경설정은 .bash_profile가 담당하며, .bashrc에 대부분의 설정을 하여 .bash_profile에서 다음과 같이 호출하는 형태로 구성한다.

# .bash_profile의 내용
if [ -f .bashrc ]; then
. .bashrc # source .bashrc와 같은 표현
fi

위의 내용은 현재 디렉토리에서 .bashrc가 있을 경우 .bashrc를 실행하여 안의 내용을 반영하라는 의미이다. 이렇게 하면 하위 쉘을 호출할 경우 .bashrc가 자동으로 반영되기 때문에 사용자 설정이 하위 쉘에서도 항상 사용되는 효과를 볼 수 있다.

디렉토리 및 파일관리 요약 정리
1. ls (list)
디렉토리내의 파일 목록을 표시
▶ 옵션
-a : 경로안의 모든파일 표시, '.'으로 시작되는 숨김파일도 표시
-i : inode, 파일의 고유한 정보,번호(같은 파일인지 아닌지 파악할 수 있다.)
하드링크 파일은 inode 번호가 같다.
-l : 파일형태, 파일권한, 하드링크번호, 소유자, 그룹, 파일크기, 시간을 나열한다.
-R : 하위경로와 그 안에 있는 모든 파일들도 나열(recursive)
-r : 정렬순서를 내림차순으로 한다.(reverse)
-S : 파일크기가 가장 큰것부터 정렬해서 나열한다.
-s : 파일크기를 1Kb 단위로 나타낸다.
-t : 파일을 시간순위로 정렬, 최근파일이 제일 먼저 보여준다.

2. cd (Change Directory)
디렉토리 이동

3. 상대경로와 절대경로
▶ 상대경로 : 현재 작업 디렉토리(.)를 기준
▶ 절대경로 : 루트 디렉토리(/)를 기준

4. 특별한 디렉토리 이름들
. : 현재 작업 디렉토리
.. : 부모 디렉토리(상위)
/ : 루트 디렉토리
~ : '틸드'라 불리우며, 로그인 디렉토리, 홈 디렉토리

5. pwd (Print Working Directory)
현재 작업 디렉토리를 절대경로로 표시

6. mkdir (Make Directory)
디렉토리 생성
▶ 옵션
-p : 상위 디렉토리를 포함한 하위 디렉토리를 생성
$mkdir -p test1/test2/test3 (test1 디렉토리에 test2 디렉토리 생성, test2에 test3 생성)
-m : 동일한 퍼미션을 갖는 새로운 디렉토리 생성
$mkdir -m test (umask에 의한 기본 퍼미션을 갖는 test 디렉토리 생성)
$mkdir -m 755 test (퍼미션 755를 갖는 test 디렉토리 생성)
7. rmdir (Remove directory)
디렉토리 삭제.

8. touch
파일의 최근 사용 시간과 변경 시간을 현재 시간으로 갱신.
파일 존재하지 않을 경우 크기가 0인 파일을 생성.

9. cp (Copy)
파일 복사.
▶ 옵션
-a : archive, 원본 파일의 속성, 링크 정보들을 그대로 유지하며 복사.
-f : force, 강제로 복사
-R : recursive, 하위 디렉토리까지 복사
-v : verbose, 각 파일의 복사 상태를 자세히 보여준다.
-i : interactive, 존재하는 파일을 덮어쓰기 전에 물어보는 옵션
-p : preserve, 소스 파일의 소유자, 그룹, 퍼미션 등을 유지
-u : update, 복사할 대상이 이미 있는데, 이 파일의 변경 날짜가 같거나
더 최근의 것이면 복사하지 않는다.

10. mv (Move)
파일 이동. 파일이름 변경.
▶ 옵션
-f : force, 강제적으로 파일 이동
-b : backup, 이동할 자리에 같은 이름의 파일이 있으면 백업파일 생성
-i : interactive, 기존 파일을 덮어쓸지를 질문한다.
-u : update, 이동할 때 갱신
-v : verbose, 이동하기 전에 파일정보를 보여줌

11. rm (Remove)
파일 삭제.
▶ 옵션
-f : 강제로 삭제한다.
-i : 파일을 지울 때 정말로 지울것인지 질문한다.
-r : 하위 디렉토리까지 삭제
-v : 파일을 지우기 전에 파일정보를 보여줌

12. 파일의 종류
. 일반파일
. 디렉토리
. 특수파일
. 링크파일

13. 파일의 이름 지정
최대 255자. 대소문자 구별. 특수문자 사용불가.('_', '.'등 사용가능) 숫자로 시작하지 않음.

14. 주요 디렉토리
/ : 루트 디렉토리
/boot : 부팅 관련 파일
/bin : 일반 명령
/sbin : 슈퍼 관리자가 실행하는 명령
/dev : 디바이스 장치들(hdd, cdrom등등)
/etc : 설정 파일
/home : 사용자 로그인 디렉토리
/lib : 라이브러리
/lost+found : inode가 깨진 파일들을 저장
/mnt : 마운트
/proc : 메모리의 내용을 보여주는 디렉토리
/tmp : 임시파일, sticky bit 설정, 1777 퍼미션
/usr : 배포판 추가명령
/usr/bin
/usr/include
/usr/src : 커널의 소스가 저장되는 디렉토리
/usr/man : 도움말
/usr/X11R6 : X윈도우 설치 디렉토리
/var : 오라클 설치위치, 유동성 있는 파일들 저장

15. 텍스트 파일 관련 명령

1) cut : 하나 이상의 파일에서 명령이나 원하는 필드를 추출
▶ 옵션
-c : 캐릭터리스트. 파일 중에 캐릭터리스트에 위치한 곳의 정보를 추출해낸다.
-d : delim. 필드를 구분하는 문자를 지정한다. 디폴트 값은 탭이다.
-f : 필드리스트. 파일 중에 필드에 위치한 문자의 정보를 추출한다.

ex) 구분자로 : 사용하고 첫번째, 세번째 필드를 추출한다.
$cut -d : -f 1,3 /etc/passwd
namebook이라는 파일의 첫 번째, 세 번째 필드값을 보여주고, 각 필드는 콜론(:)으로 구분한다.
$cut -f 1,3 -d : namebook
namebook이라는 파일의 칼럼 1에서 5까지 보여줌
$cut -c 1-5 namebook

2) expand : 탭 문자를 공백이나 빈 칸으로 변환하는 명령
▶ 옵션
-t number : tab의 크기를 8이 아닌 number 로 바꿈

ex) file.txt 안의 모든 TAB을 6칸의 공백으로 바꾸려면,
$ expand --tabs=6 file.txt > file.txt

expand 에서 --tabs=N 옵션은
'TAB 을 지정한 수 N 칸으로 공백으로 만들어라' 라는 의미, output 에 관한 옵션임.

※ file.txt 안의 8칸의 공백을 기본적으로 하나의 TAB(8칸)으로 변환함.
만약 6칸의 공백을 하나의 TAB(8칸)으로 만들려면,
$ unexpand -a --tabs=6 file.txt > file2.txt
* 주의) 변환된 TAB은 무조건 8칸의 공백을 가짐.

3) fmt : 지정된 너비로 출력 결과를 조정한다. 디폴트 width는 75
▶ 옵션
-t : 단락의 처음 두 행의 들여쓰기를 원래대로 유지한다.(원문과 동일하게 유지시킬때)
-w : 문장의 폭을 조정

ex) test.txt 파일의 각 문장 폭을 10으로 조절하여 출력함)
$fmt -w 10 test.txt

4) head : 옵션 없이 실행하면, 파일의 처음 10줄을 보여준다.
▶ 옵션
-c : 앞에서부터 byte만큼 표시
-n <행수> : 앞에서부터 <행수>만큼 표시한다.

ex) test.txt 파일의 처음부터 20줄을 출력한다.
$head -n 20 test.txt

5) join : 두 개의 정렬된 파일을 하나로 수평 병합한다.
▶ 옵션

join [ -aejotv ] [파일명]1 [파일명]2

-an : 첫 번째나 두 번째 파일로부터 일치하지 않는것도 처리, n은 1이나 2이다.
-e 문자열 : 비어 있는 필드는 문자열로 대체한다.
-j n m : 파일n의 m번째 필드를 두 파일에 병합한다.
-o 파일 : 명시된 파일의 형태에 따라서 출력을 만든다.
-t 문자 : 필드 구분 문자를 정한다. 기본적으로 공백, 탭, 기행 문자다.
-v 파일 : 파일1이나 파일2의 짝이 연결되지 않는 행을 지정된 파일로 출력한다.
6) nl : 파일의 각 행에 번호를 붙여 보여줌
▶ 옵션
-s : 라인 분리
7) od (Octal dump) : 명령을 이용하여 파일을 ASCII 형태뿐 아니라 진수(base)가 변경된다양한 형태로 출력할 수 있다. 따라서, 바이너리 실행 파일 내부를 확인할 때 유용하게 사용할 수 있다.
▶ 옵션
-o
-d
-x : 16진수 워드 단위로 출력한다.
-a
-c : 바이트를 아스키 문자로 출력한다.
-f

8) paste : 하나 혹은 그 이상의 파일로부터 칼럼 형태의 출력을 만든다.
paste를 사용할 때 서로 붙여지는 파일명을 지정하는데, 이때 하이픈(-)으로
생략하면 표준 입력을 받아들이겠다는 뜻이 된다. 또한 paste의 출력은 항상
표준출력 장치로 나아간다.
▶ 옵션
-s : 각 파일을 순회하면서 paste를 수행한다.
-d : 어떠한 문자로 칼럼을 구분하는지 지정한다. 기본값은 탭 문자이다.
ex) 두 개의 파일을 칼럼으로 합치고 그것을 화면으로 출력한다.
$ paste -d' ' namelist.tmp /home/data.tmp

9) split : 텍스트 파일을 작은 조각으로 나눈다. 너무 커서 다루기 불편한 텍스트 문서를
나눌 때 사용
▶ 옵션
-b N : N byte 만큼씩 파일을 분할한다.
-l : 라인의 개수만큼씩 파일을 분할한다.

ex) 파일을 500byte씩 묶어서 여러 개의 파일로 나눈다.
$ split -b 500 test.txt

test.txt 파일을 10개의 라인씩 묶어 여러 개의 파일로 나눈다.
$ split -l 10 test.txt

10) cat : cat은 catenate(사슬로 잇다. 연결하다)에서 이름이 유래한다. 이것은 파일의
내용을 화면에 출력하는 데 사용되기도 하며 파일을 다른 곳에 순차적인 스트
림으로 보내기 위해 사용된다.
▶ 옵션
-n : 각 행을 출력하면서 행 번호를 함께 첨부한다.

11) tac : cat의 내용을 역순으로 표시한다.

12) tr : 중복된 문자를 하나로 나타내어준다.
대문자를 소문자로 소문자를 대문자로 변경하는것도 가능하다.
▶ 옵션
-d :

13) tail : 제일 뒷부분의 20행을 보여준다. 서버관리자들이 주로 사용한다.
▶ 옵션
+n
-n : 행 번호 표시
-c
-f : 로그파일을 실시간으로 모니터링(종료는 Ctrl+c)

14) wc (Word count) : 파일에서 모든 문자, 단어, 라인을 카운트 한다.
▶ 옵션
-c : 문자(character)의 개수만을 알고 싶을 때 사용한다.
-l : 행(line)의 숫자를 알고 싶을 때 사용한다.
-w : 단어(word)의 개수만을 알고 싶을 때 사용한다.

ex) 파일속에 들어있는 단어의 수만을 보고자할 때 사용하는 명령입니다.
$wc -w .bash_history
2044 .bash_history

파일속에 들어있는 문자의 수만을 보고자할 때 사용하는 명령입니다.
$wc -c .bash_history
10703 .bash_history

15) sort : 모든 화일의 라인을 함께 소트(sort)하여 그 결과를 화면 또는 지정한
장소에 출력하는 명령어
▶ 옵션
-c : 입력화일이 순서대로 소트 되어있는지를 검사하여 소트되어 있지 않으면 출력
하지 않는다.
-d : 사전식 순서비교
-f : 대문자와 소문자를 구별하지 않는다.
-o : output 출력화일명을 output으로 지정
-r : 역순으로 소트
-k pos1[,pos2] : 정렬할 key의 위치를 정함. (pos1에서 시작해서 pos2에서 끝냄)
-t 문자 : 단어 등 필드를 구분하는 문자를 지정한다. 탭(tab)이나 공백 문자 이외의 문자를
구분 문 자로 취급하도록 한다.
▶ 설명
sort명령의 정렬 방법에는 다음과 같은 기준이 있다.
일반적인 알파벳 순서로 정렬하되 소문자보다 대문자가 우선한다.
대소문자 보다 숫자가 우선한다. 숫자는 처음에 오는 숫자의 순서에 의한다.
즉, 숫자들도 문자처럼 취급될 뿐이지, 실제 숫자의 대소는 생각하지 않는다.

16) sed (Stream editor)
▶ 명령
.a\ text
c\ text
i\ text
d
r
p
s/ /
s/ /g
q

17) more & less : 한페이지씩 보여준다.
명령기능 : spacebar -> 다음화면
b -> 이전화면
q -> 종료


Syslogd(System log Daemon)
커널과 다른 시스템 프로그램들이 남기는 각종 에러와 경고 메세지, 기타 일반적인 메세지를 파일에 기록하는 일을 한다.

VI편집기

1. 명령모드에서 사용되는 vi 명령어
1.1. 커서 이동하기

k는 한 줄 위로
h는 한 문자 왼쪽으로
l은 한 문자 오른쪽으로
j는 한 줄 아래로
b는 한 단어 앞으로
w는 한 단어 뒤로
^는 그 줄의 시작으로
$는 그 줄의 마지막으로
:n?는 특정줄로 이동합니다.(n는 숫자)
?+f는 한 화면 아래로
?+b는 한 화면 위로
?+d는 반 화면 아래로
?+u는 반 화면 위로
1.2. 화면 이동하기

z
z.
z-
<n
>n
/sss/+n
?sss?-n
?L 현재의 줄이 화면의 맨 위에 오도록 다시 그림
현재의 줄이 화면의 가운데 오도록 다시 그림
현재의 줄이 화면의 맨 아래에 오도록 다시 그림
화면을 왼쪽으로 n(숫자)만큼 이동
화면을 오른쪽으로 n(숫자)만큼 이동
현재부터 뒤로 문자열 sss가 나타난 첫줄부터 n줄 뒤로 커서 이동
현재부터 앞으로 문자열 sss가 나타난 첫줄부터 n줄 앞으로 이동
talk 명령수신등으로 화면이 지저분할 때 다시 그림
1.3. 문자 삭제하기

x는 한 문자
dw는 한 단어
dd는 한 줄
D는 커서부터 줄 끝까지
:line#,line#d는 지정범위를 삭제합니다
(예) :1,$d (첫줄부터 마지막줄까지)
:1,. (첫줄부터 현재줄까지)
:.,$d (현재줄부터 마지막줄까지)
:.-2 (현재줄부터 두번째앞줄까지)
1.4. 탐색과 치환하기

:/zzz? 현재위치에서 파일의 뒤쪽으로 문자열 zzz를 탐색
:?zzz? 현재위치에서 파일의 앞쪽으로 문자열 zzz를 탐색
:n? 마지막 탐색 명령을 반복
:line#,line#s/zzz/sss/? 지정한 범위내의 문자열 zzz 처음것만을 sss로 치환
:line#,line#s/zzz/sss/g? 지정한 범위내의 문자열 zzz를 sss로 모두 치환
:%s/zzz/sss/ 모든 줄의 치환
1.5. 임시기억장소인 버퍼에 복사했다가 붙이기

yy (현재줄을 버퍼에 복사)
n yy (현재줄부터 시작하여 n줄 뒤까지 복사하여 버퍼에 저장)
p (이미 버퍼에 복사해 둔것을 현 위치 뒤에 붙이기)
(P or :p? or :P? 모두 같음)
:line#,line#y? (해당줄을 버퍼로 복사)
:line#,line#yy? (해당줄을 버퍼로 복사한 후 삭제)
:line#,line#Y? (해당줄을 버퍼로 복사한 후 삭제)
:line#p (지정한 줄 다음에 버퍼에 복사해 둔 것을 붙이기)
:"버퍼이름y? (버퍼로 버퍼이름에 복사)
:"버퍼이름p? (버퍼이름의 버퍼에 저장된 내용을 복사)
1.6. 여러 파일을 동시에 편집하기

yskang%> vi test1.txt test2.txt test3.txt
yskang%> vi test*.txt
:n? (현재 편집중인 파일의 다음 파일을 편집)
:e <파일명>? (현재의 파일이 아닌 다른 파일 <파일명>을 편집)
1.7. 기타 명령

:!<명령>? (vi에서 빠져나와 유닉스 명령을 시행하고 vi로 되돌아 옴)
:!sh? (유닉스 쉘로의 나들이를 시작하며 나들이를 끝낼때는 ?d)
:.r <파일명> (현재 파일의 현재 줄 뒤에 다른파일 <파일명>을 삽입)
:line#,line# w <파일명> (현재 파일의 해당줄을 )
. (가장 최근에 지시한 명령을 반복)


==========================================================================================================

<자세한 vi 편집기 사용법>

text파일을 편집하기 위한 editor는 line editor "ed"와 screen editor "vi"가 사용된다.

vi 편집은 대화식 편집기(Interactive Text Editor) 로서 기존의 편집기 ex에 시초를 둔 디스플레이 지향의 편집기이며 ed 편집기보다 훨씬 편리한 기능을 부여 받으며, 화면 전체의 데이터를 편집할 수 있기 때문에 커서를 상하좌우 마음대로 이동시킬 수 있어 매우 편리하다.

파일 명은 사용자가 임의로 정할 수 있으며 14자 이내의 영, 숫자 조합이면 가능하며 특수문자($,%,=,+,-)와 함께 사용하는 것을 배제한다.

시작
$ vi file_name

text입력
text를 입력하는 방법중 하나는 문자 "a"(append 화면에 표시안됨)를 입력하고 text를 입력하며, 각행을 분리할 때 키를 누른다.

text 보관 및 종료
명령어 모드(인 상태)에서 ":"을 입력한 후 w로 해당파일을 보관하고 q!로 작업을 종료한다.

커서 명령
h 왼쪽으로 커서 이동
j 아래로 커서 이동
k 위로 커서 이동
l 오른쪽으로 커서이동
w 한 단어 오른쪽으로 커서 이동
b 한 단어 왼쪽으로 커서 이동
Return 한 문자 왼쪽으로 커서 이동
Backspsce 한 문자 으로 커서 이동
Space Bar 화면의 맨 위로 이동
H 화면의 중간으로 이동
M 화면의 중간으로 이동
L 화면의 맨 아래로 이동
Ctrl+F 한 화면 앞으로 이동
Ctrl+D 반 화면 앞으로 이동
Ctrl+B 한 화면 뒤로 이동
Ctrl+U 반 화면 뒤로 이동

문자와 행 삽입
a 커서 오른쪽에 문자 삽입
A 커서 오른쪽, 행의 끝에 문자삽입
i 커서 왼쪽에 문자삽입
I 커서 왼쪽,행의 처음에 문자 삽입
o 커서 아래에 행 삽입
O 커서 위에 행 삽입


작업종료후 입력

텍스트 변경
cw 단어 변경
cc 행 변경
C 커서 오른쪽의 행 변경
s 커서가 위치한 문자열 대체
r 커서 위치 문자를 다른 문자로 대체
r-Return 행 분리
J 현재 행과 아래 행 결합
xp 커서 위치 문자와 오른쪽 문자교환
u 이전 명령 취소
U 행 변경 사항 취소
:u 이전의 최종행취소

텍스트 삭제
x 문자 삭제
dw 단어 삭제
dd 행 삭제
D 커서 오른쪽 행 삭제
:5,10 d 5-10번째 행 삭제

텍스트복사 및 이동 명 령 어
yy 행 yank 또는 복사
Y 행 yank 또는 복사
p yank되거나 복사된 행 현재행 아래 삽입
P yank되거나 복사된 행 현재행 위에 삽입
:1,2 co 3 1-2행을 3행 다음으로 복사
:4,5 m 6 4-5행을 6행 다음으로 이동

행번호 설정
:set nu 행번호 표시

:set nonu 행번호 숨기기

탐색 및 대체
/string/ string 탐색
?string? string 역 방향 탐색
n(N) string의 다음(이전) 계속 탐색
:s/str/rep 현재행의 str을 rep로 대체
:%s/str/rep/g 파일 전체 str을 rep로 대체

보관 및 종료
:w 변경사항 보관
:wp 변경사항 보관후 vi 복관
:q! 변경사항을 보관하지않고 종료
:wq! 변경사항 보관후 종료

vi 명령들

1. Cursor를 옮기는 여러가지 방법
2. 화면을 옮기는 여러가지 방법
3. 한 화면 안에서 cursor를 옮기는 방법
4. 한 line 안에서 cursor를 옮기는 방법
5. 검색
6. vi를 빠져나가는 방법
7. 삽입 mode
8. Yanking : (Copying)
9. Deleting
10. Putting
11. Interactive edit : (search and replace)
12. Global 명령
13. Reading in files
14. 여러 화일의 edit
15. Miscellancenous commands

1. Cursor를 옮기는 여러가지 방법

k(-)

||
h(bs) <------> l(sp)
||

j(+)

h,j,k 와 i 를 이용하영 간단히 키보를 누르면 cursor의 위치가 변경됩니다.

괄호에 있는 키를 선택하여도 됩니다.

bs : BackSpace
sp : Space bar

2. 화면을 옮기는 여러가지 방법

^f - (FORWARD 화면을 one page 앞으로 옮김)
^b - (BACKWARD 화면을 one page 뒤으로 옮김)
^d - (DOWN 화면을 반 page 앞으로 옮김)
^u - (UP 화면을 반 page 뒤으로 옮김)

3. 한 화면 안에서 cursor를 옮기는 방법

H - HOME, 한 화면의 top line으로 옮긴다.
M - MIDDLE, 한 화면의 중간으로 옮긴다.
L - LAST, 한 화면의 마지막 line으로옮긴다.
G - GOTO, 화일의 마지막 line으로 옮긴다.
nG - GOTO nth line the file (or :n)
^G - GIVES file status

4. 한 line 안에서 cursor를 옮기는 방법

w - WORD, 한단어 앞으로
b - BACKWARD, 한단어 뒤로
e - END, 현재 cursor가 위치한 맨 뒤로
o - zero, line의 맨 앞으로 (or ^)
$ - end, line의 맨뒤로

5. 검색

/pattern - scan (/ 'pattern'이라는글자를 현재 cursor가 위치한 곳의 다음 단어를 검색)
?pattern - scan (? 'pattern'이라는 글자를 현재 cursor가 위치한 곳의 앞 단어를 검색)
n - 앞쪽에서 입력했었던 문자 'pattern' 의 다음단어를 검색
N - 앞쪽에서 입력했었던 문자 'pattern' 의 다음 앞 단어를 검색

6. vi를 빠져나가는 방법

:q! - 화일의 내용을 저장하지 않고 exit
:w - WRITE, vi를 빠져나가지 않으면서 내용을 저장
:wq - WRITE and QUIT, vi를 빠져나가면서 내용을 저장
ZZ - :wq의 명령과 같다.

7. 삽입 mode

i - INSERT, cursor 위치 부터 문자 삽입
I - INSERT, line의 맨 앞부터 문자 삽입
a - APPEND, cursor 다음 위치 부터 문자 삽입
A - APPEND, cursor 위치한 line의 끝부터 문자 삽입
o - OPEN line, 현재의 line 다음에 line 삽입
O - OPEN line, 현재의 line 앞에 line 삽입
r - REPLACE, 한 문자만을 대치 (does not require ESC)
R - REPLACE, ESC 키가 입력될때 까지 대치
cw - CHANGE word, cursor가 위치한 곳의 단어 끝까지 대치 (cnw - change n number of words)
C - CHANGE, cursor가 위치한 곳에서 line 끝까지 대치
u - UNDOES, 마지막 명령의 취소
U - UNDOES, line전체를 원 상태로 복구

Note : INSERT mode 를 만든는 모든 문자(i, a, o,r, c, s <대문자 포함>)를
사용하는 경우 insert mode에서 입력 한 내용을 취소하고자 하면,
ESC 를 누르고 undo를 수행하는 u를 입력하면 된다.

Note : ESC (escape key 는 삽입) insert를 중지 시키고 명령어 mode로 돌아가는 키이다.

8. Yanking : (Copying)

Y - YANKS (copies line을 사용자가 보이지 않는 buffer에 저장)
yy - YANKS (copies line을 사용자가 보이지 않는 buffer에 저장)
nY - YANKS n , n line을 사용자가 보이지 않는 buffer에 저장

9. Deleting

x - deletes, 문자 하나를 삭제 (also 'd sp')
dw - DELETES words, 문자 하나를 삭제
D - DELETES, cursor가 있는 곳에서 부터 line끝 까지 삭제
dd - DELETES lines, line하나를 삭제 하고 보이지 않는 buffer에 저장
ndd - DELETES n, n line을 삭제 하고 보이지 않는 buffer에 저장
(i.e., 10dd deletes 10 lines)

10. Putting

p - PUTS, cursor가 위치한 다음 line에 보이지 않는 buffer의 내용을 삽입
P - PUTS, cursor가 위치한 앞 line에 보이지 않는 buffer의 내용을 삽입
xp - cursor 가 위치한 문자와 다음 문자를 교환

11. Interactive edit : (search and replace)

/pattern - find, pattern이라는 문자를 검색
cw - change word, 단어를 대치 (cw. dw, r, s, etc.)
n - find, 앞에서 검색했던 'pattern'이라는 문자를 검색하는 반복 명령
N - find, 앞에서 검색했던 'pattern'이라는 문자를 역순으로 검색 하는 반복 명령

12. Global 명령

Global replacement :1,\$s/string1/string2/g
1 line부터 끝까지 string1 를 string2 로 대치
e.g., :1,\$s/sun/SUN/

Global delete :g/pattern/d
1 line부터 끝까지 pattern 을 제거
e.g., :g/###/d (to delete lines inserted by cc file.c | error-v)

13. Reading in files

:r file2 - cursor가 위치한 다음 line에 file2를 삽입

14. 여러 화일의 edit

:w - 다른 화일을 읽기전에 현재의 화일을 저장 (file1)
:e file2 - 두번째 file을 edit하기 위해 load (file2)
:w - 두번째 화일을 저장 (file2)
:e # - original file 을 수정하기 위해 load (file1)
example:w /* file1을 빠져 나가기전에 저장 */
:e file2 /* file2 load */
\x4Y /* buffer 'x'에 file2의 top 4 line을 저장 */
:e # /* file1 을 load (no changes) */
\"xP /* buffer 'x'에 저장 되어 있는 내용을 put */

15. Miscellancenous commands

:! cmd - editor안에서 shell command를 수행 하고자 할때
~ - (tilde or 'wavy') 대문자를 소문자로 소문자를 대문자로 교환
% - 한 line안에서 (,,{,},[,]를 검색)
mx - 문자 x에 현재 위치를 표시
d'x - 문자 x에 표시된 위치 부터 현재 cursor 위치 까지 삭제
^V - allows for insertion of control characters (e.g.,^L)
?string - scan (/ backward for 'pattern')
:n,m w file - n line에서 m line까지 내용을 file 이라는 이름으로 (e.g., 15,25 w file)
J - JOINS, cusor가 있는 line과 다음 line을 join
:set ai - editor 가 자동적으로 insert tabs을 삽입
:set list - special characters 를 보여줌 (i.e., non-printable characters)
:set nows - stop wraparound search
:set ts=n - set tab stops to be other than the default (8)
:set wm=n - set wrap margin (automatic carriage return insert at n)
}}}

vi 에서 ^M를 없애는 방법
메모장에서 편집후에 ftp나 웹으로 올릴시에 가끔씩 나타나는 경우에 일일이 편집해주기 어려울수 있습니다...
다음과 같은 명령어로 깨끗히 해결할수 있다 합니다..

참고..
":g/^M/s//g"
^M은 두개의 "^"와"M"의 결합이 아니라 control+v control+M 을 누름
유용한 vi명령어

o 삽입
I: 줄의 제일 앞에서 입력
A: 줄의 제일 끝에서 입력

o 콤보command
4w: 4단어 skip후 이동
4b: 4단어 skip후 이동
4j,h,k,l: 커서이동시 지정한 수만큼 건너뛰므로
이동을 좀 더 빨리 할 수 있다.

o 줄의 결합(J)
2줄이 있고, 2째줄을 1째줄 끝에 붙이고 싶다면,
1째줄에서 J를 입력하면 된다.

o 커서이동
0: 줄의 처음
^: 줄의 처음(글자가 시작되는 처음)
$: 줄의 끝
w: 단어단위 이동
e: w와 같으나 단어의 끝으로 이동
b: w의 반대방향으로 이동
H, M, L: 커서를 화면 상,중,하로 이동

o 검색(/후 검색할 단어입력)
n: 뒤로 검색
N: 앞으로 검색

o 매크로
ab aa aaaa: aa를 입력하면 aaaa로 자동변환

o 파일안의 내용중 여러개의 한단어를 다른 단어로 변경시(치환)
s/pattern/replace: 현재줄의 첫번째 matching pattern치환
s/pattern/replace/g: 현재줄의 모든 matching pattern치환
%s/pattern/replace/g: 모든 줄의 치환
line,lines/pattern/replace: 해당 범위의 치환
예)
:%s/바꿀단어/바뀔단어
예를들어 1.htm파일안에 10개의 aa 단어를 bb 단어로 한꺼번에 변경시
:%s/aa/bb

o 저장
w>> file: 지정한 파일에 추가

o 윈도 split
vi내에서 위아래로 윈도가 분활되면서 2개의 파일을
동시에 open/편집할 수 있다.
ex-mode(:프롬프트상태)에서 'sp 파일이름'
윈도우가 전환은 Ctrl+ww

o 기타
1. d의 경우 command모드로 계속 남아 있으나 c는 삭제후
insert모드로 변환한다. cc, c$, cw등은 유용하게 사용될 수 있다.
2. .은 마지막 명령을 되풀이한다.

o visual모드
윈도의 텍스트 에디터와 같이 선택부분이 반전되면서 복사,
삭제 등을 할 수 있다.
v로 visual모드로 집입하여 커서키를 사용해 원하는 부분을 선택한다.
복사는 y, 삭제/잘라내기는 d로 할 수 있다.

o vi 설정(vim 설정)
자신의 홈디렉토리에 .vimrc를 생성하고 다음과 같이 할 수 있다.

set ai : auto-indent
set ts=4 : tab stop
set nu : numbering

o 윈도에서 작업중 vi에 붙여넣기시 계단현상발생 방지
:set paste

o 위치기억(UltraEdit의 ALT-F2, F2와 동일한 기능)
m{a-z}: 현재위치를 {a-z}로 북마크함
`{a-z}: 기억해둔 {a-z}로 이동. 보통 한개만 등록했다면
그냥 ``를 사용하면 된다.

o 레코딩
설정파일의 주석추가/삭제시 유용하게 사용할 수 있다.
(이미 vi에 매크로기능이 있지만, 레코딩이 UltraEdit의 매크로기능과 유사하다.)
q{a-z}: {a-z}로 레코딩 시작. {a-z}만 가능한게 아니고 실제 {0-9a-zA-Z"}를
적기 번거로워 이렇게 표시만 한 것이다.
q: 레코딩 종료
@{a-z}: 레코딩 내용 적용(@@를 하면 바로 이전의 레코딩내용을 적용, N@@은
N으로 지정한 숫자만큼 적용)

----------------------
[vi] 치환(substitute)
----------------------
[범위] s [/패턴/대치/] [옵션] [카운트]

- 옵션
c 치환전 확인 유무 물음
g 글로벌 치환
p 치환된 마지막 라인 출력

- 예제
:1,10s/yes/no/g 처음 10행 치환
:%s/[Hh]ello/Hi/gc 치환 확인 물음
:s/Fortran/\U&/ 3 다음 3행의 "Fortran"을 대문자로 치환
:g/^[0-9][0-9]*/s//Line &:/ 숫자가 있는 모든라인에 Line: 추가

----------------------
[vi] 파일 오가며 편집하기
----------------------
:e#

"f4yy → :w → :e other_file → "fp
:f 버퍼에 4라인 복사후 붙이기
"F6yy
:f 버퍼에 6라인 추가
Shell 프로그래밍의 기본

1. 들어가기전에
1.1. 필요한 것들
리눅스가 깔려있는 컴터 한대만 있으면 된다. 또는 원격 리눅스 계정을 가지고 있으면 된다. bash 쉘이 필요하겠지만, 대부분의 리눅스 박스에 거의 100% 깔려있다고 보면 되니 걱정할 필요 없을 것이다. 리눅스박스에 로그인 한다음에 "bash" 라고 명령을 내려보자, 제대로 실행된다면 bash 쉘이 깔려 있는 것이다. 자신의 시스템이 아닐경우 기본쉘로 bash 외의 csh 나 tcsh 등의 쉘이 기본쉘로 지정되어 있을수도 있다. 이럴경우 관리자에게 기본쉘의 변경을 요청해야 한다 (물론 로그인다음에 프롬프트 상에서 "/bin/bash" 명령을 실행함으로써 베쉬 쉘 환경으로 들어갈수도 있지만) 자신의 기본 쉘 환경을 알아보고 싶다면 "/etc/passwd" 파일을 보면 된다. 참고로 필자의 경우 "yundream:x:500:500::/home/yundream:/bin/bash" 로 되어 있다.

1.2. 쉘이란 무엇인가
쉘은 다른말로 명령어 해석기라고 불리운다. 인간의 명령어를 해석하여(주로 자판을 통하여 명령함), 시스템(커널)에 전달하는 일을 한다. 명령어를 해석하는 방법에 따라서 csh, tcsh, ksh, bash 등의 다양한 쉘이 존재한다. 이를테면 사용자와 커널간의 원할한 통신을 가능하도록 도와주는 통역사 정도로 생각하면 될것이다. 어떤 이름의 쉘이건 기본적으로 하는 일은 같다. 다만 변수의 사용방법, 사용되어지는 문법, 그밖의 추가적인 기능들에 있어서 차이가 있을 뿐이다. 그러한 이유로 하나의 쉘을 사용할수 있다면, 다른 쉘도 그리 어렵지 않게 사용가능하다.

2. 스크립트를 만들자
리눅스에는 매우다양한 여러 종류의 쉘이 존재하는데, 이 문서에서는 bash(bourne again shell)을 사용하도록 하겠다. 이유는 가장 널리 사용되며, 배우기 쉽고 또한 필자가 사용하는 쉘이기 때문이다. 때문에 이 문서에 있는 모든 쏘쓰역시 bash를 기준으로 작성되어 있다. 쉘 프로그래밍을 하기 위해서는 nedit, kedit, emasc, vi 등의 문자 편집기가 필요하다. 마음에 드는 아무 편집기나 사용하도록 하자. 쉘 프로그램의 첫번째 라인은 아래와 같은 라인을 포함해야 한다.

#!/bin/sh
#! 은 쉘에게 이 프로그램을 실행하기 위해서 #! 다음에 오는 아규먼트를 실행프로그램으로 사용한다는 것을 알려주기 위해서 사용된다. 위의 경우에는 /bin/sh 를 사용하라고 되어있다. 일단 위의 형식으로 프로그램을 만들고 이를 저장하였다면, 이를 실행가능한 파일로 만들어줘야 한다. 리눅스(Unix 포함) 은 윈도와 달리 파일의 확장자명(.exe .com 등)으로 실행파일 유무를 결정하지 않으며, 파일권한 설정의 변경을 통하여 실행파일로 결정한다. 실행파일로 만들기 위해서는 아래와 같이 하면 되다.

chmod +x filename
위와 같이 하고나서 ./filename 명령을 내리면 작성한 쉘 프로그램이 실행된다.

3. 주석
주석은 "#" 을 이용하며 "#" 에서부터 라인의 마지막 까지가 주석으로 처리된다. 주석부분은 쉘이 실행될때 무시된다. 주석은 프로그램에 대한 이해를 쉽게 하기 위한 방안으로 사용된다.

#!/bin/sh # 만든이 : yundream # 하는일 : hello world 를 출력한다. echo "hello world" # 문자열을 출력한다.

4. 변수
변수는 모든 프로그래밍 언어의 가장 기본이 되는 요소이다. "변수" 라고부르고는 있지만, 어떤 데이타를 저장하기 위한 "임시공간" 이라고 말하는게 더욱 정확한 표현일듯 싶다. 인간 두뇌로 하자면, 대뇌피질의 한구역쯤 될까? 쉘에의 변수의 데이타 타입은 string(문자열) 만을 가지며, C 언어와 같은 변수 선언을 필요로 하지 않는다. 이는 perl, python, php 역시 마찬가지 이다. 변수에 값을 넣기 위해서는 다음과 같이 한다.

varname=value
변수의 사용을 위해서는 변수명 앞에 $ 를 붙여주면 된다. 변수에 데이타를 저장하기 위해서는 대입연산자"=" 를 사용한다. 대입연산자와, 피연산자/연산자 사이에는 공백이 존재하면 안된다.

#!/bin/sh # 변수에 값을 할당한다. a="hello world" # 이제 a라는 변수에 등록된 값을 화면에 출력한다. echo "a is : $a"
위의 내용으로 파일을 만든다음 저장하고, 실행파일로 만들어서 실행하면 다음과 같은 결과물이 화면에 출력될 것이다.

[yundream@localhost /home]# ./test.sh A is : hello world
아래와 같이 프로그램을 만들어 보자

num=2 echo "this is the $numnd"
우리가 원하는 값은 "this is the 2nd" 이다. 그러나 우리가 원하는 값대신 "this is the " 라는 문자열이 출력된다. 왜냐면 쉘은 "numnd"를 하나의 변수명으로 생각하고 있기 때문이다. 이렬경우애는 아래와 같이 코딩하면 된다.

num=2 echo "this is the ${num}nd"
위의 프로그램을 실행시키면 우리가 원하는 값인 "this is the 2nd" 라는 출력물을 얻게 된다.

5. 대화모드
쉘스크립트를 제작하는데 있어서 위에서와 같이 파일로 저장한다음에 이를 실행권한을 주어서 실행하는 방법도 있지만, 간단하게 작업을 수행해야 할경우 파일을 만들지 않고, 쉘상에서 직접 실행시키는 방법도 있다.

[root@localhost /root]# test="hello world" [root@localhost /root]# echo $test hello world
아래는 좀더 복잡한 예제이다.

[root@localhost /root]# if [ "$SHELL" = "/bin/bash" ] > then > echo "your login shell is the bash (bourne again shell)" > else > echo "your login shell is not bash but $SHELL" > fi your login shell is the bash (bourne again shell)

6. 쉘명령과 제어구조
이번장에서는 쉘스크립트를 다루는데 필요한 3가지 부수적인 주제를 설명하게 될것이다.

6.1. 유닉스 명령어들
쉘스크립트는 유닉스 명령어들의 집합이므로, 유닉스 명령어에 대해서 어느정도의 숙지가 필요하다. 이러한 명령어들은 주로 파일과 문자열을 편집하기 위해서 쓰여진다. 이러한 명령어들중 자주 쓰이는 명령어들을 정리했다.
표 1. 자주 사용되는 유닉스 명령어들

echo "some text" some text 를 화면에 출력한다
wc -l file 파일의 라인수
cp sourcefile destfile sourcefile 을 destfile 로 복사
mv oldname newname 파일이름을 바꾸거나 파일의 이동
rm file 파일 지우기
grep 'pattern' file 파일에서 pattern의 문자열을 찾기
cub -b colnum file 파일에서 문자열을 컬럼단위로 잘라서 보여줌
cat file.txt file.txt 를 표준출력(stdout) 시킴
file somefile somefile 의 파일타입 알아내기
read var 입력값을 변수명var 에 대입
sort file.txt file.txt 를 라인단위로 정렬
uniq 파일에서 중복되는 문자열을 제거
tee 표준출력되는 정보를 파일로 쓰기
basename file 디렉토리명을 제외한 파일의 실제이름을 돌려줌
dirname file 파일이름을 제외한 디렉토리의 이름을 돌려줌
head file 파일의 처음 몇라인을 출력함
tail file 파일의 마지막 몇라인을 출력함
sed 정규표현에 의한 문자열의 검색및 치환에 사용됨

6.2. pipes(파이프), redirection(재지향)
Pipes(|) 는 하나의 프로그램을 실행시켜서 발생된 표준출력 데이타를 다른 프로그램에 표준입력 시키고자 할때 사용된다. 즉 프로세스간 데이타 통신을 위한 하나의 방법으로 사용된다.

grep "hello" file.txt | wc -l
위의 스크립트는 file.txt 에서 hello문자열을 포함한 라인을 찾아서(grep), 몇개의 라인이 hello 를 포함하고 있는지의 라인수를 돌려준다.
redirection 은 "재지향" 이라고 불리워진다. 우리나라 말로 표현하자면 "다시 향하게 하다" 이며, 어떤 프로그램의 출력 정보를 다른곳으로 다시 향하게 할때 쓰인다. 여기에서 다른곳이란 주로 파일을 뜻한다. 재지향을 위해서는 ">" 과 ">>" 을 쓴다. ">"을 사용하게 되면 새로운 파일을 만들게 된다. 기존에 같은 이름의 파일이 있었다면, 그 파일은 지워지게 된다. ">>" 을 쓰게 되면 기존에 같은 이름의 파일이 있다면 그 파일의 마지막부분에 덧 붙여지게 된다. 같은 이름의 파일이 없다면 물론 새로운 파일을 만들게 된다.

[root@localhost /root]# cat address.txt | grep "seoul" > seoul_add.txt
address.txt 에는 주소정보가 담겨 있다. 위의 스크립트는 이중 주소지가 "seoul" 인 정보만을 따로 뽑아서 seoul_add.txt 에 저장하는 일을 수행한다.

6.3. 제어구조
"if"는 참인지 거짓인지 판단할때 사용한다. 참이라면 then 부분을 실행하고 그렇지 않다면 else 부분을 실행한다.

if ..... then .... else .... fi
if 의 가장 유용한 사용처는 "상태" 를 테스트(test) 하는데 있다. 즉 문자비교, 파일이 존재하는지, 파일이 실행파일인지, 디렉토리인지, 읽을수 있는지 ... 등에 유용하게 사용할수 있으며, 이러한 작업의 제어를 위한 특수한 명령어 들을 제공한다. 이러한 "test" 조건들은 "[ ]" 사이에 쓰면된다. "[" 과 "]" 사이에는 반드시 공백문자가 들어가야 된다는 것을 주의하자.

[ -f "somefile" ] : somefile 이 파일인지를 테스트 한다. [ -x "/bin/ls" ] : /bin/ls 가 실행파일인지를 검사한다. [ -n "$var" ] : $var 변수에 어떤 값이 대입되어 있는지를 검사한다. [ "$a" = "$b" ] : $a 와 $b 가 같은지 검사한다. ["$a" = "$b"] : "[" 과 "]" 사이에 공백이 오지 않았음으로 잘못된 문장이다.
"man test" 를 이용해서 어떠한 test operator 이 있는지 확인 할수 있다.

#!/bin/sh if [ "$SHELL" = "/bin/bash" ] then echo "your login shell is the bash (bourne again shell)" else echo "your login shell is not bash but $SHELL" fi
$SHELL 은 환경변수로써 사용자의 로그인 쉘의 이름을 가지고 있다. 위의 스크립트는 $SHELL 의 값을 테스트 함으로써 사용자가 어떤 쉘을 사용하는지 알아내는 일을 한다.

6.4. 간단하게 표현하기
C 언어를 자주 사용해 본사람은 아래와 같은 문장에 익숙할 것이다.

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
위의 문장에서는 && 을 사용해서 if 문을 간단하게 표현하고 있다. 왼쪽 문장이 참이면 오른쪽을 실행하라는 것으로, /etc/shadow 라는 파일이 존재한다면 쉐도우 패스워드를 사용한다고 유저에게 알려주는 일을한다. || 를 사용하면 그반대의 경우이다. 간단한 사용예를 들어 보겠다.

#!/bin/sh mailfolder=/var/spool/mail/james [ -r "$mailfolder" ] || { echo "Can not read $mailfolder; exit 1;} echo "$mailfolder has mail from : " grep "^From " $mailfolder
위의 프로그램은 james 계정사용자의 메일파일을 검사해서 메일 파일을 읽을수 없으면 에러메시지와 함께 종료 하고 그렇지 않으면 grep 을 써서 누구에게로 부터 메일이 왔는지를 계정 사용자에게 알려주는 일을한다.
case 는 if elif else 를 좀더 일반화 시킨 제어구조이다. if 문을 쓰더라도 여러번의 조건에 대해서 검사할수있지만 그럴경우 if elif 가 어지럽게 중첩 되는 결과를 보여줄것이다. 이럴때 case 를 사용하면 좀더 가독성과 유지가 용이한 코드를 만들어 낼수 있다. 즉 if elsif 를 간단하게 표현할수 있다. 이해를 쉽게 하기 위해서 특정파일이 어떠한 포멧의 압축파일인지를 알아내는 스크립트를 만들어 보도록 하자. 파일의 종류를 알기 위해서는 file 이란 명령을 쓰면 된다. 아래의 예제를 smartzip 이란 파일로 저장하도록 하자.

#!/bin/sh ftype=`file "$1"` case "$ftype" in "$1: gzip compressed"*) echo "gzip 압축";; "$1: Zip archive"*) echo "Zip 압축";; *) echo "FLE $1 can not be uncompressed with smartzip";; esac
$1 변수는 프로그램의 첫번째 아규먼트를 저장하고 있는 변수다. ivmdemo.tar.gz 의 압축포맷을 알고 싶다면, smartzip ivmdemo.tar.gz 이라고 명령을 내리면 된다.
저 윗장에서 다룬적이 있는 덧셈 스크립트를 case 를 이용하여 사칙연산을 수행하도록 확장시켜보자. 물론 아래의경우 굳이 스크립트를 만들필요 없이 expr 만을 사용해도 동일한 작업이 가능하지만, 어디까지나 case 의 활용법 에 대한 이해를 위주로함이니 효율성, 가용성 기타등등은 무시하고 넘어가기로 하자.

#!/bin/sh add() { result=`expr $1 + $2` echo "$1 + $2 = $result" } min() { result=`expr $1 - $2` echo "$1 - $2 = $result" } div() { result=`expr $1 / $2` echo "$1 / $2 = $result" } mul() { result=`expr $1 \* $2` echo "$1 * $2 = $result" } #echo "$1, $2" case $1 in "-") min $2 $3 ;; "+") add $2 $3 ;; "/") div $2 $3 ;; "*") mul $2 $3 ;; esac
위의 스크립트는 첫번째 아규먼트로 연산자를 받아들이고 두번째 세번째 아규 먼트로 계산하고자 하는 숫자를 입력한다. "add - 1 3" 이런식으로 사용하면 된다. 주의할 점은 곱셈(*) 연산을 사용할 경우 "\" 등을 사용해서 "add \* 1 3" 형식으로 써야한다는 점이다. 쉘상에서 * 는 와일드카드 확장을 실행하기 때문이다.
이번에는 select 제어문에 대해서 알아보자 select 는 interactive(대화형) 메뉴 프로그램을 짜는데 매우 간단한 방법을 제공해준다. 사용자가 어떤 OS를 가장 선호하는지 메뉴를 보고 그중 하나를 선택하는 프로그램을 만들어 보도록 하자.

#!/bin/sh echo "What is your favourite OS ?" select var in "Linux" "Free BSD" "Windows" "Solaris" "Other" do break done echo "You have selected $var"
위의 스크립트를 실행시키면 아래와 같은 메뉴가 뜨고 사용자의 입력을 요구하는 프롬프트가 대기 하게 될것이다.

What is your favourite OS ? 1) Linux 2) Free BSD 3) Windows 4) Solaris
원하는 운영체제의 번호(1 - 4) 를 선택하면 선택된 번호의 문자열이 var 변수에 저장된다. 1 을 입력하였다면 var 변수엔 Linux 가 저장 된다.
while 은 조건이 만족하는 동안 루프를 반복한다.

while ... do ... done
다음은 while 를 사용해서 1부터 10까지 출력하는 간단한 프로그램이다. #!/bin/sh

a=0 while [ $a -lt 10 ] do a=`expr $a + 1` echo $a done
bashsehll 에서의 for 문은 C의 for 문과는 사용에 있어서 차이가 난다. sehll 에있어서는 in 다음의 값들을 차례대로 변수에 입력하는 일을 한다.

#!/bin/sh for var in A B C do echo "var is $var" done
for 문을 이용한 좀더 유용한 스크립트를 만들어 보도록 하자. 아래의 스크립트는 배포판 CD에 해당 rpm이 있는지를 확인하고, 있다면 rpm 패키지의 정보를 보여주는 일을 한다. 아래의 내용을 showrpm 으로 저장하도록 하자.

#!/bin/sh for rpmpackage in $* do if [ -r "$rpmpackage" ] then echo "================ $rpmpackage =============" rpm -qi -p $rpmpackage else echo "ERROR: cannot read file $rpmpackage" fi done
위의 스크립트를 보면 $* 이라는 변수가 보일것이다. $*는 모든 아규먼트를 저장하는 변수이다.

6.5. Quoting

#!/bin/sh echo $SHELL echo "$SHELL" echo '$SHELL'
위의 스크립트에서 1번째와 2번째의 경우 자신이 사용하는 쉘을 출력하지만 (아마도 /bin/bash) 3번째의 경우 $SHELL 자체를 출력하는걸 볼수 있을것이다. ' 를 사용하면 쉘이 사용하는 특수문자(keyword)를 일반화 시켜서 사용할수 있다. 또한 백슬러쉬를 사용해서 와일드카드나 변수기호와 같은 특수한 문자를 일반화 시킬수도 있다.

echo \$SHELL
위에서 백슬러쉬를 사용함으로써 $ 의 특별한 의미를 제거시켜 버림으로써 $SHELL 이란 문자열을 출력하도록 만든다. 예를 들어서 $1,000 를 화면에 출력 시키려고 한다고 가정하자 이럴때 아래와 같이 써버리면

echo $1000
아무런 값도 출력되지 않음을 알수 있다. 왜냐면 쉘은 1000 앞에 $ 가 있음으로 이를 변수명으로 생각하고 이 변수명에 저장된 값을 echo 하려고 할것이기 때문이다. 우리가 원하는 값을 얻을려면 아래와 같이 코드를 수정해야 한다.

echo \$1000

6.6. 함수
여러분이 좀더 복잡한 프로그램을 만들다보면 함수의 필요성을 느끼게 될것이다. 함수를 사용함으로써, 좀더 이해하기 쉽고 단순한 프로그램을 만들수 있으며, 재사용을 용이하도록 만들수 잇다. 함수는 다음과 같이 선언한다.

functionname() { body }
sehll 은 스크립트 언어이고 순차적으로 실행이 되므로 함수를 사용하기 전에 먼저 선언을 해주어야만 한다.

#!/bin/sh help() { cat << HELP xtitle bar -- change the name of an xterm, gnome-teminal or kde konsole Usage: xtitlebar [-h] "string_for_titlebar" OPTIONS: -h help text EXAMPLE: xtitlebar "cvs" HELP exit 0 } [ -z "$1" ] && help [ "$1" = "-h" ] && help
함수를 이용한 간단한 덧셈 스크립트를 만들어 보자. 2개의 인자를 받아들이고 이를 더한후 출력하는 일을 한다.

#!/bin/sh add() { result=`expr $1 + $2` echo "$1 + $2 = $result" } add $1 $2

6.7. 명령행 인자(argument)
각 명령행 인자는 $* 과 $1, $2, $3, ... 등의 변수를 통해서 가져올수 있다. 그러나 이러한 명령행 인자들을 단순히 읽어들이는 것만으로는 -h 와 같은 명령행 옵션에 대한 내용은 다룰수 없다. 왜냐면 shell 에서는 -h 를 옵션이 아닌 인자로 취급하기 때문이다. 이를 처리하기 위해서는 약같의 기술이 필요하다. 보통 C에서는 getopt()와 같은 함수를 이용해서 옵션을 처리한다. 아래는 명령행 인자를 분석하는 쉘프로그램이다. 프로그램의 이름은 cmdparser 로 하자

#!/bin/sh help() { cat << HELP This is a generic command line parser demo. Usage Example : cmdparser -l hello -f somefile1 somefile2 HELP exit 0 } while [ -n "$1" ] do case $1 in -h) help; shift1;; -f) opt_f=1;shift 1;; -l) opt_l=$2;shift 2;; --) shift;break;; -*) echo "error : no such option $1. -h for help"; exit 1;; *) break; esac done echo "opt_f is $opt_f" echo "opt_l is $opt_1" echo "first arg is $1" echo "2nd arg is $2"
shift 란 새로운 쉘명령이 나왔는데, 아규먼트를 하나씩 이동시키는 일을한다. 자세한 내용은 man bash 를 참조하기 바란다. 위의 스크립트를 cmdparser -l hello -f -- -somefile1 somefiel2 로 실행시켜보면 아래와 같은 결과가 나올것이다.

opt_f is 1 opt_l is hello first arg is -somefile1 2nd arg is somefile2
위의 프로그램이 어떻게 동작하는지 알아보자, 위의 루프는 아규먼트가 검색될때까지 계속해서 순환하도록 되어 있으며 case 를 이용해서 아규먼트와 대응되는 값을 매칭시킨다. 만약에 매칭된 값을 찾았다면, 해당 명령어나 함수를 실행하고 shift 를 이용해서 필요한 만큼 아규먼트를 이동시킨다.

7. 예제
7.1. 일반적인 쉘프로그램의 구조
이번장에서는 그동안 배웠던 기본적인 내용들을 토대로, 실질적인 쉘프로그램을 만들도록 해보자. 모든 종류의 훌륭한 쉘스크립트는 도움말을 가지고 있으며, 아규먼트옵션을 파싱하는 일반적인 루틴을 가지고 있다. 이번에 새로만들 스크립트는 이러한 좋은 스크립 트가 가지는 루틴들을 포함하게 될것이다.

7.2. 바이너리를 10진수로 바꿔주는
이 스크립트는 바이너리를 숫자로 바꿔주는 일을한다. 간단한 산수 게산을 위해서 expr 을 사용하도록 한다.

#!/bin/sh help() { cat << HELP b2h -- convert binary to decimal USAGE: b2h [-h] binarynum OPTIONS: -h help text EXAMPLE: b2h 111010 whill return 58 HELP exit 0 } error() { # print an error and exit echo "$1" exit 1 } lastchar() { #return the last character of a string in $rval if [ -z "$1" ] then rval="" return fi numofchar=`echo -n "$1" | wc -c | sed 's/ //g'` rval=`echo -n "$1" | cut -b $numofchar` } chop() { # remove the last character in string and return it in $rval if [ -z "$1" ] then # empty string rval="" return fi # wc puts some space behind the output this is why we need sed: numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` if [ "$numofchar" = "1" ] then # only one char in string rval="" return fi numofcharminus1=`expr $numofchar "-" 1` # now cut all but the last char: rval=`echo -n "$1" | cut -b 0-${numofcharminus1}` } while [ -n "$1" ] do case $1 in -h) help;shift 1;; # function help is called --) shift;break;; # end of options -*) error "error: no such option $1. -h for help";; *) break;; esac done # The main program sum=0 weight=1 # one arg must be given: [ -z "$1" ] && help binnum="$1" binnumorig="$1" while [ -n "$binnum" ]; do lastchar "$binnum" if [ "$rval" = "1" ] then sum=`expr "$weight" "+" "$sum"` fi # remove the last position in $binnum chop "$binnum" binnum="$rval" weight=`expr "$weight" "*" 2` done echo "binary $binnumorig is decimal $sum"
위의 프로그램은 이른바 2진수를 10진수로 바꾸어주는 프로그램이다. 만약에 위의 스크립트로 주어진 아규먼트가 1101 이라면, 2진수를 10진수로 바꾸는 계산법에 의해서 아래와 같은 결과가 나오게 될것이다.

1*2^3 + 1*2^2 + 0*2 + 1 = 6
위 프로그램의 분석은 여러분 각자에게 맡기겠다.

7.3. 디버깅
디버깅을 위한 가장간단한 방법은 echo 명령을 이용해서 결과값을 출력해보는 방법이다. - 이방법은 다른 모든 언어에도 공통적으로 적용된다. C는 printf, Perl은 print 등이 될것이다 - 당신은 echo 를 이용해서 변수값을 알아봄으로써, 어느부분에서 실수를 했는지를 알수 있다. 아마도 대부분의 쉘 프로그래머는 이러한 실수를 찾는데 전체 프로그램을 짜는 시간의 80% 정도를 보낼것이다. 쉘스크립트의 잇점은 이러한 테스트를 위해서 echo 문을 사용하는데, 다시 컴파일할 필요가 없어서, 시간을 절약할수 있다라는 것이다.
쉘스크립트를 디버깅 모드로 돌리고 싶다면 아래와 같이 하면 된다. 디버깅 하고자 하는 쉘스크립트의 이름은 strangescript 라고 하자.

sh -x strangescript
위와 같이 스크립트를 실행하면, 쉘이 실행되는 동안에 사용된 변수의 모든 값을 화면상에 출력시켜준다. 그럼으로 어느 곳에서 실수를 했는지 쉽게 찾을수 있다.

sh -n strangescript
위와 같이 "-n" 옵션을 이용하면 syntax 오류를 찾아낼수 있다. 위의 옵션에서는 syntax 오류 외의 다른 값들은 보여주지 않는다.

8. 효율적인 작업을 위해서
다른 여러가지 훌륭한 언어(C, Perl, Python)가 있음에도 불구하고 여전히 쉘을 사용하는 이유는 효율적인 작업을 위해서 일것이다. bash 는 사용자가 중복시간을 줄이고, 작업을 빠르고 효율적으로 할수 있도록 하기 위해서 history, 명령어치환 과 같은 여러가지 기능들을 제공한다.

8.1. 환경변수
bash(다른 쉘도 마찬가지)은 환경변수라는걸 사용한다. 환경변수는 쉘이 운용되는데 필요한 여러가지 값들을 가지고 있다. 대표적인 예로 SHELL 변수가 있다. 이변수에는 현재 로그인 유저가 사용하고 있는 쉘이 어떤건지에 대한 정보를 가지고 있다. 여러분이 현재 사용하는 쉘이 어떤건지 알고 싶다면 다음과 같이 하면된다.

[yundream@localhost yundream]$ echo $SHELL /bin/bash
이밖에도 PATH, USER, TERM, PWD 등과 같은 많은 환경변수를 가지고 있다.
환경변수를 세팅하기 위해서는 export 라는 쉘 명령어를 사용한다.

[yundream@localhost yundream]$ export MY_NAME="yundream" [yundream@localhost yundream]$ echo $MY_NAME yundream
현재 설정되어 있는 모든 환경변수를 보기 위해서는 set 명령을 이용하면 된다. 이렇게 해서 설정된 환경변수는 현재 쉘에서 실행되는 모든 자식 프로세스에 상속 되게 된다.

8.2. history
history 는 이전에 내렸던 명령을 기억해서 다시 써먹으려고 할때 유용하다. 터미널에서 history 명령을 내림으로써 이전에 실행했던 명령어의 목록을 확인할수 있다.

[yundream@localhost yundream]$ history 1 micq 2 exit 3 make clean ... 454 vi /home/httpd/cont/httpd.conf 455 history
히스토리가 저장되는 크기는 환경변수인 HISTSIZE 에 저장된다. 보통은 1000 라인정도로 세팅되어 있다. 히스토리에서 원하는 명령을 사용하고 싶을때는 "!n" 을 사용하면 된다. "n" 은 히스토리 번호이다. 즉 make clean 을 다시 실행하고 싶다면 "!3" 하면 된다.
"!" 는 히스토리 기능을 사용하기 위한 쉘 예약어이다. 이걸 사용하면 작업을 편하게 할수 있다. "!(문자열)" 하게 되면, 히스토리 목록중에서 (문자열)로 시작되는 가장 최근에 실행된 히스토리의 명령어를 불러와서 실행하게 된다. 위에서 454 번의 명령을 다시 실행하고 싶다면, !vi 하면 된다. 물론 !v 해도 관계없다.
히스토리는 grep 과 조합되어서 자주 사용한다.

[root@localhost /root]# history | grep configure 8 ./configure --with-apache=../apache-1.3.22 13 ./configure 14 ./configure i686-linux 15 ./configure --help [root@localhost /root]# !8 ./configure --with-apache=../apache-1.3.22

8.3. 최근명령어 치환
아래와 같은 상황을 가정해보자

[root@localhost /]# vp file1 file2 bash: vp: command not found
사실은 file1 을 file2 로 복사하는 작업을 하길 원했으나, cp 를 vp 로 치는 오류를 범했다. 이를 정정하기 위해서는 처음부터 다시치거나, 자판을 "v" 까지 움직 여서 이를 "c"로 교체 해야 할것이다. 이럴경우 "^"를 사용하면 작업을 좀더 빨리 할수 있다.

[root@localhost /]# ^v^c cp file1 file2
"^[원본문자열]^[바뀔문자열]" 의 형식으로 사용하면, 가장 최근의 명령에서 원본문자열을 바뀔문자열로 치환하여 명령을 다시 실행하게 된다.

8.4. Prompt
Prompt 란 쉘이 사용자의 입력을 기다리고 있음을 유저에게 알려주기 위해서 사용한다. Prompt 를 잘 사용하게 되면 여러분이 어떤 호스트 에서 작업을 하는지, 혹은 몇시인지, 어떤 디렉토리에서 작업하고 있는지 등의 작업정보등을 얻을수 있다.
프롬프트 정보는 환경변수 PS1 에 저장된다. echo $PS1 해 보면 현재 설정된 프롬프트 정보를 볼수 있다. bash 는 효율적인 프롬프트 정보를 보여주기 위해서 몇개의 특수 문자 들을 제공하고 있다.
표 2. Prompt 예약어

\t 현재 시간을 HH:MM:SS 형식으로 보여준다.
\d 날자를 "요일 월 일" 형식으로 보여준다.
\s 쉘의 이름을 보여준다.
\w 현재 작업디렉토리를 완전경로로 보여준다.
\W 현재 작업디렉토리의 이름을 보여준다.
\u 현재 사용자의 사용자명
\h 호스트이름
\! 이 명령의 히스토리 번호
\nnn 8진수 nnn에 해당하는 문자
\[ 비출력문자의 시퀀스를 시작한다.
\] 비출력문자의 시퀀스를 마친다.
간단한 예를 들어보자. 우리는 Prompt 상에 현재 시간과, 작업디렉토리 정보를 보여주길 원한다. 이럴때는 아래와 같이 하면 된다.

[root@localhost httpd]# export PS1="[\t \W]# " [17:40:37 html]# echo "성공적으로 바꼈군요"

8.5. Prompt 전에 명령 실행시키기
이렇게 해서 프롬프트를 변경시키는방법을 알았다. 그런데, 어떤 한텀 의 경우 한텀의 타이틀바 제목이 시시각각 바뀌는것을 본적이 있을 것이다. 이건 어떻게 하는것일까. ?
이건 bash 쉘의 환경변수인 PROMPT_COMMAND 를 사용하여 가능하다. PROMPT_COMMAND 에는 특정 명령어(스트립트 혹은 실행파일)가 값으로 들어가 있는데, 사용자에게 프롬프트가 떨어지기 전에 변수에 있는 명령이 실행된다.

[root@localhost /root]# export PROMPT_COMMAND="date" 월 11월 19 17:51:03 KST 2001 [root@localhost /root]# echo "hello world" hello world 월 11월 19 17:51:19 KST 2001 [root@localhost /root]#
위의 예에서 보다시피 사용자 프롬프트가 떨어질때 마다, 그전에 "date" 명령이 실행됨을 알수 있다. 이 명령을 약간 변경하면 타이틀바가 그때그때 바뀌도록 설정 할수 있다.

[root@localhost /home]# export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
위의 경우 디렉토리가 변경될때 마다 작업디렉토리가 타이틀바에 표시 가된다. 위의 내용을 /etc/bashrc 정도에 입력해 놓으면 창을 띄울때 마다 환경변수의 내용이 적용될것이다.
하지만 단순히 사용자에게 시각적으로 그럴듯하게 보여주는것 외에도 PROMPT_COMMAND 를 응용하면 좀더 다양한 일들을 할수 있다. 다음장에서 이에 대해서 간단하지만 유용한 한가지 예를 들어 보도록 하겠다.

8.6. PROMPT_COMMAND 를 이용한 사용자 명령어 추적
요즘 컴터업계 최대의 화두는 "보안"이다. 이런 대세에 맞추어서 사용자가 현재 무슨 명령을 사용중에 있는지 실시간으로 확인할수 있는 간단한 보안 프로그램? 을 작성해보도록 하겠다.
보통 이러한 사용자 명령을 실시간으로 추적하는 프로그램을 보안쉘 이라고 한다. - 물론 실지 보안쉘에는 이외에도, 파일보안, 디렉토리 보안, 프로세스보안 등과 같은 다양한 기능이 들어가지만 여기서는 사용자의 작업내용을 실시간으로 확인할수 있는 기능만 구현하겠다 - 보통 보안쉘을 만드는데는 많은 시간과 인내심이 필요하지만, 쉘의 특징을 조금만 알고 있다면, 시간과 노력을 단축시킬수가 있다.
PROMPT_COMMAND 를 이용하는 방법은 매우 간단하다. 사용자의 프롬프트가 떨어졌을때, 사용자의 이름, 사용자의 가장 최근의 명령어등을 가져와서 이를 파일로 만들거나 소켓을 통해서, 관리자에게 통보하도록 하면 된다. 쉘에서는 물론 history라는걸 제공하긴 하지만, history 는 실시간이 아니다. 일단은 쉘의 메모리에서 관리하고 있다가, 로그아웃 하면 그때 파일로 저장이 된다. 즉 로그아웃 하기 전까지는 무슨일을 하는지 통 알수가 없게 된다. 그리고 history 명령을 이용해서 편집 가능하다. 다음과 같은이름으로 moniter.sh 란 간단한 스크립트 파일을 작성한다.

LAST_COMMAND=`tail -1 /root/dump` CURRENT_COMMAND=`history 1` if [ "$LAST_COMMAND" != "$CURRENT_COMMAND" ] then echo "$CURRENT_COMMAND" >> /root/dump fi
위의 스크립트를 적당한 디렉토리에 복사한다음에, 각 사용자가 로그인할때 환경변수로 초기화 시키면 된다.

export PROMPT_COMMAND="/usr/bin/moniter.sh"
물론 위의 프로그램에는 여러가지 부족한점이 많다. 마지막 명령이 화일로 저장되며, 또한 사용자가 쉘의 특성을 잘알고 있고, 여기에 주의를 기울인다면 환경변수를 분석해서 이를 조작할수 있다. 이는 여러가지 방법을 통해서 해결할수 있지만, 이는 쉘스크립팅의 범위를 벗어나는 것임으로, 간단히 이러한 일을 할수도 있다라는 것만 이해해 두기로 하자. 이 글을 읽는 여러분이 좋은 방법을 생각해 보기 바란다.

'Server > Linux' 카테고리의 다른 글

java 설치 경로 확인 방법  (0) 2017.02.06
도커(Docker)  (0) 2016.11.21
리눅스마스터2급 1차 정리  (0) 2008.07.06
리눅스 설치  (0) 2005.09.08
Red Hat Enterprise Linux 3 - 시스템 관리 가이드  (0) 2005.02.18