Linux 파이프 원리를 알아보자

파이프 원리 이해하기

@@ curl 은 두개의 디스크립터가 나온다, 실제 URL요청후 받는 HTML과 속도 리포트를 하는 OUTPUT이다.
그러나 HTML과 OUTPUT의 디스크립터 번호가 다르다. HTML은 표준출력으로 1번 디스크립터로 쓰여지고
OUTPUT은 2번 디스크립터로 기록하게 된다. 따라서 다음과 같이 하게 되면 파이프를 2번 디스크립터로
받게 되어 정상 출력을 하게된다.

1. 먼저 1번 표준 출력을 2번 디스크립터로 던진다.
2. 2번 OUTPUT은 NULL로 던져 화면에 출력되지 않게 한다.

curl http://localhost >&2 2>/dev/null | echo

 

아래처럼 &-로 닫을 수도 있다.

curl http://localhost >&2 2>&- | echo

 

# 파이프로 표준에러만 재지향 하기.

exec 3>&1 # 표준출력의 현재 "값"을 저장.
ls -l 2>&1 >&3 3>&- | grep bad 3>&- # 'ls'와 'grep'을 위해 3번 파일 디스크립터를 닫고,
exec 3>&- # 이제, 스크립트 나머지 부분을 위해 닫습니다.


user1@webterror:~/Downloads$ curl http://localhost >&3 2>/dev/null | echo
bash: 3: Bad file descriptor

 

@ 아래의 경우는 3번 디스크립터를 연상태로 진행했다.

user1@webterror:~/Downloads$ exec 3>&1 && curl http://localhost >&3 2>/dev/null | echo

<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
user1@webterror:~/Downloads$ exec 3>&1 && curl http://localhost >&3 2>/dev/null | echo

exec 2>/dev/null // 화면에 아무것도 안나옴
exec 2>&1 // 화면에 출력되기 시작함
@@ 여기까지 알수 있는 것은 화면에 출력되고 있는 디스크립터 대상은 2번이다.

@@ exec는 실행시킬 프로세스를 fork 시키지 않고 현재 shell에서 실행 시킨다.

user1@webterror:~$ exec 3<&1
user1@webterror:~$ curl http://localhost 1>&3 2>/dev/null
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
user1@webterror:~$ exec 3>&-
user1@webterror:~$ curl http://localhost 1>&3 2>/dev/null
bash: 3: Bad file descriptor

 

관련 글

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다