표준 입력(stdin) / 표준 출력(stdout) / 표준 오류(stderr)

2017.08.28 07:00




표준 입력 / 표준 출력 / 표준 오류



ls와 같은 명령어는 프로그램을 실행하고 그 결과를 표준 출력(stdout)으로 보낸다. 

그리고 프로그램 실행중 오류가 발생하면 오류 내용을 표준 오류(stderr)로 보낸다. 


표준 출력과 표준 오류 모두 모니터 화면으로 지정되어 있기 때문에 모니터에 해당 내용을 보여주고 그 내용을 디스크에 파일로 따로 저장하지는 않는다. 


또 많은 프로그램이 표준 입력(stdin)으로부터 입력 받은 내용을 가져오는데 기본적으로 키보드가 지정되어 있다. 




입출력 방향 재지정(I/O 리다이렉션) 



> 리다이렉션 연산자를 이용해서 입력과 출력 방향을 표준 입력이나 표준 출력이 아닌 다른 것으로 재지정할 수 있다.


명령어 뒤에 > 리다이렉션 연산자를 이용하고 출력 방향을 지정하면 된다. 


ls -l /usr/bin > list_bin.txt


이라고 입력하면 표준 출력인 모니터 화면에는 아무 것도 보이지 않지만, 출력 방향으로 재지정된 list_bin.txt 파일에 해당 명령어의 결과가 저장된다. 

1
2
3
4
5
6
7
8
9
10
11
12
[root@OEL73:/]$ ls -/usr/bin > list_bin.txt
 
[root@OEL73:/]$ cat list_bin.txt
합계 164888
-rwxr-xr-x.   1 root root      15059  5월  1  2014 GET
-rwxr-xr-x.   1 root root      15059  5월  1  2014 HEAD
lrwxrwxrwx.   1 root root         15  7월  9 20:53 Mail -> ../../bin/mailx
-rwxr-xr-x.   1 root root      15059  5월  1  2014 POST
lrwxrwxrwx.   1 root root          4  7월  9 20:55 X -> Xorg
-rwsr-xr-x.   1 root root    2409576  9월  6  2016 Xorg
...
...
cs




cat 명령어로 간단한 텍스트 파일 만들기


cat 명령어는 텍스트 파일의 내용을 보여주는 명령어이다. 

(less는 페이지 단위로 보여주고 cat은 파일 내용 전체를 보여준다)



원래 cat 명령어에 인자를 주지 않으면 표준 입력(키보드)을 표준 출력(화면)으로 보낸다. 

그렇기 때문에 출력방향을 파일로 지정하면 표준 입력(키보드)을 파일로 저장할 수 있다. 

(이렇게 파일을 만들 경우 표준 입력에 파일의 끝을 알리는 EOF(End Of file) 를 의미하는 Ctrl + D를 입력해야 한다)


1
2
3
4
5
6
7
[root@OEL73:~]$ cat > cat_test.txt
cat 명령어를 이용한 간단한 문장 만들기 
단, 맨 마지막은 꼭 Ctrl + D를 입력해야 한다.
 
[root@OEL73:~]$ cat cat_test.txt
cat 명령어를 이용한 간단한 문장 만들기 
단, 맨 마지막은 꼭 Ctrl + D를 입력해야 한다.
cs




> 리다이렉션 연산자로 파일 내용 비우기



> 리다이렉션 연산자를 이용해서 파일 내용을 지울 수 있다. 


> 리다이렉션 연산자는 파일 맨 앞부분부터 작성하기 시작하기 때문에 기존 내용이 있는 파일을 출력 방향으로 지정하면 처음부터 다시 작성한다. 


 아무 내용없이 > 파일명 결과는 파일 내용을 클리어한다. (주로 로그 파일 크기 줄일 때)



1
2
3
4
5
6
7
[root@OEL73:/]$ ls -alrt list_bin.txt
-rw-r--r--1 root root 111200  8월 27 11:02 list_bin.txt
 
[root@OEL73:/]$  > list_bin.txt
 
[root@OEL73:/]$ ls -alrt list_bin.txt
-rw-r--r--1 root root 0  8월 27 13:14 list_bin.txt
cs






