Cheat Linux : Output redirection

리눅스 표준 스트림

리눅스 OS 는 터미널의 키보드 입력을 처리할 때 세 가지 표준 스트림으로 보낸다.

[wikipedia]

그림 같이 세 가지 스트림에 번호를 할당해 제공힌다.

  1. 입력 스트림 Standard Input: 표준 입력으로 0
  2. 출력 스트림 Standard Output: 표준 출력으로 1
  3. 에러 스트림 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
2
3
4
5
$ echo "hello" > log.txt
$ echo "your welcom" >> log.txt
$ cat log.txt
hello
your welcom

에러출력 스트림

표준 출력 스트림과 연산자를 사용할 수 있다.

명령 재지정 사용
command 2> OUTPUT 명령 결과에서 에러를 오른쪽 출력 스트림으로 변경한다.
1
2
3
4
5
6
$ catty log.txt
Command 'catty' not found, but can be installed with:
sudo apt install node-catty

$ catty log.txt 2> error
$ cat error

에러출력 방향 재지정

명령 실행시 에러가 발생하면 에러 출력이 화면에 나타나는데, 이것을 없애고 싶으면 이럴 때 표준 에러(stderr) 을 화면으로 출력하지 말고 null device 로 출력하도록 redirection 해주면 됩니다.

1
2
$ find ./ -name \*.java -exec -print
find: missing argument to `-exec'

에러 출력을 nul 디바이스로 방향을 전환하면 화면 출력에는 변화가 없다.

1
find ./ -name \*.java -exec -print 2> /dev/nul

출력과 에러출력 방향 동시에 재지정

& 연산자로 출력를 다른 스트림으로 교체하게 한다.

예를 들어 아래 find 명령 결과에 에러가 포함되어 있다.

1
2
3
$ find /var/ -name "*.log" -print
find: ‘/var/spool/cron/atjobs’: Permission denied
find: ‘/var/spool/cron/crontabs’: Permission denied

그래서 출력은 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
2
$ ./myscript.sh > stdout.txt 2> stderr.txt
(=$ ./myscript.sh 1> stdout.txt 2> stderr.txt)

참고

  1. Linux 표준입출력 재지정
  2. 위키피디아 표준 스트림
  3. 표준입출력 장치 tty, pty 그림