출처 - http://egloos.zum.com/program/v/802690

 

 

[참고할 사이트] http://www.adminschoice.com/docs/crontab.htm

crond 데몬 /etc/rec.d/init.d/crond 스크립트에 의해 시작, 종료,재시작될 수 있다

기본 명령의 위치 :/user/bin/crontab

 =>아무곳에서도 실행 가능 함 등록,수정, 보기



 

사용형식

crontab [ -u 사용자 id] 파일

crontab [-u 사용자 id] { -l | -r | -e}


 

crontab -l : 예약된 작업리스트

crontab -e : 예약된 작업 수정

crontab -r : 예약된 작업 삭제



 

crond 실행 확인

=> ps -ef | grep crond



 

crond 시작

=> /etc/rc.d/init.d/crond start{restart | stop}


 

일반사용자에게 crontab 명령어 사용하도록 설정 허가

=> /etc/cron.allow 여기에 ID 등록


 

일반사용자의 crontab 명령어사용을 제한하고자 한다면

=>/etc/cron.deny  에 ID를 등록

즉,

=> /etc/cron.allow : 허용할 사용자 ID 목록
=> /etc/cron.deny  : 거부할 사용자 ID 목록

cron.allow 파일이 있으면 이 파일에 들어있는 ID만 사용 가능
cron.deny  파일이 있으면 이 파일에 들어있는 ID는 사용 불가

따라서 cron.deny에 truefeel ID를 추가해주면 됩니다.



 

등록 내용 설정

"분,시,일,월,요일, 실행명령" 순으로 설정



 

crontab 파일 형식
------    --------  ---------------------------------------------------
필  드    의  미    범  위
------    --------  ---------------------------------------------------
첫번째    분        0-59
두번째    시        0-23
세번째    일        0-31
네번째    월        1-12
다섯번째  요일      0-7 (0 또는 7=일요일, 1=월, 2=화,...)
여섯번째  명령어    실행할 명령을 한줄로 쓴다.
------    --------  ---------------------------------------------------

- 한 줄당 하나의 명령 (두줄로 나눠서 표시할 수 없음)
- # 으로 시작하는 줄은 실행하지 않는다 (주석)

 

 

crontab -e 을 하면 vi 에디터가 나온다.(환경변수 EDITOR에 따라 다른 에디터를 사용할 수 있다.)


  $ crontab -e
  # /home 디렉토리를 /BACKUP/home 으로 백업해둠
  # 30분, 새벽 4시와 낮 12시, 모든 일, 모든 월, 모든 요일
  30 4,12 * * *  /usr/bin/rsync -avxH --delete /home /BACKUP/home > /dev/null 2>&1

  # 파일/디렉토리 퍼미션 설정
  # 40분, 새벽 1시, 매주 일요일
  40 1    * * 0  /root/bin/perm_set.sh   > /dev/null 2>&1


  # 20분마다 실행

  */20 * * * * /shell/mrtg

 


 

위는 매일 4:30분과 12:30분에 rsync 명령을, 매주 일요일 1:40분에 perm_set.sh를 실행함을 의미한다.

vi 에디터를 통해 설정을 하므로 중요한 몇 가지 에디터 사용법은 익혀야 한다.

----  -----------------------------------------------------------------------------
키    의미
----  -----------------------------------------------------------------------------
i     현재 칸에 글을 넣는다.
o     다음줄에 글을 넣는다.
dd    한줄을 삭제한다.
:wq   저장하고 빠져나온다.
ESC   설정중에 명령어 모드(위의 i, o, dd 등을 사용할 수 있는 상태)로 빠져 나온다.
----  -----------------------------------------------------------------------------


설정 예

시간 설정에서 몇가지 의미있는 것들을 알아보자.

- '*'표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7 와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.
- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다.
  (2~10까지 3간격으로. 즉, 3,6,9를 의미함)

=>  > /dev/null  2>&1 이 무슨 뜻입니까?
  지정한 명령어 처리 결과와 발생할지 모르는 에러메시지를 출력하지 않고 모두 버린다는(/dev/null)는
  뜻입니다. 만약 결과와 에러를 파일로 저장하려면 /dev/null 대신 파일명을 적어주면 됩니다.


 

예)

20  2     *  *  6  명령어 => 매주 토요일 새벽 2:20

0  4-6   *  *  *  명령어 => 매일 오후 4,5,6시

5  */2 *  *  * 명령어 => 매일 2시간간격으로 5분대에

15  1   1  *  *  명령어 => 매월 1일 새벽 1:15

30  0   1  1,7  *  명령어 => 1,7월 1일 새벽 0:30


 

10 2 * * * /app11/minsang/APP/ldap/run.sh > /app11/minsang/APP/ldap/cron_error.log
55 13 * * * /run.sh > /mail_cron_error.log
0,30 8-19 * * * /sendAdmin.sh > /cron_admin_error.log

 

 

출처 - http://gogorchg.tistory.com/entry/%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8

 

 

#define SIGHUP   1
#define SIGINT   2
#define SIGQUIT   3
#define SIGILL   4
#define SIGTRAP   5
#define SIGABRT   6
#define SIGIOT   6
#define SIGBUS   7
#define SIGFPE   8
#define SIGKILL   9
#define SIGUSR1  10
#define SIGSEGV  11
#define SIGUSR2  12
#define SIGPIPE  13
#define SIGALRM  14
#define SIGTERM  15
#define SIGSTKFLT 16
#define SIGCHLD  17
#define SIGCONT  18
#define SIGSTOP  19
#define SIGTSTP  20
#define SIGTTIN  21
#define SIGTTOU  22
#define SIGURG  23
#define SIGXCPU  24
#define SIGXFSZ  25
#define SIGVTALRM 26
#define SIGPROF  27
#define SIGWINCH 28
#define SIGIO  29
#define SIGPOLL  SIGIO
/*
#define SIGLOST  29
*/
#define SIGPWR  30
#define SIGSYS  31
#define SIGUNUSED 31

/* These should not be considered constants from userland.  */
#define SIGRTMIN 32
#define SIGRTMAX _NSIG

 

* 주요 시그널 종류

 

SIGABRT : abort함수를 호출하면 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGALRM: alarm 함수를 호출하면 보내지며, 이 시그널을 받으면 종료한다.

 

SIGBUS: 하드웨어 결함이 탐지되면 보내지며, 이 시그널을 받으면 종료한다.

 

SIGCHLD : 자식 프로세스가 종료되면 부모 프로세스에 보내지며 ,wait에서 이 시그널에 의해 깨어난다.

 

SIGCONT:중단되어 있는 프로세스가 이 시그널을 받으면 실행을 하고 실행중인 프로세스가 받으면 무시한다.

 

SIGFPE:0으로 나누기,부동소수점 오류등이 발생했을때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료

 

SIGHUP:터미널 연결이 끊어 졌을때 이 터미널과 연결된 세션 리더 또는 세션에 속한 모든 프로세스들에게 보내지며, 이시그널을 받으면 종료한다.

 

SIGILL:불법 명령어를 실행할때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGINT:터미널에서 인터럽트 키(일반적으로 <CTRL+C>)를 눌렀을때 보내지며, 이 시그널을 받을시 종료

 

SIGKILL:프로세스를 종료 시키기 위해 보내지며,이 시그널을 받으면 반드시 종료한다.

 

SIGPIPE:터미널에서 종료키(일반적으로<CTRL+\>)를 눌렀을때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료

 

SIGSEGV:잘못된 메모리 주소를 접근하고자 할때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGSTOP:프로세스를 멈추기 위해 보내지며, 이 시그널을 받으면 반드시 멈춘다.

 

SIGSYS:잘못된 시스템 호출을 했을 때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGTERM:프로세스를 종료시키기 전에 하던 일을 정리하고 종료할 것을 알릴때 보내진다.

 

SIGTSTP:터미널에서 일시 중지 키(일반적으로(CTRL+Z))를 눌렀을때 보내지며, 이 시그널을 받을시 멈춤

 

SIGTTIN:백그라운드 작업중인 프로세스가 표준 입력을 하려 할때 현재 실행중인 프로세스에 보내지며 이시그널을 받으면 멈춘다.

 

SIGTTOU:백그라운드 작업중인 프로세스가 표준 출력을 하려 할때 현재 실행중인 프로세스에 보내지며, 이 시그널을 받으면 멈춘다.

 

SIGQUIT : 대화형 종료 : 코어 덤프 ( 보통 Ctrl + I)

 

SIGURS1&SIGURS2:사용자가 정의해서 사용할 수 있는 시그널로, 이 시그널을 받으면 종료한다.

 

 

* 시그널을 사용하는데 자주 쓰이는 함수들 : 시그널 마스크와 시그널 세트 다루기

 

int sigemptyset(sigset_t *set) //빈 시그널 집합을 생성

 

int sigfillset(sigset_t *set)//모든 시그널을 포함한 집합을 생성

 

int sigaddset(sigset_t,*set,int signum)//시그널 집합에 추가

 

int sigdelset(sigset_t,*set,int signum)//시그널 집합에서 삭제

 

int sigismember(const sigset_t *set, int signum)//시그널 집합에 signum이 속하는지 확인

 

set: 시그널 집합

 

signum: 시그널 번호

 

 

시그널 처리....

 

void (*signal(int signum,void(*sighandler)(int)))(int)//시그널 처리를 설정한다.

signum:시그널 번호

sighandler:설정할 시그널 핸들러

 

****시그널 핸들러의 종류 3가지*****

함수 이름 : 시그널을 받으면 "함수 이름" 함수가 실행됨.

