Redirection

리눅스/일반 2012.10.18 16:15

출저 : http://radiocom.kunsan.ac.kr/lecture/unix_cmd/redirection.html


재지정(redirection)이란?

표준입력, 표준출력, 표준 에러 출력을 다시 지정함

유닉스에서 모든 프로그램이 실행 될 때 최소 3 개의 파일을 입출력 용도로 지정해서 쓰고 있으며 각각에 대해 숫자를 하나씩 할당하여 관리하고 있다.
실행 파일의 입출력 용도로 쓰이는 파일에 할당한 숫자를 파일 디스크립터(fd: file descriptor)라 하며 숫자로 할당해서 사용하고 있다.

fd디스크립터 이름용도표준 장치
0stdin(standard input)명령어에 입력될 내용이 저장되어 있는 파일키보드
1stdout(standard output)명령어에서 출력될 내용이 담길 파일화면
2stderr(standard error)명령어에서 출력될 에러 메시지가 담길 파일화면, /dev/null

이렇게 명령어에 입출력으로 사용되는 장치를 표준장치가 아닌 파일로 재지정하는 것을 입출력 재지정이라 한다.
입출력 재지정에는 <기호와 >기호가 사용된다. 
<기호는 입력 재지정에 쓰이고, >기호는 출력 재지정에 사용된다.

형식의미
명령 < 파일이름명령어 내부에서 지정한 파일에서 데이터를 읽는 것이 아니라 "파일이름"의 파일에서 데이터를 읽어 들임
명령 > 파일이름명령어 내부에서 지정한 파일로 데이터를 기록하는 것이 아니라 "파일이름"의 파일에 데이터를 기록함

입출력 재지정을 나타내는 기호(>, <, >>) 앞에 적은 파일 디스크립터(0,1)를 생략할 수 있다. 따라서 입력 재지정에서 < 기호 다음에 파일이름을 적으면 키보드 대신 지정한 파일에서 데이터를 읽어 들이고, 출력 재지정에 > 기호 다음에 파일이름을 적으면 화면에 출력하는 대신 지정한 파일에 그 출력 결과를 기록한다.

• 입력 재지정에서 '0'이 생략되었다고 간주하고,

• 출력 재지정에서 '1'이 생략되었다고 간주한다.

따라서 입력 재지정에 <기호 다음에 파일이름을 적으면 키보드 대신 지정한 파일에서 데이터를 읽어 들이고, 출력 재지정에 >기호 다음에 파일이름을 적으면 화면에 출력지 않고 지정한 파일에 출력을 기록한다.

UNIX 쉘에서는 표준 입력인 stdin을 키보드로, 표준출력인 stdout을 모니터로, 그리고 표준 에러 출력인 stderr을 /dev/null로 설정되어 있음을 알 수 있다.
이 처럼 표준으로 지정된 입출력을 임의로 다시 지정하여 자신이 원하는 파일에 저장하거나, 또는 자신이 지정한 파일로 부터 읽어 들이도록 다시 지정하는 것을 redirection(재지정)이라 한다.

이렇게 입•출력 방향을 조정함으로써, 어떤 명령의 출력이 다른 명령의 입력으로, 또는 지정된 파일로 보낼 수 있다. 또한 입력의 경우도 키보드에서만 이루어지는 것은 아니고 다른 명령의 출력으로부터, 또는 파일로부터 입력될 수 있게 할 수 있어 재지정은 유닉스 쉘의 유용한 기능이라 할 수 있다.

기본적으로 stdin, stdout, stderr를 위해 오픈 되는 파일은 /dev/tty, 즉 자신의 터미널의 이름이다.
기본이 터미널이므로 사용자들은 프로그램에게 어디에서 읽고 어디에 쓰라고 지정할 필요가 없다.

모든 쉘들은 stdin, stdout, stderr에 대한 기본적인 리다이렉션을 제공한다. 다만 Bourne 쉘은 추가로 파일 디스크립터 번호를3에서 9까지 다룰 수 있다.

입력 재지정

입력 재지정의 형식은 다음과 같다.


명령 < 파일이름
명령 0< 파일이름

두 방법 모두 동일한 의미를 가지므로 첫 번째 방법을 권한다. 이는 두 번째 형식에 나오는 0이라는 숫자가 표준 입력을 의미하는 file descriptor이다.

입력 재지정에서 < 기호 앞의 숫자를 생략하면 0을 생략한 것으로 간주하기 때문에 0을 생략한 첫 방법을 널리 사용한다.

출력 재지정

출력 재지정의 형식은 다음과 같다.


명령 > 파일이름
명령 1> 파일이름
기존 파일이 없을 경우

명령 >> 파일이름
명령 1>> 파일이름
기존 파일이 있으면 추가하고,
없으면 새로 만들어 기록함

