@@ 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