SIG_IGN  : 시그널을 받으면 무시한다.

SIG_DFL : 시그널을 받으면 시스템에서 기본적으로 설정한 동작을 한다.

**********************************

조금 업글된 기능의 시그널 처리 함수로..

 

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact)//시그널 처리를 설정

signum:시그널 번호

act : 설정할 행동

oldact:이전 행동

********act의 구조체 분석************

struct sigaction{

void(*sa_handler)(int)//설정할 시그널 핸들러

void (*sa_sigaction)(int,siginfo_t *,void *)//sa_handler 대신 사용될 시그널 핸들러

sigset_t sa_mask;//시그널을 처리하는 동안 블록화할 시그널 집합

int sa_flags;// 시그널 처리 관련 옵션들

void(*sa_restorer)(void);//사용되지 않음

}

 

 

시그널 보내기......

int kill(pid_t pid, int sig)//프로세스에 시그널을 보낸다.

int pause(void)//시그널이 도착할 때까지 실행을 중단시킨다.

int raise(int slg)//자기 자신에게 시그널을 보낸다.

unsigned int alarm(unsigned int seconds)//자신에게 SIGALRM시그널을 보낸다

pid:시그널을 받을 프로세스의 프로세스 ID

sig:보내고자 하는 시그널 번호

seconds: 시그널을 보낼 시간, 초

 

****pid값****

양의정수: 프로세스 ID가 pid인 프로세스에 시그널을 보낸다.

0: kill을 호출한 프로세스가 속한 프로세스 그룹의 모든 프로세스에 시그널을 보낸다

-1:1번 프로세스를 제외한 모든 프로세스에 큰 번호에서 작은 번호의 프로세스 순으로 시그널을 보낸다

-1미만:pid절대값프로세스 그룹의 모든 프로세스에 시그널을 보낸다.

 

 

시그널 블록.....

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)//블록화될 시그널을 설정한다.

int sigpending(sigset_t *set)//블록화된 시그널을 얻어온다.

int sigsuspend(const sigset_t *mask)//시그널 블록을 설정함과 동시에 시그널이 도착할때까지 중단

how:취할 동작

mask:블록화될 시그널 집합

set: 설정할 시그널 집합

oldset: 이전에 블록화된 시그널 집합

 

****how 값******

SIG_BLOCK : 기존에 블록화된 시그널 집합에 set의 시그널이 추가된다.

SIG_UNBLOCK: 기존에 블록화된 시그널 집합에서 set의 시그널이 제외된다.

SIG_SETMASK:set의 시그널이 블록화된 시그널 집합으로 교체된다.

출처 - http://powergi.tistory.com/entry/%ED%8E%8C-Makefile%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90-1

 

컴파일

 

작성한 코드에 구문검사를 해서 구문에 이상이 있다면 오류를 내주어 작성한 유저에게 알려주고 만약 검사에 이상이 없다면 프로그램이 시작되기 전에 메모리에 올라간다. 이처럼 컴파일의 역할은 유저가 작성한 코드에 이상이 없는지 검사하고 코드에 작성된 변수나 함수들을 메모리에 올려주는 역할을 한다.

 

 링크

 

프로그램을 만드는 마지막 작업이 바로 링크(Link)라는 과정이다. 필요한 조각들을 모두 모으거나 어떤 부분이 빠져 있는지 알아보기 위한 과정이다. 정적 라이브러리(Static Library)를 사용할 때, 링커는 프로그램이 필요로 하는 부분을 라이브러리에서 찾아서 그냥 실행파일에다 카피해버린다. 공유 라이브러리(또는 동적 라이브러리)의 경우에는 이렇게 하는 것이 아니라 실행파일에다가 단지 "실행될 때 우선 이 라이브러리를 로딩시킬 것"이라는 메시지만을 남겨놓는다. 당연히 공유 라이브러리를 사용하면 실행파일의 크기가 작아진다. 그들은 메모리도 또한 적게 차지하며, 하드 디스크의 용량도 적게 차지한다.

링킹(linking)은 여러가지 코드와 데이터를 묶어 메모리로 로드될 수 있는 하나의 실행 가능한 파일을 만드는 작업이다.

링킹은 컴파일-타임때 행해질 수도 있고, 로드-타임(로더에 의해), 혹은 런-타임(응용 프로그램에 의해)때도 행해질 수 있다.

 

Cygwin

 

윈도우 환경에서 GNU 프로그램을 사용할 수 있는 환경을 제공하는 프로그램

http://falinux.com/win/study/cygwin/cygwin1.html

Make Utility

1. 들어가기

 

프로그래머들은 작은 프로그램을 작성할 때는 단순히 수정하고 나서 모든 파일을 다시 컴파일 하여 새로 프로그램을 만들게 된다. 그러나 좀더 규모가 큰 프로그램에서는 이런 간단한 방법이 약간의 문제를 가져오게 될 것이다. 하나의 파일만 변경하게 되더라도 다시 컴파일 해야 하는 등의 수정하고 컴파일하고 테스트하는데 많은 시간을 소모하게 될 것이다. 이것 같은 문제를 해결하기 위해서 만들어 진 것이 make 유틸리티이다. 다시 정리하자면 이 유틸리티는 큰 프로그램을 유지하는 필요한 유틸리티이며, 프로그램 중 어느 부분이 새롭게 컴파일 되어야 하는지를 자동적으로 판단해서 커맨드(컴파일러, 쉘등)를 이용하여 프로그램을 재 컴파일을 하게 된다.

 

2. 왜 사용하지?

 

프로그램을 개발하게 되면 보통 라인 수가 증가하게 되어 하나의 파일만으로 프로그램을 구성하는 것은 어려운 일이다. 그래서 보통은 각각의 기능을 작은 모듈로 나누어 여러 파일로 나누어 개발을 하게 된다. 이 파일들은 서로 관계를 가지고 있는데, 어느 하나를 필요에 의해 바꾸게 되었을 때 그 파일에 있는 모듈(함수)를 이용하는 다른 파일도 새롭게 컴파일 되어야 한다. 하지만 파일 수가 많은 경우 이를 일일이 컴파일을 하게 될 때, 그 불편함과 함께 컴파일 하지 않아도 될 것도 컴파일을 하게 될 수 있고, 컴파일 해야 할 것도 미쳐 못하게 되어 링크시 에러를 발생하게 되는 경우도 있게 된다. 이런 상황에서 자동적으로 관계 있는 것만 새롭게 컴파일 하거나, 여러 개의 입력 파일로부터 출력 파일을 생성할 때 make 유틸리티는 필요하게 된다.

3. 어떻게 사용할까?

 

make 유틸리티는 많은 기능을 제공하지만, 자동으로 입력 파일을 인식하고, 컴파일 하여 출력 파일을 생성하지는 못하기 때문에 이 것에 대한 정보를 make가 알 수 있도록 파일을 제공해야 하는데 이것이 Makefile이라는 파일이다. 이것은 make가 이해할 수 있도록 일정한 형식을 가지고 있는 스크립트 언어와 흡사하다. Makefile에서는 시스템의 쉘을 사용할 수 있으며 컴파일러등의 프로그램들을 실행할 수 있다. Makefile은 대개 프로젝트의 다른 소스 파일과 같은 디렉토리에 존재하며, 큰 프로그램에서는 각 각의 기능들을 위해 독립적인 Makefile을 사용하여 프로그램을 관리한다.

4. Makefile에 대하여… …

 

메이크파일은 기본적으로 대상(Target), 의존 관계(dependency), 명령(command)등에 대한 규칙들(rules) 이루어져 있다. 아래의 list 4-1 기본적인 메이크파일의 플랫폼이다.

 

 

Target . . .  :  Dependency . . .

 

               Command  . . .

 

.                         . . .

. . .

 

List 4-1. Makefile 플랫폼

Note1

 

 

 

 


· Target : Command에 의해서 수행 되어서 나온 결과 파일을 지정하므로, 일반적으로 목적 파일(Object file)이나 실행 파일이다.

 

· Dependency : 생성되는 파일인 대상(Target)과 이것이 의존하는 파일들의 관계를 나타낸다.

 

· Command : Command 부분에 정의된 명령들은 의존 관계(Dependency)부분에 정의된 파일의 내용이 바뀌었거나, 대상(Target) 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행된다. 일반적으로 쉘에서 쓸 수 있는 모든 명령들을 사용할 수 있으며 Bash에 기반한 쉘 스크립트도 지원한다.

 

 

 

4.1. Makefile 예제 보기

 

· 간단한 Makefile 만들기

 

간단하게 Makefile 만들어 보자. 우리가 만들려고 하는 프로그램은 main.c, read.c, write.c 구성되어 있고 모두 io.h을 사용하고 read.c defs.h을 더 포함하고, wirte.c buffer.h라는 라는 헤더 파일을 사용한다고 가정한다. 이들을 각각 컴파일해서 test 라는 실행 파일을 생성시킨다 아래의 list 4-2 상에서 실행 파일을 만든 것이고, List 4-3 Makefile 작성하여 만든 것이다.

 

 

 $gcc -c main.c

 $gcc -c read.c

 $gcc -c write.c

 $gcc -o test main.o read.o write.o

 

List 4-2. 상에서 실행 파일 만들기

 

test: main.o read.o write.o

       gcc -o test main.o read.o write.o

 

  main.o : io.h main.c

       gcc -c main.c

 

  read.o : io.h defs.h read.c

       gcc -c read.c

 

  write.o : io.h buffer.h write.c

       gcc -c write.c

 

 

  $make

  gcc -c main.c