>> 연산자로 파일 내용 덧붙이기


- 기존 내용을 유지하고 그 뒤에 출력을 덧붙이고 싶으면 리다이렉션 연산자 2개를 덧붙여서(>>)사용한다. 



1
2
3
4
5
6
7
8
9
10
11
12
[root@OEL73:~]$ cat >> cat_test.txt
>>를 이용하면 기존 파일 내용 뒤에 내용을 추가할 수 있다. 
 
앞 부분은 지워지지 않는다. 
 
[root@OEL73:~]$ 
[root@OEL73:~]$ cat cat_test.txt
cat 명령어를 이용한 간단한 문장 만들기 
단, 맨 마지막은 꼭 Ctrl + D를 입력해야 한다.
>>를 이용하면 기존 파일 내용 뒤에 내용을 추가할 수 있다. 
 
앞 부분은 지워지지 않는다. 
cs


 


표준 출력과 표준 오류를 한 파일로 지정


모든 것은 파일(file)이라는 유닉스 혹은 리눅스에서 표준 입력, 표준 출력, 표준 에러에 파일 디스크립터로 가장 작은 정수값을 할당한다. 


표준 입력 = 0

표준 출력 = 1

표준 에러 = 2


표준 출력과 표준 오류를 한 파일에 저장되도록 하려면 다음처럼 입력한다. 


# 명령어 > 표준 출력 리다이렉션 2>&1

# ls -l /usr/bin /usr/bbin > list_bin.txt 2>&1


여기서 중요한 점은 표준 출력의 방향을 먼저 지정하고( > list_bin.txt)

표준 에러(2)를 새롭게 바뀐 표준출력 리다이렉션(&1, 즉 list_bin.txt)으로 리다이렉션해야 한다. 


이렇게 하면 파일에 표준 출력의 내용과 표준 에러의 내용이 함께 저장된다. 



1
2
3
4
5
6
7
8
9
10
11
[root@OEL73:~]$ ls -/usr/bin /usr/bbin > list_bin.txt 2>&1
 
[root@OEL73:~]$ head -10 list_bin.txt
ls: cannot access /usr/bbin: 그런 파일이나 디렉터리가 없습니다
/usr/bin:
합계 164888
-rwxr-xr-x.   1 root root      15059  5월  1  2014 GET
-rwxr-xr-x.   1 root root      15059  5월  1  2014 HEAD
lrwxrwxrwx.   1 root root         15  7월  9 20:53 Mail -> ../../bin/mailx
-rwxr-xr-x.   1 root root      15059  5월  1  2014 POST
lrwxrwxrwx.   1 root root          4  7월  9 20:55 X -> Xorg
cs


- 파일의 맨 앞 부분에 에러 메시지를 저장하고 있다. 



- 맨 뒤 2>&1은 띄어쓰면 syntax 에러가 나더라. 사용에 주의.


1
2
3
4
5
6
7
8
9
[root@OEL73:~]$ ls -/usr/sbin /usr/bbnin > cat_test.txt 2 > &1
-bash: syntax error near unexpected token `&
 
[root@OEL73:~]$ ls -/usr/sbin /usr/bbnin > cat_test.txt 2> &1
-bash: syntax error near unexpected token `&
 
[root@OEL73:~]$ ls -/usr/sbin /usr/bbnin > cat_test.txt 2 >& 1
ls: cannot access /usr/bbnin: 그런 파일이나 디렉터리가 없습니다
ls: cannot access 2: 그런 파일이나 디렉터리가 없습니다
cs





/dev/null


/dev/null비트 버킷(bit bucket)이라고도 불리는 특수한 파일이다. 


이 비트 버킷으로 출력방향을 지정하면 입력만 받을 뿐 아무런 메시지도 출력하거나 저장하지 않는다. 


cron에 작업을 걸고 명령의 결과가 표준 출력으로 출력되거나 표준 에러로 출력되지 않도록 하려면 표준 출력과 표준 에러의 방향을 /dev/null로 지정하면 된다


$ 스크립트명령.sh > dev/null 2>&1

또루아빠 Linux, Unix , , , , , , , , ,