두 방법 모두 동일한 의미를 가지므로 첫 번째 방법을 권한다. 이는 두 번째 형식에 나오는 1이라는 숫자가 표준 출력을 의미하는 file descriptor이다.

출력 재지정에서 > 기호 앞의 숫자를 생략하면 1을 생략한 것으로 간주하기 때문에 1을 생략한 첫 방법을 널리 사용한다.

에러 재지정

에러 재지정의 형식은 다음과 같다.


명령 2> 파일이름
명령 2>> 파일이름

에러 재지정에서 file descriptor인 2를 생략하면 않된다.
2>은 새로 파일을 만들어 에러 메시지를 저장하고, 2>>은 파일이 존재하면 에러 내용을 그 파일에 추가 하고 파일이 존재하지 않으면 파일을 새로 만들어 오류 내용을 저장하라는 의미로 쓰인다.

출력과 에러 메시지를 동일 파일에 저장하는 경우

유닉스에서 출력과 에러 메시지를 동일 파일에 저장하여 사용하는 경우가 더 편리할 수 있으므로 다음과 같은 형식으로 사용한다.

다음 표에서 방법1과 방법2는 같다.

방법1방법2
명령 > 파일이름 2> 파일이름명령 1> 파일이름 2> 파일이름
명령 2> 파일이름 > 파일이름명령 2> 파일이름 1> 파일이름
명령 > 파일이름 2>&1명령 1> 파일이름 2>&1
명령 2> 파일이름 >&2명령 2> 파일이름 1>&2
명령 >> 파일이름 2>> 파일이름명령 1>> 파일이름 2>> 파일이름
명령 2>> 파일이름 >> 파일이름명령 2>> 파일이름 1>> 파일이름
명령 >> 파일이름 2>>&1 파일이름명령 1>> 파일이름 2>>&1 파일이름
명령 2>> 파일이름 >>&2 파일이름명령 2>> 파일이름 1>>&2 파일이름

>& 기호 앞과 뒤에 파일 디스크립터인 숫자를 붙여서 명시하여야 하는데, 앞의 파일 디스크립터가 1일 경우에는 생략해도 무방하다.
그러나 뒤의 파일 디스크립터 숫자가 1이면 반드시 명시해야 한다.

>& 기호는 뒤의 파일디스크립터가 저장하는 파일은 앞의 파일 디스크립터에서 명시한 파일을 사용한다는 의미를 가진다.
따라서 명령어 바로 앞의 > 기호 뒤의 파일에 출력 결과가 저장되는 효과가 있다.


【예제】 
% cat > temp     ☜ temp 파일은 존재하지 않음
이 글은 redirection을 이해하는 내용입니다.
temp 파일에 기록되며, 나중에 다시 사용할 것입니다.
Ctrl+d % cat temp
이 글은 redirection을 이해하는 내용입니다.
temp 파일에 기록되며, 나중에 다시 사용할 것입니다. % cat >> temp ☜ temp 파일이 이미 존재함
이 글은 두 번째 cat >> temp을 실행하여 temp 파일에 내용을 추가한다.
cat에서 끝낼 때는 ctrl+d를 누르면 종료됩니다.
Ctrl+d % cat temp
이 글은 redirection을 이해하는 내용입니다.
temp 파일에 기록되며, 나중에 다시 사용할 것입니다.
이 글은 두 번째 cat >> temp을 실행하여 temp 파일에 내용을 추가한다.
cat에서 끝낼 때는 ctrl+d를 누르면 종료됩니다. % mailx jijoe@it.kunsan.ac.kr < temp ☜ 파일 temp에서 읽어와 mailx를 실행함 % mailx % mailx jijoe@it.kunsan.ac.kr < temp % mailx
mailx version 5.0 Mon Nov 4 02:27:11 PST 2002 도움말을 보려면 ?를 입력하십시오.
"/var/mail//jijoe": 1개 메시지 1개 신규
>N 1 junik joe Fri May 25 11:38 19/827 ? 1
Message 1:
From jijoe@it.kunsan.ac.kr Fri May 25 11:38:23 2007
Date: Fri, 25 May 2007 11:38:22 +0900 (KST)
From: junik joe
To: jijoe@it.kunsan.ac.kr
이 글은 redirection을 이해하는 내용입니다.
temp 파일에 기록되며, 나중에 다시 사용할 것입니다.
이 글은 두 번째 cat >> temp을 실행하여 temp 파일에 내용을 추가한다.
cat에서 끝낼 때는 ctrl+d를 누르면 종료됩니다. ? d ? q %

'리눅스 > 일반' 카테고리의 다른 글

Bash 내부 명령어  (0) 2012.10.18
Bash 외부 명령어  (0) 2012.10.18
Redirection  (0) 2012.10.18
cpu 갯수 확인하기  (0) 2012.10.16
screen 명령어  (0) 2012.10.16
리눅스에서 이전 폴더로 이동하기  (0) 2012.03.30
Posted by 라판