gcc -c main.c

gcc -c main.c

gcc -o test main.o read.o write.o

 

 

List 4-3. Makefile 작성하여 실행 파일 만들기와 실행 화면

Note2

 

 

 


· 쉘 상에서 make명령을 내리면 먼저 make는 먼저 현재 디렉토리에서 makefile이라는 파일을 찾는다. 이 파일이 존재하지 않으면 다시 Makefile이라는 파일을 찾는다.전통적인 유닉스 프로그래머는 makefile을 사용한다.

 

· make Makefile의 내용을 보고, 내부적으로 어떻게 파일들이 의존하고 있는지 조사한다.

 

· 위의 예제에서는 test라는 실행 파일을 만들기 위해서는 main.o io.h, read.o io.h defs.h, 그리고 write.o io.h buffer.h의 헤더 파일과 모두 자신의 소스에 의존 관계임을 알 수 있다. 만약에 main.c를 고친다면 main.o 컴파일되어 다시 생기고, test 다시 링크되어 갱신된다. 만약 io.h 바뀌었다고 가정하면 모든 파일들이 컴파일되어서 목적 파일이 생기고, 그것들이 링크가 되어 test 생긴다

 

 

· 변수를 사용하여 더 간단하게 만들기

 

위의 예제에서 변수를 사용하여 더 간단하게 Makefile을 작성한 것이 List 4-4 이다.

 

# Variables make Makefiles simpler

Objects = main.o read.o write.o

 

test: $(Objects)

       gcc -o test $(Objects)

 

  main.o : io.h main.c

       gcc -c main.c

 

  read.o : io.h defs.h read.c

       gcc -c read.c

 

  write.o : io.h buffer.h write.c

       gcc -c write.c

 

 

List 4-4. 변수을 이용하여 Makefile만들기

Note3

 

 

 


· Makefile에서의 주석문은 #으로 시작하고, 한 줄의 끝까지 계속된다.

 

· Makefile에서는 변수를 사용하기 위해서는 값을 대입하기 위해서는 “=”을 사용하고 $(변수), ${변수}의 형식을 사용하여 값을 쓸 수 있게 된다.

 

· Makefile에서 사용되는 모든 규칙은 탭으로 시작하는 줄에 있어야 한다. 빈 칸은 허용되지 않는다. 다수의 빈 칸과 탭은 같은 것으로 보이고, 유닉스 프로그래밍의 다른 모든 경우에 빈 칸과 탭 사이에는 거의 차이가 없으므로 이것은 문제를 일으킬 수 있다. 또한, Makefile에서 줄의 마지막에 있는 빈 칸은 make명령이 실패하게 할 수 있다.

 

 

· 명령들을 추론하여 만들기

 

make명령은 C 소스인 경우 .o을 이용하여 .c를 추론하여 명령을 내부 규칙에 따라 gcc -c을 수행하게 된다. 아래의 List 4-5는 이것을 보여 주고 있다.

 

 

#Letting make deduce the commands

OBJECTS = main.o read.o write.o

 

test: $( OBJECTS)

       gcc -o test $( OBJECTS)

 

  main.o : io.h

 

  read.o : io.h defs.h

 

write.o : io.h buffer.h

 

.PHONY : clean

clean:

      -rm –f $( OBJECTS)

      @rm –f test

     

 

List 4-5. 명령을 추론하여 만든 Makefile

Note4

 

 

 


· 위의 clean처럼 대상(Target) 부분에 해당하는 부분이 그냥 레이블과 같이 사용될 수 있다. 이것을 Phony Target이라고 하면 위의 형식처럼 사용하는데 .PHONY는 생략하여도 된다.

 

· 위의 예제에서 rm명령 앞에 있는“-“ make가 에러를 무시하게 한다. 예를 들어, 디렉토리를 만들기 원하고 디렉토리가 이미 존재할 경우에 에러를 무시하기 원한다면, mkdir 앞에 “-“를 추가하면 된다.

 

· 위의 예제에서 rm명령 앞에 있는 @ make가 명령을 실행하는 것을 표준 출력 장치로 출력하지 않도록 지시한다.

 

 

 

· 또 다른 형태의 Makefile 만들기

 

내부 규칙에 따라 Target대신에 의존성(dependency)만을 사용하여 만들 것이 List 4-6이다.

 

# Alternative sytle of makefile

 

OBJECTS = main.o read.o write.o

 

test: $( OBJECTS)

       gcc -o test $( OBJECTS)

 

  $(Objects) : io.h

 

  read.o : defs.h

 

  write.o : buffer.h

 

 

List 4-6. 의존성을 이용하여 Makefile만들기

 

4.2. Makefile의 기능을 향상시키 주는 매크로 와 확장자 규칙

 

· 매크로(Macro)란 무엇일까?

 

매크로는 특정한 코드를 간단하게 표현하기 위해 사용되며,프로그램을 작성할 때 변수를 지정하는 것처럼 하면된다. 매크로를 Makefile에서 사용하기 위해서는 $(..) ${..}, $를 사용하는데, 일반적으로 $(..)을 사용하기를 권고한다. 아래의 List 4-7은 매크로의 사용 방법을 보여 주고 있다.

 

 

# Macro makes Makefile happy.

 

OBJECTS = main.o read.o write.o

 

test: $( OBJECTS)

       gcc -o test $( OBJECTS)

 

  $(OBJECTS) : io.h

 

  read.o : defs.h

 

  write.o : buffer.h

 

 

List 4-7. 간단한 매크로 예제

 

· 미리 정해져 있는 매크로(Macro)들의 무엇이 있을까?

 

프로그래머가 매크로를 만들어 사용할 수 있지만, 미리 정의된 매크로들이 있다. 이 매크로들을 보기 위해서는 make p라고 입력해 보면 make에서 미리 정의 되어 있는 모든 값들(매크로, 환경 변수등등)을 볼 수 있다. 아래의 List 4-8은 미리 정의된 매크로를 보여 주고 있으며, List 4-9는 미리 정의 된 매크로를 사용하여 만든 예제이다.

 

 

ASFLAGS = (as 명령어의 옵션 세팅)
AS = gas
CFLAGS = (gcc 의 옵션 세팅)
CC = gcc 
CPPFLAGS = (g++ 의 옵션)
CPP = g++
LDFLAGS = (ld 의 옵션 세팅)
LD = ld

 

List 4-8. 미리 정의된 매크로

Note5

 

 

 


· 매크로는 관습적으로 대문자를 작성된다.

 

· 쉘 상에서 정의한 환경 변수 값들은 그대로 이용된다.

 

 

 

 
OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c
 
CC = gcc
CFLAGS = -g -c
 
TARGET = test 
 
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
 
clean : 
rm -f $(OBJECTS) $(TARGET)
 
main.o : io.h main.c
read.o : io.h read.c
write.o: io.h write.c
 
$make
gcc -g -c main.c -o main.o
gcc -g -c read.c -o read.o
gcc -g -c write.c -o write.o
gcc -o test main.o read.o write.o
 
$make clean
rm -rf main.o read.o write.o test
 

 

List 4-9. 미리 정의된 매크로를 사용한 예제 와 실행 화면

Note6

 

 

 


· CFLAGS 같은 매크로는 make 파일의 내부에서 이용하여 .c파일을 .o파일로 바꾸어 주는 부분이 없어도 CFLAGS에 값을 세팅하면 make가 알아서 컴파일을 수행하여 .o파일을 생성한다.

 

 

 

· 확장자 규칙(Suffix rule)란 무엇인가?

 

파일의 확장자를 보고, 그에 따라 적절한 연산을 수행시키는 규칙이다. 가령 가령 .c 파일은 일반적으로 C 소스 코드를 가리키며, .o 파일은 목적 파일(Object file) 말하고 있다. 그리고 당연히 .c 파일은 컴파일되어서 .o 파일이 되어야 하는 것이다. .SUFFIXS라는 매크로를 사용하여 확장자를 등록하여 있다. 아래의 List 4-10 .SUFFIXES 매크로를 이용한 예제이다.

 

 
 .SUFFIXES : .c .o
 
 OBJECTS = main.o read.o write.o
 SRCS = main.c read.c write.c
 
 CC = gcc
 CFLAGS = -g –c
 
 TARGET = test
 
 $(TARGET) : $(OBJECTS)
      $(CC) –o $(TARGET) $(OBJECTS)
 
 clean:
      rm –f $(OBJECTS) $(TARGET)
 
 main.o : io.h main.c
 read.o : io.h defs.h read.c
 write.o : io.h buffer.h write.c
 
 
 $make
 gcc -g -c main.c -o main.o
 gcc -g -c read.c -o read.o
 gcc -g -c write.c -o write.o
 gcc -o test main.o read.o write.o
 

 

List 4-10. .SUFFIXES를 사용한 예제와 실행 화면

 

 

Note7

 

 

 


· 확장자 규칙에 의해서 make는 파일들 간의 확장자를 자동으로 인식해서 필요한 작업을 자동으로 수행한다. 위의 예제에서는 자동적으로 아래와 같은 루틴이 자동적으로 동작하게 된다.

 

.c .o :

$(CC) $(CFLAGS) -c $< -o $@

 

· make 내부에서 기본적으로 서비스를 제공해 주는 확장자는 다음과 같다.

.out .a .ln .o .c .cc .C .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo

 

· Makefile내부에서 .SUFFIXES 매크로의 값을 세팅해 주면 내부적으로 정의된 확장자의 연산이 동작을 하게 된다. 따라서 확장자 규칙은 make가 어느 확장자를 가진 파일들을 처리할 것인가를 정해 주는 것이다.

 

 

 

