쉘 스크립트에서 >와 <는 리디렉션(redirection)을 의미한다. 표준 출력과 입력을 리디렉션할 때 사용한다.



test.sh > /dev/null


cp file-name > /dev/null


>1은 커맨드의 표준 출력을 다음에 나오는 파일 디스크립터에 전달한다.


$ ls b* >1 m.log

$ cat m.log

...


>2는 쉘 스크립트의 표준 에러를 다음에 나오는 파일 디스크립터에 전달한다.


$ ls zzz*

ls: zzz*: No such file or directory

$ ls zzz* 2> m.log

$ cat m.log

ls: zzz*: No such file or directory




>&2는 모든 출력을 강제로 쉘 스크립트의 표준 에러로 출력한다. 


$ echo "ho" >&2

ho



자주 혼동되긴 하지만  형태로만 봤을 때 파일 디스크립터의 유무가 크다. 



하나의 커맨드에 동시에 표준 출력과 표준 입력을사용하려면 다음과 같다. >를 사용해서 먼저 결과를 로그 파일에 저장하고 2>>는 표준 에러의 결과를 log에 추가하라는 의미이다. 


$ ls -zzz* > log 2>> log

$ cat log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



이보다 더 좋은 축약형은 2>&1이다. 많이 봐서 알 수 있을 것이다.


$ ls -zzz* > log 2>&1

$ cat log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



순서를 바꾸면 어떤 일이 벌어질까? 제대로 동작되지 않는다. 

왼쪽에서 오른쪽으로 파싱을 하는데, 표준 에러가 표준 출력보다 먼저 나오기 때문에 표준 에러를 표준 출력으로 보내고 표준 출력은 log로 저장하려는 시도가 되지 않는다.  또한 ls -zzz* 1>&2 > log도 동작되지 않는다.


$ ls -zzz* 2>&1 > log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



여기서, tee를 이용하면 표준 출력와 표준 에러의 내용이 로그 파일도 나오게 하고 콘솔에도 나오게 하고 싶을 수 있다. 

$ ls -zzz* 2>&1 | tee log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



exec를 사용하면 쉘에서 모든 표준 입력과 출력을 모두 특정 파일로 보낼 수 있다.  >는 표준 출력, 2>는 표준 에러를 의미한다.


[~/temp] exec > ~/temp/log1

[~/temp] ls -al

[~/temp] sadf

-bash: sadf: command not found

[~/temp] ls -al ~/temp/log1



다른 터미널에서 확인해본다.


$ cat ~/temp/log1

...


Posted by 김용환 '김용환'

댓글을 달아 주세요

  1. Favicon of https://theworldstory.tistory.com BlogIcon thj86legend 2021.01.24 12:26 신고  댓글주소  수정/삭제  댓글쓰기

    김용환 개발자님, 친구합시다... 도움받고 씁니다.
    다양하게 많이 알고 계시네요...