본문 바로가기
예전 포스팅 (~2018)

[Linux] 리다이렉션과 파이브라인 (다중명령)

by akaranch 2021. 10. 1.

#5 리다이렉션과 파이프

리다이렉션과 파이브를 배우기전에  파일 디스크립터 ( File Descriptor , fd )에 대해 알아두어야 합니다.

 

 파일 디스크립터 ( File Descriptor , fd ) 

- 명령어를 사용한다는 것은 명령어 파일을 실행하여

커널에게 처리해야 할 작업을 요청 합니다. 즉 프로세스 ( Process )를 생성합니다.

- 리눅스에서 프로세스가 만들어지면 해당 프로세스는 파일 디스크립터를 생성합니다.

- 파일디스크립터는 "파일 기술자"라고도 부르며 , 데이터의 출입구 역할을 합니다.

( 커널이 프로세스를 관리하는 방법 )

- 프로세스의 출력을 다른 프로세스에 입력하거나 , 파일 또는 터미널등으로 출력하는데 사용합니다.

 

표준 입력 0 stdin

표준 출력 1 stdout

표준 에러 2 stderr

 

* 리다이렉션  ( redirection )

- 표준 입력과 표준 출력의 방향을 재 지정하는 방법입니다.

 

1) 출력 리다이렉션

#[명령어] 1> [파일]

ex) #echo "Linux" 1> file

ex) #echo "Linux" > file

 

기존에 파일이 없다면 생성을 해주지만 , 기존의 존재하는 파일을 지정하면

출력의 결과가 파일안으로 저장되어 덮어쓰기 됩니다.

 

#set -o noclobber    덮어쓰기를 방지하는 기능을 활성화시키는 명령어

#set +o noclobber   덮어쓰기를 방지하는 기능을 비활성화시키는 명령어

 

2. 추가 리다이렉션

#[명령어] >> [파일]

- 기존 파일 내용 하단에 출력의 결과가 추가되는 형태입니다.

 

3. 입력 리다이렉션

#[명령어] 0<[파일]

#ex) cat 0< /etc/passwd

#ex) cat < /etc/passwd

#ex) cat /etc/passwd

 

※ 원활한 이해를 돕기위한 응용문제 1 

(1)  #sort < a.txt > b.txt

해당 명령어의 결과는?

=> a.txt를 sort명령어를 통해서 정렬한 결과가  b.txt에 저장된다.

 

(2) #cat < a.txt > b.txt

해당 명령어의 결과는?

=> a.txt를 cat명령어를 통해서 출력되는 결과가 b.txt에 저장된다.

 

4. 오류 다이렉션

#[명령어] 2> [파일]

의도적으로 에러메세지를 화면에 출력하고 싶지 않을 때 사용합니다.

+@ /dev/null  ( 아무값도 가지고 있지 않도록 만들어진 파일 )

해당 파일로 입력된 데이터는 모두 사라지게 됩니다.

null == 아무값도 없다.

즉 /dev/null 파일로 모든 오류메세지를 보내면 오류메시지를 스킵할 수 있습니다.

 

5. 파이프 ( Pipe )

- 프로세스와 프로세스를 연결시키는 방식

 

# [명령어1] | [명령어2]  -> 명령어1의 출력을 다음 명령어인 명령어2의 입력으로 전달합니다.

# [명령어1] | [명령어2] | ... [명령어 n]

 

※ 원활한 이해를 돕기위한 응용문제 2 

퀴즈 - (1)   #cat /etc/services | grep udp | wc -l

-> /etc/services파일에 udp라는 문자열이 들어간 라인의 수를 확인

(2)  #cat /etc/services | grep tcp | head -1

-> /etc/services파일에 tcp라는 문자열이 들어간 가장 첫번째 줄을 확인

(3)  #cat /etc/services | grep tcp | tail -1

-> /etc/services파일에 tcp라는 문자열이 들어간 가장 마지막 줄을 확인

(4)  #cat /etc/passwd | sort > /root/passwd.txt

-> /etc/passwd파일의 내용을 출력하고  출력의 결과를 알파벳 기준으로

정렬한 내용을 /root/passwd.txt파일로 저장

※ 다중명령사용법 

1. CMD1 ; CMD2 

 

-  첫번째 명령어 부터 순차적으로 실행합니다.

-  첫번째 명령어가 실패하여도 반드시 실행합니다.

 

 [CMD1] ; [ERR1] ; [CMD2]  ->  CMD1,2 실행 , 에러메세지출력

[ERR1] ; [CMD1] ; [CMD2]    -> CMD1,2 실행 , 에러메세지출력

 

2. CMD1 && CMD2

- 첫번째 명령어가 에러가 아닐시에 두번째 명령을 실행합니다.

 

[CMD1] && [CMD2] && [CMD3]  -> CMD 1,2,3을 정상 출력합니다.

[ERR1] && [CMD2] && [CMD3]   ->  에러 메세지

[CMD1] && [ERR2] && [CMD3]   ->  CMD1 출력 , 에러메세지 출력합니다.

[CMD1] && [CMD2] && [ERR3]  ->  CMD1,2출력 , 에러메세지 출력합니다.

 

즉, 에러가 발생하는 시점에서 명령 실행 종료

 

3. CMD1 || CMD2

- 첫번째 명령어가 정상으로 실행될 경우 종료합니다.

 

[CMD1] || [CMD2] || [CMD3] -> CMD1

[CMD1] || [ERR2]  || [CMD3] -> CMD1

[CMD1] || [CMD2] || [ERR3] -> CMD1

[ERR1]  || [ERR2]   || [CMD3]     -> 에러메세지출력, CMD3

 

'예전 포스팅 (~2018)' 카테고리의 다른 글

vSphere ESXi / vCenter 란  (0) 2021.10.01
[Linux] Hardlink & symbolic link  (0) 2021.10.01
[Linux] user permission  (0) 2021.10.01
ADMT를 이용하여 IDC -> AWS AD Migration 구성  (0) 2021.09.23
Private Cloud - Openstack  (0) 2021.09.23

댓글