· 내부 매크로(Internal macro)무엇일까?

 

make에서는 내부 매크로라는 것이 있다. 이것은 우리가 맘대로 정할 수 있는 매크로는 절대 아니다. 대신 매크로를 연산, 처리하는데 쓰이는 매크로라고 하는 것이 더 적당할 것이다. 아래의 Table 4-1은 내부 매크로에 대해 설명하고 있으며, List 4-11은 내부 매크로를 사용한 예를 보여 주고 있다.

 

내부 매크로

         

$*

확장자가 없는 현재의 대상(Target) 파일

$@

현재의 대상(Target) 파일

$<

현재의 대상(Target) 파일보다 더 최근에 갱신된 파일 이름

(dependency중에서 처음에 위치한 파일 이름)

$?

현재의 대상(Target) 파일보다 더 최근에 갱신된 파일 이름

(모든 dependency 파일의 이름)

 

Table 4-1. 내부 매크로

 

 
 main.o : main.c io.h
     gcc -c $*.c ($* 는 확장자가 없는 현재의 대상 파일이므로 $* 는 결국 main에 해당된다.)
 
 test : $(OBJECTS)
     gcc –o $@ $*.c ($@ 는 현재의 대상 파일이므로 $* 는 결국 test에 해당된다.)
 
 .c .o :
     gcc -c $< (또는 gcc -c $*.c)
($< 는 현재의 대상 파일보다 더 최근에 갱싱된 파일 이름이므로, .o 파일보다 더 최근에 갱신된 .c 파일은 자동적으로 컴파일이 된다. 가령 main.o를 만들고 난 다음에 main.c를 갱신하게 되면 main.c $<의 작용에 의해 새롭게 컴파일 된다.)

 

List 4-11은 내부 매크로를 사용한 예제

4.3 Makefile를 작성할 때 알면 좋은 것들

 

· 긴 명령어를 여러 라인으로 표시하기

 

Makefile을 작성할 때 명령어가 한 줄을 넘어간다면, \문자를 이용해서 여러 라인으로 나타낼 수 있다. 아래의 List 4-12은 긴 명려어를 여러 라인으로 나타내는 예제이다.

 

 

OBJECTS = shape.o \

          rectangle.o \

          circle.o \

          line.o \

          main.o \

          read.o \

          write.o \

 

List 4-12. 여러 라인으로 명령어 나타내는 예제

 

· 매크로 치환(Macro substitution)

 

매크로를 지정하고, 그것을 이용하는 것을 이미 알고 있다. 그런데 필용에 의해 매크로의 내용을 조그만 바꾸어야 할 때가 있다. 매크로 내용의 일부만 바꾸기 위해서는 $(MACRO_NAME:OLD=NEW)과 같은 형식을 이용하면 된다. 아래의 List 4-13은 매크로 치환에 대한 예제이다.

 

 

MY_NAME = Hello World

YOUR_NAME = $(MY_NAME:Hello=Hi)

 

(Jack이란 부분이 Jook으로 바뀌게 된다. YOUR_NAME이란 매크로의 값은 Hi World이 된다.)

 

 

OBJS = main.o read.o write.o

SRCS = $(OBJS:.o=.c)

 

(SRCS에서는 OBJS에서 .o .c로 바뀌게 된다. 다음과 같이 변경되는 것이다.

SRCS = main.c read.c write.c)

 

List 4-13. 매크로 치환에 대한 예제

 

· 자동 의존 관계 생성(Automatic dependency)

 

일반적인 make 구조는 대상(target), 의존 관계(dependency), 명령(command)이 연속적으로 정의 되어 있는데 실행되는데, 명령이 없이 대상과 의존 관계만 표시가 되면 이는 대상이 어는 파일에 의존하고 있는지 표시해 주는 정보 역할을 하게 됩니다. Makefile을 작성할 때 없어서는 안되는 부분입니다. 그런데 일일이 이런 정보를 만든다는 것은 쉬운 일이 아닙니다. 이런 단조롭고 귀찮은 일을 자동으로 해주기 위해서 gcc M XX.c의 형식을 사용하여 의존 관계를 만들게 된다. 프로그램을 설치할 때 make dep라는 것을 친 기억이 있을 것이다. 파일들의 의존 관계를 작성해 준다는 의미이다. List 4-14는 자동 의존 관계를 생성하는 예제이다.

 

 

.SUFFIXES : .c .o 
CFLAGS = -O2 -g
 
OBJS = main.o read.o write.o 
SRCS = $(OBJS:.o=.c)
 
test : $(OBJS)
          $(CC) -o test $(OBJS)
 
dep :
$(CC) –M $(SRCS)
 
 $make dep
 $vi Makefile
 
main.o: main.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/libio.h \
/usr/include/_G_config.h io.h
read.o: read.c io.h defs.h
write.o: write.c io.h buffer.h
  (Makefile의 뒷부분에 위에 내용이 첨가 된다.)

 

 

List 4-14. 자동 의존 관계 생성 예제 및 실행화면

 

 

 

 

 

 

 

 

 

 

 

 

 

· 다중 타켓(Multiple Target)

 

하나의 Makefile에서 꼭 하나의 결과만 만들어 내라는 법은 없다. 결과 파일이 3개가 필요한 경우도 있다. 아래의 List 4-15는 다중 대상(Target)에 대한 예제이다.

 

 

.SUFFIXES : .c .o 
CC = gcc
CFLAGS = -O2 -g
 
OBJS1 = main.o test1.o
OBJS2 = main.o test2.o 
OBJS3 = main.o test3.o 
SRCS = $(OBJS1:.o=.c) $(OBJS2:.o=.c) $(OBJS3:.o=.c) 
 
all : test1 test2 test3
 
test1 : $(OBJS1)
        $(CC) -o test1 $(OBJS1) 
 
test2 : $(OBJS2)
        $(CC) -o test2 $(OBJS2)
 
test3 : $(OBJS3)
        $(CC) -o test3 $(OBJS3)
 
deep :
        $(CC) -M $(SRCS)
 
$make all (또는 make)
gcc -O2 -g -c main.c -o main.o
gcc -O2 -g -c test1.c -o test1.o
gcc -o test1 main.o test1.o ( test1 의 생성 ) 
gcc -O2 -g -c test2.c -o test2.o
gcc -o test2 main.o test2.o ( test2 의 생성 )
gcc -O2 -g -c test3.c -o test3.o
gcc -o test3 main.o test3.o ( test3 의 생성 )
 

 

 

List 4-15. 다중 대상(Target)에 대한 예제 및 실행 화면.

 

 

 

 

· 순환 make(Recursive make)

 

규모가 큰 프로그램들은 파일들이 하나의 디렉토리에 있지 않는 경우가 많다. 여러 개의 서브시스템이 전체 시스템을 구성한다고 가정하면 각 서브시스템에 Makefile이 존재한다. (서브시스템 = 서브디렉토리) 따라서 여러 개의 Makefile을 동작시킬 필요가 있도록 Makefile을 고쳐 보자. 서브디렉토리에 있는 Makefile을 동작시키는 방법은 의외로 간단하다. 아래의 List 4-16은 순환 make에 대한 예를 보여 주고 있다.

 

subsystem:
                cd subdir; $(MAKE) .....(1)
 
subsystem:
                $(MAKE) -C subdir .....(2)

 

(위의 예제에서 (1) (2)는 동일한 명령을 수행한다 우리가 만들 시스템의 타겟이 subsystem이다. 우선 subdir이라는 곳으로 가서, 거기에 있는 Makefile을 동작시키게 된다. MAKE라는 것은 그냥 make라는 명령어를 표시하는 매크로일 뿐이다.)

 

SUFFIXES : .c .o
CC = gcc
CFLAGS = -O2 -g
 
all : DataBase Test <- 요기에 집중.
 
DataBase:
    cd db ; $(MAKE)  (db 로 이동해서 make 실행 )
 
Test: 
    cd test ; $(Make)  ( db 로 이동해서 make 실행 )

 

$make
cd db ; make
make[1]: Entering directory`/home/raxis/TEST/src'
gcc -O2 -g -c DBopen.c -o DBopen.o
gcc -O2 -g -c DBread.c -o DBread.o
gcc -O2 -g -c DBwrite.c -o DBwrite.o
make[1]: Leaving directory `/home/windows/TEST/src'
cd test ; make
make[1]: Entering directory `/home/raxis/TEST/test'
gcc -O2 -g -c test.c -o test.o
make[1]: Leaving directory `/home/windows/TEST/test'

(make뒤의 대괄호의 1이라고 나타난 것은 현재의 레벨을 의미한다. 원래 디렉토리의 레벨이 0이고, 여기서는 레벨이 하나 더 내려갔으므로 1이라고 표시된 것이다.)

 

List 4-16. 순환 make 대한 예제 및 실행 화면

· 불필요한 재컴파일 막기

 

의존 관계 규칙에 의해 하나가 바뀌면 그에 영향받는 모든 파일이 바뀐다고 앞에서 말했다. 그러나 다른 파일들에게 아무 영향을 주지 않도록 수정하였는데도 재컴파일을 시도한다면 시간 낭비가 될 수도 있다. 가령 모든 .c 파일에서 include 하는 헤더 파일에서 새로운 #define PI 3.14 라고 정의를 했다고 가정하자. 그리고 PI라는 것은 아무 곳에서도 사용을 하지 않는다. 이때는 'make -t' 라고 해보자. -t touch를 의미하는 옵션으로써 컴파일을 하지 않는 대신 파일의 생성 날짜만 가장 최근으로 바꾸어 놓는다. 새로 컴파일 된 것처럼 처리를 하는 것이다. touch유틸리티 명렁어에 익숙한 사람이라면 이해할 것이다. touch는 파일의 생성 날짜를 현재로 바꾸어 주는 간단한 유틸리티이다.

