본문 바로가기
서버/Linux

[Linux] 리다이렉션 (Redirection) & 파이프 (Pipe)

by 느링 2017. 9. 26.

파일 디스크립터 / 파일 기술자 (File Discriptor, FD)

- 리눅스의 모든 파일을 관리하는 방식

 

명령어 실행 ( 컴퓨터에게 작업을 요청 -> 프로세스 생성 )

- 실제 프로그램을 실행시키는 작업

- 이러한 프로그램은 파일로 존재

- 파일을 실행 시키기위해서는 먼저 파일을 열어야 한다.

- 파일이 열리면 커널이 해당 프로세스가 동작하는데 필요한장치나 파일을 번호를 붙이며 관리하고, 이러한 번호를 파일 디스크립터 테이블에 저장

- 자주 사용하는 장치들은 미리 번호가 예약되어 있어서 아래와 같이 표현된다.

 

파일 디스크립터 테이블

장치                                       FD번호

표준 입력장치 (키보드)               0 ( stdin )        - 명령어의 표준 입력

표준 출력장치 (모니터)               1 ( stdout )      - 명령어의 표준 출력

표준 에러장치 (모니터)               2 ( stderr )       - 명령어의 표준 오류

 

리다이렉션 ( Redirection )

기본적으로 명령어의 결과는 표준 출력 방식인 모니터에 출력이 됩니다.

하지만 리다이렉션을 이용하면 명령의 출력을 변경할 수 있습니다.

리다이렉션을 이용하여 파일에 기록할 수 있습니다.

 

기존 파일의 내용을 삭제하고 새로 결과를 저장할 때는 >를,

기존 파일의 내용 뒤에 결과를 추가할 때는 >>를 사용합니다.

 

< / << : 입력 방향 재지정

> / >> : 출력 방향 재지정

> : 덮어씀

>> : 추가됨

 

입력 리다이렉션

#[명령어] < [파일]

- 명령어의 입력(0)으로 파일을 사용

 

ex) #cat < /etc/resolv.conf      == cat /etc/resolv.conf와 동일

ex) #nl < /etc/resolv.conf        == nl /etc/resolv.conf와 동일

ex) #head -3 < /etc/passwd    == head -3 < /etc/passwd와 동일

 

출력 리다이렉션**

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

화면 (표준 출력장치)에 출력되는 결과를 파일의 내용으로 사용하는 방법

 

*표준 출력을 의미하는 fd"1"은 생략 가능합니다.

#ls -l > result

">기호를 통해 result라는 파일로 리다이렉션하라" 라는 뜻입니다.

 

그리고 리다이렉션이 잘 되었는지 확인을 해봅니다.

파일이 이미 존재하는 경우 덮어쓰기 때문에, 지정한 파일과 동일한 이름을 가진 파일이 있는지 먼저 확인한 후에 사용을 해야 합니다.

 

B ash 쉘 덮어쓰기 기능

#set -o noclobber

: 덮어쓰기 방지 기능 활성화

→ 작업을 할 때 이 기능을 사용하면 실수를 막을 수 있습니다.

 

추가 리다이렉션

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

- 표준출력장치(1)에 결과를 파일에 추가

 

오류 리다이렉션

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

오류 출력은

예를들면, Root가 아닌 일반 사용자로 find 명령어를 사용할 때에는 일반 사용자가 접근 할 수 있는 폴더에서만 파일을 찾게 됩니다. 검색 과정 중 Root만이 들어갈 수 있는 폴더에 접촉할 경우 오류 메세지를 내보내게 됩니다.

그럴 경우 이것을 다른 파일로 돌려버리면 오류를 제외한 검색 결과만을 볼 수 있게 되는 것입니다.

/dev/null

- 리눅스 특수 장치 파일로, 해당 파일로 리다이렉션된 내용은 저장이 되지 않는다.

- 항상 null(0)값을 가지는 파일

ex) 파일은 만들어지거나 저장되지 않는다.

 

파이프 (pipe)

기호 - | (shift + \)

파이프란?

앞 명령어의 결과를 뒤에 나오는 명령어의 입력으로 처리하기 위해 사용하는 방법입니다.

즉, 파이프를 이용하면 명령어를 조합해서 쓸 수 있습니다.

 

<예제 1> [명령어1] | [명령어2]

→ 명령어 1의 결과가 명령어 2의 입력으로 전달되어 명령어 2의 결과가 출력됩니다.

cat /etc/passwd | grep "root" == grep "root" /etc/passwd

 

<예제 2> [명령어1] | [명령어2] | [명령어3]

디렉토리 개수 확인하기 

ll | grep "^d" | wc -l

 

* grep "^d" : d로 시작하는 행 (행의 앞글자 d는 directory를 의미)

* ll = ls -l : List 형태로 출력

* wc -l은 행의 개수를 출력

 

'서버 > Linux' 카테고리의 다른 글

[Linux] 쉘 스크립트  (0) 2017.09.28
[Linux] 쉘 환경 변수  (0) 2017.09.28
[Linux] SSH 배너 설정  (0) 2017.09.21
[Linux] vi(visual editor) & vim(vi improved)  (0) 2017.09.19
[Linux] 파일 링크 (심볼릭 & 하드)  (0) 2017.09.19