티스토리 뷰

SYSTEM/LINUX

10) Redirection, Pipe

chrisysl 2018. 4. 22. 15:12

이번에는 파이프와 리다이렉션에 대해 알아보도록 하자.


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

 : 어떤 명령어를 입력하게되면 해당 명령어가 파일로서 존재한다. 그 파일을 사용해서 작업을 처리하는것을 '프로세스'라 부르는데,

프로세스가 생성이되면, 커널이 해당 프로세스를 관리하기 위해 파일 디스크립터 테이블을 생성하여 번호를 할당한다.

자주사용되는 파일들에게 기본적으로 번호를 미리 할당해 두어 조금 더 빠른 처리를 수행한다.




 - 커널은 프로세스를 처리하기 위해 사용되는 장치나 다른 프로세스에 정보를 파일 디스크립터 테이블이라는 곳에 저장을 한다.


 - 파일 디스크립터 테이블에는 숫자 0번부터 순차적으로 할당되며, 

   가장 기본적으로 사용되는 파일 디스크립터에 대해서는 미리 지정되어 예약되어있다.



예약되어있는 File Descriptor Table

 용도        File Descriptor

표준 입력              0

표준 출력              1

표준 에러              2

이 있다. 


먼저 표준 입력은 파일 또는 프로세스에게 입력을 할 때 사용되는 번호로 알고 있으면 된다.

즉, 프로세스에 입력을 할 때는 파일디스크립터 0번을 사용하고 출력을 할때는 1번을 사용한다 와 같이 알고있으면 된다.


보통 표준 입력을 키보드, 표준 출력 및 에러를 모니터 에 비유해서 설명이 되는 편이다.






리다이렉션 (Redirection)

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



명령어 입력(키보드 / 표준입력 : 파일디스크립터 0번 사용) -> 명령어의 결과(모니터 / 출력 : 파일디스크립터 1번 사용)






출력 리다이렉션 : 화면에 출력되는 결과를 파일의 내용으로 집어넣는 방법

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



# 먼저 echo로 문장을 하나 출력해보고 뒷쪽에 1> 을 붙혀 리다이렉션을 살펴보자.

위의 명령어를 입력하면 파일이 하나 생성이 된다.


어떤 파일인지 cat으로 확인해보면 echo로 입력했던 문장이 나타난다.



# 한번 더 확인해보고자 다시 진행해 보았다. 이번에도 역시 결과 입력시 아무런 출력 없이

파일이 생성 된 것을 확인 할 수 있다.



우리가 쉘을 통해 명령어를 입력하면 그 명령어의 결과를 쉘을 통해 다시 보여준다.

예를들어 ls를 입력하면 해당 디렉토리 내의 파일 리스트를 출력하는 것과 같다.

이를 도식화 하면

shell -> command -> shell                이와같이 처리되어 출력 결과를 shell로 나타내준 것이

  1> redirection-2     이렇게 redirection-2라는 파일로 방향을 바꿔줬다 고 생각하면 된다.

즉, shell로 화면에 명령어의 결과가 출력되어야 할 것이 해당 파일 안으로 들어갔다는 것이다.



중요한것은 이 파일 리다이렉션이 파일을 덮어쓴다는 개념이다.


# 이와같이 기존의 data의 정보가 덮어씌워져 cal로 대체되었다.



참고로 Bash 덮어쓰기 방지기능

 : #> set -o noclobber


# 위 설정을 입력해주면 덮어쓰기가 방지된다.


다시 이 기능을 disable 시킬때는 #> set +o noclobber 해주면 된다.


지금까지 1> 을 통해 리다이렉션을 진행했는데, 이때 1은 생략이 가능하다.






추가 리다이렉션

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


# 이렇게 내용들이 누적된 것을 알 수 있다. 즉, 출력 결과를 파일 안에 누적시킬 수 있다.






오류 리다이렉션

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


# 이렇게 없는 파일에 대해 리다이렉션을 해 봤을때, 파일은 만들어 졌으나 오류메세지가 안에 들어있진 않다.


이걸 오류 리다이렉션을 통해 동일하게 진행해보면


# 우선 없는 파일에 대해 리다이렉션을 시도하였는데 오류메세지가 등장하지 않았다.

그리고 해당 파일을 읽어보았더니 파일 안에 내용으로 오류메세지가 들어있다.


표준 출력은 1번으로, 표준 에러는 2번으로 리다이렉션이 진행된다.

마찬가지로 표준 에러(2번)를 통해서 에러가 나지 않는 명령어를 진행해도, 파일 내부에는 아무 내용이 안써지게 된다.

오류 리다이렉션은 주로 여러 오류들을 한번에 확인하고 싶을 때 사용된다.





*_참고)

/dev/null : 리눅스에 디폴트 파일중 하나인데 항상 0이라는 값을 가지고있다. 

그러므로 이 파일로 리다이렉션된 내용은 저장되지 않는다.


# 이렇게 최초에도 아무런 값을 가지고 있지 않을 뿐더러, 정상적인 값을 입력하여도 안에 내용이 기록되지 않는다.






입력 리다이렉션

#> [명령어] < 파일


# 우리가 항상 사용하는 명령어 입력 방식이 원래는 < 이 들어가는데 생략되었다고 보면 된다.

따라서 자주 사용되지 않는다. 우리는 항상 명령어 입력시 입력 리다이렉션을 사용하고 있는것이다.






파이프(Pipe) : | <- 파이프 기호 (Shift + \)

앞 명령어(프로세스)의 결과를 뒤에나오는 명령어(프로세스)의 입력으로 처리하기 위해 사용하는 방법


# 위와같이 앞 명령어 cat의 결과를 뒤의 명령어 head대로 출력이 되는것을 볼 수 있다.



# 마찬가지로 cat의 출력결과를 뒤의 grep의 내용대로 쳐리한 결과만 출력되고있다.

앞 명령어의 결과를 pipe를 통해 뒤의 명령어로 전달한다고 이해하면 된다.






리다이렉션과 파이프를 사용하면 우리가 지금껏 배운 다양한 명령어들을 더 다양하게 사용할 수 있게 된다.


# 파일을 두개생성하고 ll(ls -l)을 사용하여 확인한 결과이다.

ll을 사용해서 확인했을때, 맨 앞이 -인 것은 파일, d는 디렉토리, l은 링크이다.






# 파이프를 사용하여 명령어들을 조합해 원하는 결과를 얻어낼 수 있다.



# ll의 결과 중, 행의 시작이 d로 시작하는 내용만 출력한 것이다. 즉, 디렉토리만



# wc는 word count를 의미한다. wc -l로 파일 내부의 행의 개수를 출력해줬다.


즉 이게 디렉토리 개수가 된다는 것이다.



# 이렇게 되면 bin이라는 폴더의 일반파일의 개수를 확인할 수 있게 된다.

'SYSTEM > LINUX' 카테고리의 다른 글

9) VI  (0) 2018.02.22
8) Link  (0) 2018.02.21
7) Grep&Regular-Expression  (0) 2018.02.17
6) Basic Command2  (0) 2018.02.15
5) Basic Command1  (0) 2018.02.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함