4.4 Makefile에 사용되는 옵션

make에서 거의 모든 것은 Makefile내부에서 모두 지정을 할 수 있다. 그중 일부를 make의 실행 시에 옵션으로 통해서 줄 수도 있다. List 4-17은 수많은 옵션중에서 가장 많이 사용 옵션을 보여 주고 있다.

-C dir

위에서도 밝혔듯이 Makefile을 계속 읽지 말고 우선은 dir로 이동하라는 것이다. 순환 make에 사용된다.

 

-d

Makefile을 수행하면서 각종 정보를 모조리 출력해 준다. (-debug) 결과를 파일로 저장해서 읽어보면 make 의 동작을 대충 이해할 수 있다.

 

-h  옵션에 관한 도움말을 출력한다. (-help)

 

-f file  file 에 해당하는 파일을 Makefile로써 취급한다. (-file)

 

-r

내장하고 있는 각종 규칙(Suffix rule )을 없는 것으로 (-no-builtin-rules)간주한다. 따라서 사용자가 규칙을 새롭게 정의해 주어야 한다.

 

-t  파일의 생성 날짜를 현재 시간으로 갱신한다. (-touch)

 

-v  make의 버전을 출력한다. ( GNU make 3.73 을 씁니다.) (-version)

 

-p  make에서 내부적으로 세팅되어 있는 값들을 출력한다. (-print-data-base)

 

-k  

make는 에러가 발생하면 도중에 실행을 포기하게 되는데 (-keep-going) -k 는 에러가 나더라도 멈추지 말고 계속 진행하라는 뜻.

 

List 4-17. Makefile의 옵션들

4.5 Makefile의 실제 예제

아래의 List 4-18 List 4-19 Makefile 예를 보여 주고 있다.

 

HOSTARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \

           -e s/arm.*/arm/ -e s/sa110/arm/ -e s/macppc/ppc/)

 

HOSTOS := $(shell uname -s | tr A-Z a-z)

 

ifeq ($(HOSTARCH),ppc)

CROSS_COMPILE =

else

CROSS_COMPILE =

endif

 

export CROSS_COMPILE HOSTARCH

 

TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)

 

export TOPDIR

 

include $(TOPDIR)/config.mk

          

SUBDIRS = common driver

 

#OBJS = ascu/libascu.a

OBJS += driver/libdriver.a

#OBJS += net/libnet.a

OBJS +=        common/libcommon.a

 

all:   ascu

       @for dir in $(SUBDIRS); \

       do \

               $(MAKE) -C $$dir || exit 1 ; \

       done

 

ascu:  depend subdirs $(OBJS) $(LDSCRIPT)

               $(CC) -o ascu_prog $(OBJS)  -D_REENTRANT -lpthread

 

subdirs:

               @for dir in $(SUBDIRS) ; \

               do \

                        $(MAKE) -C $$dir || exit 1 ; \

               done

 

depend dep:

               @for dir in $(SUBDIRS) ; \

               do \

                        $(MAKE) -C $$dir .depend ; \

               done    

 

clean:

       rm -f `find . -type f \

               \( -name '*.o' -o -name '*.a' \) -print`

       rm       -f ascu_prog ascu.elf ascu.map

 

clobber:       clean

       rm -f `find . -type f \

               \( -name .depend -name '*.o' -o -name '*.a' \) \

               -print`

       rm -f ascu_prog ascu.elf ascu.map

 

List 4-18  첫번째 Makefile 예제

 

include $(TOPDIR)/config.mk

 

LIB = ascu

 

LIBDIR = lib$(LIB).a

 

OBJS   = $(patsubst %.c,%.o,$(wildcard *.c))

 

$(LIBDIR):     .depend $(OBJS)

       $(AR) crv $@ $^

 

#########################################################################

 

.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)

               $(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@

 

sinclude .depend

 

#########################################################################

 

 

List 4-19  두번째 Makefile 예제

아래의 List 4-20 List 4-19 Makefile에 의해 생성된 dependency 파일을 보여 주고 있다.

 

 

main.o: main.c /usr/include/stdio.h /usr/include/features.h \

 /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \

 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h \

 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h \

 /usr/include/bits/types.h /usr/include/libio.h \

 /usr/include/_G_config.h /usr/include/bits/stdio_lim.h \

 /usr/include/bits/stdio.h

 

List 4-20  생성된 dependency 파일(.depend)

http://program.egloos.com/1373351



-o
옵션: gcc에서 만들 실행 파일명을 정하는 것. 안지정하면 a.out
%gcc -o filter filter_driver.c define_stack.c global_var.c


-c 옵션 : 컴파일하지만 링크하지는 않는 다는 것을 의미
%gcc -c filter_driver.c


-D 옵션 : 소스코드의 #define 문과 같다. 심볼에 대한 값을 지정
% gcc -c -DDOC_FILE=\"info\" -DUSE_POLL filter_driver.c
첫 번째 -D 옵션은 DOC_FILE 을 info 라는 문자열로 대치한다는 것
두 번째 -D 옵션은 USE_POLL 심볼을 정의한다.


-U 옵션 : 외부에서 #undef ex_ -UDEBUG

-I 옵션 : 헤더파일이 위치한 디렉토리 지정
% gcc -c -I../headers filter_driver.c


-l 옵션 : 라이브러리를 지정. 파일명과 함께 붙여 쓴다.
% gcc -o plot main.o plot_line.o -lm
-lm 옵션은 수학 라이브러리를 포함한다는 것을 지정


-L 옵션 : 라이브러리 폴더를 찾아서 지정
% gcc -o plot -L/src/local/lib main.o plot_line.o -lm


-E 옵션 : 프로그램을 컴파일 하는 대신 전처리된 코드를 표준 출력으로 내보냄 <전처리>

-S 옵션 : 어셈블리 언어로 나온 결과를 저장 .c 대신 .s 가 붙는 파일을 만들어 낸다.<컴파일>

-c 옵션 : .o 로 끝나는 오브젝트 파일 생성 <어셈블>

 


[ C 언어 옵션 ]
-v 옵션 : (verbose) 컴파일러의 버전과 각 단계에서 실행하는 자세한 사항을 출력 (어떤 옵션으로 컴파일 하였는지)

-w 옵션 : 모든 경고 메시지가 나오지 않도록

-W 옵션 : 합법적이지만 다소 모호한 코딩에 대하여 부가적인 경고 메시지를 출력

-Wall 옵션 : 모호한 코딩에 대하여 훨씬 더 자세한 경고 메시지를 출력

 

 

 


[ 라이브러리 지정 옵션 ]

 

 

-static 옵션 : 공유 라이브러리가 아닌 정적 라이브러리와 링크

-shared 옵션 : 가능한 한 공유 라이브러리와 링크하고 공유 라이브러리가 없는 경우에는 정적 라이브러리와 링크

 

 

 


[ 디버깅, 프로파일링 옵션 ]

 

 

-p 옵션 : 프로그램을 prof 로 프로파일링 할 수 있도록 링크. mon.out 파일 생성됨. 프로그램 실행 통계 수치를 담고 있다.

출처 - http://soooprmx.com/wp/archives/4993

 

C프로그램의 파라미터 파싱 및 처리

문자열 파싱은 스크래치 상태(아무것도 없는 빈 상태)로부터 구현하기가 만만치 않은데, 이를 도와주는 라이브러리 함수가 있으니 바로 unistd.h에 정의된 getopt() 함수이다.

getopt()

이 함수의 원형은 다음과 같다.

int getopt(int argc, char * const argv[], const char *optstring);

이 함수의 파라미터는 간단한다.

  1. argc, argv : main() 함수가 받은 파라미터를 그대로 전달한다.
  2. optstring : 파싱해야 할 파라미터를 쓴다. 옵션이 별도의 파라미터를 받는 경우 콜론을 함께 쓴다.

예를 들어 -h, -v, -f filename을 받는 세 가지 옵션이 있다고 하면 옵션스트링은 "hvf:"가 된다. 각각의 옵션을 파싱해내기 위해서는 getopt()함수가 0을 리턴할 때까지 계속해서 반복하면 된다.

그외 전역변수

이 함수와 관련된 전역 변수에는 다음과 같은 것들이 있다.

  • optarg : 옵션 뒤에 별도의 파라미터 값이 오는 경우, 이를 파싱한 결과 파라미터 값은 optarg에 문자열로 저장된다.
  • optind : 다음번 처리될 옵션의 인덱스이다. 만약 파싱한 옵션이후에 추가적인 파라미터를 받는다면 (예를 들어 입력 파일 이름 같이) 이 값을 활용할 수 있다. getopt()함수는 한 번 호출될 때마다 이 값을 업데이트한다.
  • opterr : 옵션에 문제가 있을 때, 이 값은 0이 아닌 값이되며, getopt()함수가 메시지를 표시하게 된다.
  • optopt : 알 수 없는 옵션을 만났을 때 해당 옵션이 여기에 들어간다. (이 때 getopt의 리턴값은 ‘?’가 된다.)

샘플 코드

아래 샘플 코드는 간략한 예를 보여준다. 이 코드에서는 a, b, c의 세 옵션을 인식하며 각각의 옵션이 주어지는 경우 해당 플래그 변수를 1로 정의하고 그 결과를 출력한다.

1:  #include <stdio.h>
2:  #include <unistd.h> // for getopt()
3:  
4:  int main(int argc, char * const * argv){
5:      int flag_a = 0, flag_b = 0, flag_c = 0;
6:      int c; // option
7:      while( (c = getopt(argc, argv, "abc")) != -1) {
8:          // -1 means getopt() parse all options
9:          switch(c) {
10:             case 'a':
11:                 flag_a=1;
12:                 break;
13:             case 'b':
14:                 flag_b=1;
15:                 break;
16:             case 'c':
17:                 flag_c=1;
18:                 break;
19:             case '?':
20:                 printf("Unknown flag : %c", optopt);
21:                 break;
22:         }
23:     }
24:     if(flag_a) {printf("flag a is ON \n");}
25:     if(flag_b) {printf("flag b is ON \n");}
26:     if(flag_c) {printf("flag c is ON \n");}
27:     return 0;
28: }

보통 while문으로 루프를 돌면서 옵션들을 하나씩 검사한다. getopt가 optstring으로 정의되지 않은 옵션문자를 만나면 opterr 값이 세팅되고, 동시에 getopt()함수가 해당 문자에 대해 메시지를 출력한다. 이 때 반환값은 '?'가 되고 이때 알 수 없는 옵션 문자는 optopt에 저장된다.

추가 파라미터를 필요로하는 옵션

gcc의 -o와 같이 파일 이름등의 추가 파라미터를 필요로하는 옵션은 다음과 같이 처리한다.

  1. optsting에서 옵션 문자 뒤에 콜론을 붙인다. "abcf:"와 같은 식으로 쓴다.
  2. getopt()함수는 -f를 만나면 자동으로 그 뒤에 붙은 문자열을 공백까지 탐색하여 이를 optarg에 복사한다.
  3. 처리시에는 리턴값이 ‘f’인 경우 optarg의 값을 그대로 액세스하면 된다.

이러한 처리 코드는 아래와 같다.

case 'f':
    memcpy(file_name, optarg, strlen(optarg));
    break;

또한 파라미터가 있다고 정의한 경우, 파라미터 값이 빠진채로 실행되었다면 이 때는 옵션이 인식할 수 없는 옵션으로 처리된다.

case '?':
    if(optopt == 'f') {
        printf("option -f requires FILENAME\n");
    }
    break;

optind

옵션문자들을 모두 처리한 이후에 프로그램 자체의 파라미터를 처리하기 위해서는 optindargv의 인덱스로 사용하여 파라미터를 전달 받을 수 있다.

그외 긴 이름

--output등의 긴 이름 옵션을 사용하기 위해서는 getoptlong함수를 사용한다.

1. chmod : 파일, 디렉토리 권한 수정

옵션 설명
4 파일에 대한 읽기의 허가
2 파일에 대한 쓰기 허가
1 파일에 대한 실행하기 허가
0 파일의 읽기,쓰기,실행하기 금지
400 소유자에 의한 읽기 가능
200 소유자에 의한 쓰기 가능
100 소유자에 의한 수행 가능
700 소유자에 의한 읽기,쓰기 허가
그룹에 속한 사용자, 일반사용자는 모든 권한 금지
070 그룹에 의한 읽기,쓰기 가능
007 다른 그룹 또는 사용자에 의해 수행,읽기,쓰기 가능

w : 4, x : 2, r : 1
   - ex) 
        
