Redirection 이란, 표준 입출력에서 입력 혹은 출력을 다른 것으로 대체하는데 쓰입니다.
그래서 가장 일반적으로 많이 알고 있는 것은,
cat file1 > file2
와 같은 명령문인데,
위 명령은, cat file1 의 출력위치를
stdout 에서
file2 로 대체한 것입니다.
그러므로 file1 의 내용이 file2 에 저장됩니다.
사실상 redirection의 정확한 의미는,
프로그램이 실행되기 전에 '파일디스크립터'를 변경한다는 것입니다.
man page 에는 다음과 같은 예제가 나옵니다.
ls > dirlist 2>&1
ls 2>&1 > dirlist
위의 명령문을 이해하기 위해서는 우선 파일 디스크립터 라는 개념을 이해해야 합니다.
파일 디스크립터에서,
0 : stdin
1 : stdout
2 : stderr
로 지정되어 있고, 3~9번까지는 별도의 디스크립터가 있습니다.
이 각각의 0~9번호가 파일을 핸들하는 일종의 변수(variable)라고 생각하면 됩니다.
그럼 stdin, stdout, stderr 가 일종의 파일로서 0~2 번의 디스크립터에 저장되어 있다고 보면 됩니다.
이점을 숙지한 후 다시 위의 예제로 돌아가 봅시다.
redirection 는 기본적으로 다음과 같은 form 을 갖습니다.
[n] < word (default n = 0)
[n] > word (default n = 1)
윗줄의 명령문은 출력 redirection 으로 n 이 생략된 경우 n=0 입니다.
아랫줄의 명령문은 입력 redirection 으로 n이 생략된 경우 n=1 입니다.
ls > dirlist 에서 ">dirlist"의 의미는 n이 생략된 것으로 "1>dirlist" 의미와 같습니다.
즉, 출력파일 디스크립터를 dirlist 로 대체하겠다는 의미입니다.
여기서, ls > dirlist 를 하게 되면 출력결과를 dirlist로 보낸다라고 설명하는것은 그다지 정확한 것은 아닙니다.
1번파일 디스크립터를 dirlist 로 바꾼 후에 ls 를 실행한다고 설명하는게 좀 더 정확합니다.
실행되면 ls 는 1번 파일 디스크립터로 값을 보낼꺼고, 1번은 stdout에서 dirlist 로 바뀌어 있으므로
dirlist 에 ls 의 결과값이 저장되어 있는 것입니다.
그리고 2>&1 의 의미는, 2번 파일 디스크립터를 &1이 나타내는 것으로 &1 은 앞에서 dirlist 로 바꾸어 놓았기 때문에
2번 디스크립터가 dirlist 로 대체되었다고 할 수 있습니다.
그래서 결론적으로 dirlist 는 1번, 2번 디스크립터를 통해 받는 stdout 과 stderr 에 해당하는 값들을 다 받게 됩니다.
참고 : http://www.postech.ac.kr/plus