Cheat Linux : Output redirection
리눅스 표준 스트림
리눅스 OS 는 터미널의 키보드 입력을 처리할 때 세 가지 표준 스트림으로 보낸다.
[wikipedia]
그림 같이 세 가지 스트림에 번호를 할당해 제공힌다.
- 입력 스트림 Standard Input: 표준 입력으로 0
- 출력 스트림 Standard Output: 표준 출력으로 1
- 에러 스트림 Standard Error: 표준 에러로 2
이것은 시스템 라이브러리
- 표준 C 라이브러리 <stdio.h> 에 stdin, stdout, stderr 로 정의
- 통합 라이브러리 <unistd.h> 에 의해 파일 디스크립터 0, 1, 2 로 표현
위키피디아 표준 스트림
표준 입력출 Redirection
표준 입출력 재지정을 할 수 있는 연산자 >,>>, < 를 사용해서 입출력의 방향을 변경할 수 있다. 시스템 로그를 저장하는 명령에서 다음 같은 경우를 많이 보게 되는데 이런 표준 스트림과 리디렉션 연산자를 사용하는 것이다.
1 | $ ls -lR /var/log &> out.txt |
Redirection 연산자와 스트림의 출력
| 연산자 | 쓰임새 | 설명 |
|---|---|---|
> |
command > OUTPUT |
왼쪽 명령의 결과를 오른쪽 출력 스트림으로 변경한다. |
>> |
command >> OUTPUT |
왼쪽 명령의 결과를 오른쪽 출력 스트림에 추가한다. |
& |
command > result > 2&1 |
스트림의 방향으로 여러 스트림을 설정 |
표준출력 스트림
1 | $ echo "hello" > log.txt |
에러출력 스트림
표준 출력 스트림과 연산자를 사용할 수 있다.
| 명령 재지정 | 사용 |
|---|---|
command 2> OUTPUT |
명령 결과에서 에러를 오른쪽 출력 스트림으로 변경한다. |
1 | $ catty log.txt |
에러출력 방향 재지정
명령 실행시 에러가 발생하면 에러 출력이 화면에 나타나는데, 이것을 없애고 싶으면 이럴 때 표준 에러(stderr) 을 화면으로 출력하지 말고 null device 로 출력하도록 redirection 해주면 됩니다.
1 | $ find ./ -name \*.java -exec -print |
에러 출력을 nul 디바이스로 방향을 전환하면 화면 출력에는 변화가 없다.
1 | find ./ -name \*.java -exec -print 2> /dev/nul |
출력과 에러출력 방향 동시에 재지정
& 연산자로 출력를 다른 스트림으로 교체하게 한다.
예를 들어 아래 find 명령 결과에 에러가 포함되어 있다.
1 | $ find /var/ -name "*.log" -print |
그래서 출력은 result 파일로 에러는 error 파일로 출력하도록 방향 재지정을 할 수 있다.
1 | $ find /var/ -name "*.log" -print > result 2> error |
이것은 & 연산자를 사용하면 깔끔하게 처리할 수 있다. 결과는 result 파일에 담기고 에러만 화면에 출력하는 것이다.
1 | find /var/ -name "*.log" -print 2>&1 > result |
myscript.sh를 실행시 출력은 stdout.txt라는 파일에 쓰고 오류는 stderr.txt라는 파일에 쓰고 싶다면 아래와 같이 사용하면 됩니다.
1 | $ ./myscript.sh > stdout.txt 2> stderr.txt |