chmod 755 a_file         
        ( 소유자에겐 7(rwx), 그룹과 나머지에겐 5(r-x) 권한부여 )
        chmod o+rw a_file         
        ( others에게 읽기, 쓰기 권한 부여 )
        chmod 700 *                
         ( 현재 위치의 모든 파일과 폴더 권한 수정 )
        chmod -R 755 www        
        ( www디렉토리 내의 모든 파일과 디렉토리의 권한 수정 )

2. chown : 파일 소유자, 소유그룹 수정
   - ex) 
        chown bible file1        
         ( file1 파일의 소유자를 bible로 수정 )
        chown bible:bible2 file2         
        ( file2 파일의 소유자를 bible로 그룹을 bible2로 수정 )
        chown -cR nobody:nobody dirl       
        ( dirl 폴더와 그안의 모든 파일,디렉토리의 소유자,소유그룹 변경 )
        chown -R bible:webhost uploads --from=nobody:nobody    
        ( uploads디렉토리 내의 파일중 소유자가 nobody이고 소유그룹이 nobody로 되어 있는 파일의
           소유자를 bible로 변경하고 소유그룹을 webhost로 변경 )

 

출처 - http://egloos.zum.com/slog2/v/3546476


입력명령

-       i : 커서 앞에 삽입

-       a : 커서 뒤에 삽입

-       I : 현재 줄 첫 칸에 삽입

-       A : 현재 줄 끝에 삽입

-       o : 현재 줄 다음에 삽입

-       O : 현재 줄 앞에 삽입

 

커서이동

-       k : , j : 아래, l : 오른쪽, h : 왼쪽

-       ^ 또는 0(숫자) : 줄의 시작으로 이동

-       $ : 줄의 마지막

-       + : 다음 줄의 처음, - : 이전 줄의 처음

 

화면이동

-       H : 키 화면 맨 위로, M : 중간으로, L : 아래로

-       w : 다음 단어 첫 문자, b : 이전 단어의 첫 문자, e : 다음 단어의 끝 글자

-       G 또는 :$ : 파일의 마지막 줄로 이동

-       :n 또는 nG : 줄 번호 n으로 이동

-       n+ : n줄만큼 앞으로 이동, n- : n줄만큼 뒤로

-       ( : 현재 문장의 처음으로, ) : 다음문장의 처음으로

-       { : 현재 문단의 처음으로, } : 다음문단의 처음으로

-       ^u : 반 화면 위로, ^d : 반 화면 아래로

-       ^b : 한 화면 위로, ^f : 한 화면 아래로

-       ^y : 한 줄만 위로, ^e : 한 줄만 아래로

-       ^l : 파일내용 다시 출력

 

내용삭제 및 취소 생략(x, dw, dd, D, u, U)

 

내용수정

-       r : 현재 커서위치의 한 문자 변경

-       R : 현재 커서부터 ESC 입력까지 변경

-       cw : 커서 위치부터 현재 단어의 끝까지 내용변경

-       cc : 커서가 위치한 줄의 내용 변경

-       s, ns : 현재 커서부터 내용변경(ex:5s)

-       C : 커서 위치에서 줄 끝까지 내용 변경

 

편집기능-복사, 잘라내기, 붙이기 생략(yy, dd, p, P)

 

검색

-       /문자열 : 현재위치부터 다음줄 쪽으로 문자열 탐색

-       ?문자열 : 현재위치부터 이전줄 쪽으로 문자열 탐색

-       n : 다음 문자열 탐색, N : 역방향으로 탐색

 

바꾸기 기능

-       :s/문자열1/문자열2/ : 커서가 위치한 줄에서만 문자열 1을 문자열 2로 바꿈

-       :<범위>s/문자열1/문자열2 : 범위 안에서 각 줄의 첫번째 문자열1->2로 바꿈

-       :<범위>s/문자열1/문자열2/g : 범위 안에서 모든 문자열1->2로 바꿈

-       :<범위>s/문자열1/문자열2/gc : 범위 안에서 모든 모든 문자열1->2로 치환할 때 묻고 바꿈

 

파일 읽어오기

-       :r 파일명 : 지정한 파일의 내용을 커서위치 뒤쪽에 삽입

-       :e 파일명 : 지정파일을 연다 (기존파일은 버퍼로 들어감)

-       :n : vi 시작 시 여러 파일을 열었을 경우 다음파일로 이동

 

쉘 명령 실행

-       :!명령어 : 해당 명령어를 쉘에서 실행함

-       :sh : vi를 잠시 빠져나가 쉘로 간다. 돌아올때는 exit(!bash 랑 같음)

 

기타

-       :f 파일명 : 파일이름을 지정한 이름으로 변경

-       :w %.old : 현재 파일을 .old 이름으로 저장해 둘 때

-       ^g : 기본적인 파일정보 출력(파일명, 현재 줄/전체 줄, 현재 칸, 전체 몇 %의 영역에 위치)

-       J : 현재 줄과 다음 줄 연결

-       . : 바로 이전에 수행한 명령 재 실행

-       ~ : 현재 커서 위치의 한 문자를 소문자 혹은 대문자로 전환(->, ->)

 

vi환경 설정(생략, 따로 정리)


 

 

쉘 명령어

 

Touch [옵션] 파일

-       지정한 파일이 존재하지 않으면 생성, 있으면 현재 혹은 지정시간으로 변경

   -a : 접근 시간만 변경

   -c : 지정한 파일이 없는 경우 새로 생성하지 않음

   -m : 수정시간만 변경

   -r ref_file : 시간을 ref_file에서 읽음

   -t 시간입력 : 시간 직접입력 ( [[CC]YY]MMDDhhmm[.ss]  형식으로 입력)

 

쉘 특수문자(몇 가지 너무 흔한 건 생략)

-       ;     한 줄에 여러 개의 명령입력 (ex : date;cal;ls)

-       [ ]    한 문자 위치를 위한 문자 범위표시(ex ls [a-f])

-       |     명령어 파이핑 (ex : ls | grep home)

-       -     이전작업 디렉토리 (ex : cd -)

-       ‘ ‘    모든 쉘 문자 무시(ex : printf ‘$SHELL’)

-       ` `    쉘 명령 수행 (ex : printf “today : `date`”)

-       \    특수문자 기능 제거 (ex : printf”\$SHELL”)

 

입출력 방향 바꾸기

-       > : 새로운 파일로 생성, 기존파일 사라짐

-       >> : 기존 파일의 끝에 내용 추가

-       2> : 표준 오류 출력

-       < : 입력을 키보드에서 파일로 변경(ex : mailx user1 < loveletter)

 

쉘 환경변수

-       set : 쉘 변수(지역)

-       env : 환경변수(전역)

 

-       쉘 변수 정의 : 변수 = (MYENV=KSH)

-       환경 변수 : export 변수=

-       변수 값 확인 echo $변수(또는 printf)

-       변수 정의 해제 : unset 변수

 

프롬프트 설정

PS1에 저장된 값을 프롬프트로 사용함

echo $PS1으로 값을 확인

-       컬러 프롬프트 설정 : PS1=”^[[x;y;nm 프롬프트 ^[[x;y;0m”      (^[ctrl-v+[ 이다]

-       x,y는 색깔 번호를 뜻하고 n은 특수기능을 뜻함

-       특수기능 번호 - 0 : 기본색, 1 : 굵게, 4 : 흑백에서 밑줄, 5 : 반짝임, 7 : 역상, 10 : 기본폰트,

                   38 : 밑줄 사용가능, 39 : 밑줄 사용불가능

-       글자색 컬러번호 : 검정색30부터 시작->,,,,,청록,흰색으로 37까지

-       배경색 번호 : 검정색 40부터 시작->,,,,,청록,흰색으로 47까지

Ex) 프롬프트 파란색으로 : PS1=1”^[ [34;1mBlue! ^[ [0;0m”

 

 

 

파일의 사용권한 및 검색

 

파일의 종류

 ls –l 명령으로 파일과 디렉토리의 속성을 알 수 있다.

Ex) –rw-r—r—1 cn05777 2011 50 9 1 12:00 hello.c

다음과 같이 파일명이 나왔을 때, 맨 앞에(rw전에) 나오는 문자 하나는 파일의 종류를 의미

-       -   : 일반파일

-       d : 디렉토리 파일

-       b : 블록 단위로 읽고 쓰는 블록장치 특수 파일

-       c : 문자 단위로 읽고 쓰는 문자 장치 특수 파일

-       l : 기호적 링크

-       p : 파이프

-       s : 소켓

 

파일사용 권한

그 다음으로 나오는 rw-r—r—는 파일사용 권한을 의미한다.

-       읽기(r), 쓰기(w), 실행(x)

-       순서대로 rw-(소유자)r—(그룹)r—(기타사용자)를 의미

-       chmod [옵션] 모드 파일명       <-이렇게 사용 –R 옵션 주면 하위 디렉토리를 포함 싹 다

권한부여 방법들

1.     기호모드

n  u(소유자),g(그룹),o(기타사용자), a(모든 사용자)

n  +(허가권부여), -(허가권제거), =(허가권지정)

ex) u+w (소유자에게 쓰기 권한 부여)

ex) chmod go=rw first.dat 그룹과 기타에 읽기와 쓰기 권한 부여

ex) chmod +rwx first.dat 소유자는 rwx, 그룹과 기타사용자는 r-x

2.     숫자모드

n  rwx->111, rw- -> 110, r-x ->101 이런식으로 바꿔줌

그리고 8진수에 따라서 이 숫자를 써줌

ex) 755 ->rwxr-xr-x, 764->rwxrw-r—

 

3.     마스크

n  umask [마스크값]

n  umask를 치면 현재 마스크 값이 나온다

n  umask [8진수] (ex: umask 077)로 마스크값을 변경

n  허용하지 않을 값 umask 값으로 지정한다

n  Umask와 파일의 권한이 XOR되어 해당 권한이 제거된다

n  파일생성시 혹은 수정을 할 때 등에 umask가 자동으로 적용된다.

(그래서 chmod +rwx해도 그룹,기타에는 r-xr-x로 설정되는 것이다. 기본 mask 022)

 

 

파일내용 검색

 

grep : 지정한 파일에 패턴이 들어있는지 검색하는 명령어(해당 패턴이 있는 줄을 출력)

grep [옵션] 패턴 파일명들

 옵션 -i : 대소문자를 무시하고 검색

      -l : 해당 패턴이 들어있는 파일 이름을 출력

      -n : 각 라인의 번호도 함께 출력

      -v : 명시된 패턴과 일치하지 않는 줄을 출력

      -c : 패턴과 일치하는 라인수 출력

      -w : 패턴이 하나의 단어로 된 것만 검색

ex) grep –i hello hello.c   (hello.c안에있는 hello를 가져옴, 대소문자 무시)

 

메타문자

  ^ : 라인의 시작 해당 문자열로 시작하는 모든 행(ex : grep ^문자열 a.txt)

  $ : 라인의 끝 해당 문자열로 끝나는 모든 행(ex : grep 문자열$ a.txt)

  . : 한 글자 – .하나가 임의의 한글자로 대응됨(ex : grep a..b a.txt ->a로시작 b로 끝나는 4글자)

  ? : 없거나 한 글자 – ab?으로 쓰면 ab거나 ab다음 임의의 한 글자

* : 앞의 항목이 없거나 반복 – ab*쓰면 ab다음에 업거나 반복적라인 검색

[ ] : 괄호 안의 글자 중 하나 – [ab]d로 쓰면 ad혹은 bd검색

[^] : 괄호 안에 있는 글자가 아닌 글자 – [^a-m]att 쓰면 att앞에 a에서 m이 나오는 않는 라인 검색

 

 

egrep : grep의 확장판 명령

egrep [옵션] 패턴 파일명들

 메타문자

+ : 앞의 글자가 하나 이상 나옴 – [a-z]+ark하면 결과는 airpark, dark, bark, shark

x|y : x또는 y중 하나가 나옴

( | ) : 문자열 그룹 – (1|2)+하면 1또는 2가 하나이상, search(es | ing)하면 searches 또는 searching

 

fgrep : 문자열 검색

fgrep [옵션] 문자열 파일명들

-       이 명령어는 문자열에 들어가는 모든 문자를 일반 문자로 인식한다

*을 쓰거나 ?, + 등을 써도 특수한 메타문자대신 그냥 *,?,+로 인식함

 

find : 파일을 찾는 명령어

find 범위 표현식 동작

 범위설정 :  ~(홈 디렉토리에서 찾기 시작), .(현재 디렉토리에서 찾기 시작) 등등

 표현식

-       -name filename : 파일이름을 지정(메타문자사용 가능하나 “ “ 안에 있어야함)

-      -type : 파일종류(f : 일반파일, d : 디렉토리)

-       -mtime[+ | -]n : 수정(접근)시간으로 검색, +하면 n일보다 오래된거, -하면 n보다 짧거나 일치하는 파일 (atime도 있음) (여기서 n 24시간 단위, 2 48시간)

-       -user loginID : 해당 id가 소유한 파일 모두 검색

-       -size [+ | -]n : 파일크기 설정 +n보다 크거나 -n보다 작거나 크기 n인 파일검색(1=512bytes)

-       -newer : 기준시간, 기준시간보다 이후에 생성된 파일검색 (-newer 기준파일명)

-       -perm : 사용권한, 사용권한과 일치하는 파일검색(8진수로 입력)

동작종류

-       -exec 명령 {} \;   exec옵션은 \;으로 끝난다. 검색된 파일은 {}위치에 들어감

-       -ok 명령 {} \;     exec의 확인모드, 사용자의 확인을 받아야 명령적용

-       -print             화면에 경로명을 출력(기본동작임)

-       -ls                긴 목록형식으로 검색결과를 출력

결합기호

-       -a : and(기본임), -o : or, ! : not  <- 이 세가지 사용해서 결합가능

 

 

which : PATH 환경변수에 지정된 경로에서 명령을 찾음

which 명령 (ex : which ls   -> 결과는 /user/bin/ls)

 

whereis : 지정된 경로에서 명령검색(/usr/bin, /usr/sbin, /usr/game등등등)

whereis 명령

 

 

 

UNIX 프로세스의 종류

-       데몬 : UNIX커널에 의해 시작되는 프로세스로 서비스 제공을 위한 프로세스들

-       부모, 자식 프로세스(^^ 알겟지…)

-       고아 : 자식프로세스 종료 전에 부모가 종료된 프로세스, 고아는 1번 프로세스를 새 부모로 가짐

-       좀비 : 부모프로세스가 종료처리를 하지 않은 프로세스, 프로세스 테이블만 차지하고 있음

ps [옵션]

 옵션

-       -e : 시스템에 있는 모든 프로세스 목록 출력

-       -f : 프로세스에 대한 자세한 정보 출력

-       -u uid : 특정 사용자에 속한 모든 프로세스 출력

 목록보기

-       UID : 소유자의 사용자 ID

-       PID : 프로세스 번호

-       PPID : 부모 프로세스 번호

-       C : 프로세스 우선순위

-       STIME : 프로세스 시작시간

-       TTY : 터미널 번호( ? = 데몬 )

-       TIME : CPU 사용시간

-       CMD : 명령어 이름

 

pgrep : 프로세스 이름으로 찾아 정보를 출력(Solaris only라고 나와있지만 요즘 리눅스 다됨 - _-)

pgrep [옵션] 패턴

 옵션

-       -x : 패턴과 정확히 일치하는 PID 출력

-       -n : 패턴을 포함하고 있는 가장 최근의 PID출력

-       -U uid : 특정 사용자에 속한 PID출력

-       -l : PID와 프로세스 이름출력

-       -t term : 특정 터미널과 관련된 프로세스 출력

 

Kill : 프로세스 종료 (pkill)

kill [시그널] pid

 시그널 종류

-       1 (SIGHUP) : 터미널 연결이 끊어진 경우에 발생

-       2 (SIGINT) : 보통 ctrl-c에 의해 발생

-       9 (SIGKILL) : 프로세스 kill시킴, 무시불가능, 강제종료

-       15 (SIGTERM) : 프로세스 종료시킴, 무시될 수도 있음, 기본시그널(soft kill)

 

pkill [시그널] 프로세스명

-       사용방법은 kill와 같지만 프로세스명으로 사용가능

 

Foreground & background

-       Foreground는 사용자가 명령을 입력한 후 결과가 출력될 때까지 기다려야 하는 경우

-       Background는 처리결과 출력과 관계없이 다른 작업 계속함.(명령 실행 시 마지막에 &붙임)

 

Jobs : 백그라운드 작업을 모두 출력

Job은 쉘이 관리할 수 있는 프로세스(pid와 쉘이 할당한 job id있음)

Jobs [%작업번호] ->특정 작업의 정보만 출력

-       %+ 또는 %% 하면 작업순사가 +인 작업 정보 출력, %-하면 순서가 인 작업정보 출력

 

작업 전환 및 종료명령

bg [%작업번호] : 현재 작업 혹은 특정작업 백그라운드로 전환시켜 실행

fg [%작업번호] : 포그라운드로 전환시켜실행

ctrl+z : 포그라운드작업 중지시키고 백그라운드의 중지된 목록으로 보냄

stop %작업번호 : 백그라운드 수행중인 특정작업 중지

kill %n : 특정 작업을 종료

 

nohup 백그라운드명령

일반적으로 백그라운드 작업을 실행시킨 단말기나 사용자가 로그아웃 시 함께 종료된다.

로그아웃 후에도 작업이 완료될 때까지 실행해야 할 대 nohup사용

명령어 실행 결과와 오류메시지는 현재 디렉토리 nohup.out파일로 자동저장

 

users : 현재 시스템에 로그인하고 있는 사용자명을 출력

 

who : 시스템을 사용하고 있는 사용자의 정보를 출력

-       -q : 사용자명만 출력

-       -H : 출력항목의 제목도 함께 출력

-       -b :마지막으로 재부팅한 날짜와 시간을 출력

 

w [사용자명] : 로그인한 사용자정보와 현재하고 있는 작업정보를 출력

 

who am i whoami 명령의 차이

who am i는 자신의 정보를 출력한다(로긴ID, 시간, 아이피 등), whoami는 로긴ID만 출력

 

id [옵션] : 사용자의 로긴ID와 그룹정보를 출력

-       -a : 기본 그룹외에 2차 그룹정보도 출력

 

 

 

 

 

 

 

 

파일백업 및 압축명령

 

tar : 파일과 디렉토리를 묶어 하나로 만드는 것

tar 기능 [아카이브파일] 파일이름

기능

-       c : tar 파일 생성

-       t : tar 파일목록 보기

-       x : tar 파일 풀기

-       f : 아카이브파일이나 장치 등 지정

-       v : 표준출력으로 실행내용 출력

-       h : 심볼릭링크의 원본 파일 포함

 

jar : 여러 파일을 하나의 jar 아카이브 파일로 묶어서 압축

jar 옵션 [아카이브파일] 파일이름

 옵션

-       c : tar파일생성

-       t : 파일목록보기

-       x : tar파일풀기

-       f : 아카이브파일지정

-       v : 실행내용 출력

-       0 : 압축없이 아카이브 파일만 생성

 

pack / unpack : 확장자가 .z인 압축 파일 생성 및 해제

pack [옵션] 파일이름   /    unpack 파일이름

 옵션

-       - : 상세정보 출력

-       -f : 강제압축

 

pcat 파일이름          :   .z파일 내용을 화면에 출력

 

compress / uncompress : 확장자가 .Z인 압축파일 생성 및 해제

compress [옵션] 파일이름 / uncompress 파일이름

 옵션

-       -v : 압축관련 정보 출력

-       -c : 압축 결과를 화면에 출력. .Z 파일생성 안함

 

zcat 파일이름         : .Z파일 내용을 화면에 출력

 

gzip / gunzip : 확장자가 .gz인 압축파일 생성 및 해제

 옵션

-       -d : 압축해제

-       -l : 압축된 파일의 내용 출력

-       -r : 현재 디렉토리부터 하위 디렉토리까지 모두 압축

-       -t : 압축 파일 검사

-       -v : 압축정보 화면에 출력

-       -g : 최대한 압축

 

gzcat 파일이름    :   .gz파일 내용을 화면에 출력

 

zip / unzip  : 확장자가 .zip인 압축파일 생성 및 해제

zip [옵션] 파일이름   /  unzip 파일이름

-       -v : 압축정보 화면에 출력

 

 

통신명령

 

write 로그인ID [단말기명]       :  사용자에게 메시지를 보냄 작성 후 콘트롤+d누름 전송

wall [파일명]    :  로그인하고 있는 모든 사용자에게 메시지 전송,

파일명은 메시지를 파일로 저장했을 경우 지정

talk 사용자주소 [단말기명] : 다른 사용자와 1:1대화하기

(사용자명@호스트명, 같은 호스트면 사용자명만 지정)

mesg [y | n] : 메시지를 단말기로 출력하는 것을 허용 또는 거부

mailx [-sf] [사용자명@호스트]        / 내용작성 후 . 이나 ^D 입력하면 전송

 옵션

-       -s : 제목 지정

-       -f : mbox의 내용확인

 

hostname : 현재 시스템의 호스트명을 출력

ping 호스트명 또는 IP주소 : 시스템이 네트워크를 통해 연결되는지 확인

finger [id | id@host | @host] : 현재 로그인한 사용자 정보를 출력 

(who결과에 덧붙여 완전한 이름출력->/etc/passwd

@host하면 특정호스트의 사용자 목록 출력

ftp host명 또는 IP주소 : TCP/IP를 사용하는 파일송수신 명령

ftp명령어 생략 : bin, get, put, cd, bye pwd 등등)

 

 

 

 

유틸리티 명령

 

wc : 파일의 라인수, 단어수, 바이트, 문자수 출력

 옵션

-       -c : 바이트 수

-       -m : 문자수

-       -C : -m과 동일

-       -l : 라인수

-       -w : 공백이나 새로운 행으로 구분된 단어수

 

sort : 아스키 코드값을 기준으로 파일의 텍스트 내용을 정렬하여 화면에 출력

sort [옵션] 파일

 옵션

-       -b : 앞에 붙는 공백무시

-       -c : 정렬이 되지 않은 상태로 출력

-       -d : 사전식 순서로 정렬. 숫자, 문자, 공백만 비교(특수문자는 무시)

-       -f : 대소문자 구분안함

-       -m : 정렬된 파일을 통합

-       -n : 숫자를 산술값으로 전환해 정렬

-       -r : 역순정렬

-       -t 문자 : 지정한 문자를 필드 구분자로 사용

-       +번호 : 번호+1필드를 기준으로 정렬

-       +pos1 –pos2 : 정렬하고자 하는 필드의 열을 지정, pos1부터 pos2까지 정렬

 

split : 큰 파일을 일정한 크기의 여러 개 작은 파일로 분할

split [옵션] [파일]

 옵션

-       -b n : 크기가 n 바이트인 파일로 분할

-       -n : n줄씩 분할

(디폴트는 1000줄씩 분할),(파일을 지정하지 않으면 표준입력내용을 분할 저장)

 

uniq : 파일/표준입력으로 입력된 내용 중 중복된 내용의 줄이 연속으로 있으면 하나만 남김

uniq [옵션] [입력파일 [출력파일] ]

 옵션

-       -u : 중복되지 않는 줄만 출력

-       -d : 중복된 줄 중 1줄만 출력

-       -n : 원하는 필드 앞의 공백과 문자열 무시. n은 필드번호

-       -c : 앞에 붙어있는 라인번호는 그대로 유지한다

(파일을 지정하지 않으면 표준입력내용을 처리, 입출력 파일 이름은 달라야 함)

cut : 파일의 각 행에서 선택된 필드를 잘라햄

cut [옵션] [파일]

 옵션

-       -c 리스트 : 각 줄에서 잘라낼 문자 위치 지정

(ex : cut –c5-8 -> 5번째전까지 그리고 8번째이후 자름, cut –c5하면 5번째 문자 외 다 자름)

-       -f 필드수 : 지정한 필드 잘라냄

-       -d 문자 : 필드 구분자

 

paste : 사용자가 지정한 두 개 이상의 파일 내용 중 같은 줄을 붙이거나 파일 끝에 다른 파일의 내용을 추가

paste [옵션] [파일1 파일2 …]

 옵션

-       -s : 파일의 끝에 추가(split으로 나눈 파일을 원래대로 붙일 때, 수평붙이기)

-       -d문자 : 필드 구분자

-       - : 파일대신 표준입력 사용

 

dd : 지정한 입력파일을 지정한 옵션에 따라 변환하여 출력파일로 저장

dd [옵션] [if=입력파일] [of=출력파일]

 옵션

-       bs=n : 입출력 블록의 크기를 n바이트로 지정

-       conv=lcase : 알파벳을 소문자로 변환

-       conv=ucase : 알파벳을 대문자로 변환

 

 출처 - http://arings.tistory.com/entry/Unix-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC1

+ Recent posts