리다이렉션(redirection)
- 리다이렉션은 컴퓨팅에서 표준 스트림을 사용자 지정 위치로 우회할 수 있는 다양한 유닉스 셸을 포함한 대부분의 명령어 인터프리터에 일반적인 명령.
- 표준 스트림에 대한 방향을 지정한다고 보면 이해하는데 도움이 될 것
null 장치(디바이스)
- null 장치(디바이스)는 기록 대상이 되는 모든 데이터를 버리지만 쓰기 작업은 성공했다고 보고하는 장치 파일
- 이 장치는 유닉스 계열에서는 /dev/null이라고 부르며 어떠한 프로세스에도 데이터를 제공하지 않고 그 즉시 EOF를 내보냄
- 일반적으로 출력이 필요 없는 경우에 리다이렉션을 이용하여 출력을 null 장치로 보내는 방법으로 자주 이용
표준 스트림
- 유닉스 계열의 표준 스트림은 3가지로 분류할 수 있으며 다음과 같다.
- 표준 입력 : stdin, 파일 디스크립터 0
- 표준 출력 : stdout, 파일 디스크립터 1
- 표준 오류 : stderr, 파일 디스크립터 2
표준 입력 리다이렉션
명령어 < 파일
- 표준 입력 스트림에 대한 리다이렉션은 위와 같은 방법으로 사용
cat test.txt
로 입력을 하여도 같은 결과가 나오겠지만 이는 cat에 대한 아규먼트로 동작하는 방식- 위의 예제처럼 동작하는 것은 표준 입력을 cat 명령어로 리다이렉트 하여 전달한 방식
표준 출력 리다이렉션
명령어 > 파일
- 표준 출력 스트림에 대한 리다이렉션은 표준 출력과 반대 방향을 가리키면서 사용
cat test.txt
명령에 대한 표준 출력을 ‘test_copy.txt’ 파일로 리다이렉션- test_copy.txt 파일이 있으면 파일 내용을 지우고 새로 내용을 추가
- 파일이 없으면 새로 파일을 만들어서 내용을 추가
명령어 >> 파일
- 표준 출력 스트림에 대한 리다이렉션 과정에서 파일에 내용을 지우고 새로 내용을 추가하지 않고 기존 내용 뒤에 표준 출력 내용을 추가할 경우에는 ‘>’대신에 ‘»‘를 사용
2 >&1 & 의 의미
- ex)
nohup ${DIR}/bin/scheduler scheduler.ini >scheduler.out 2>&1 &
- 0, 1, 2는 각각 표준입력, 표준출력, 그리고 표준에러를 의미한다.
- 2는 표준 오류 출력에 대한 파일 디스크립터 번호이고, 1은 표준 출력에 대한 파일 디스크립터 번호이다.
- &는 파일 디스크립터를 가리키는 특수 기호이다.
- ”>”를 기준으로 보면 “2”를 “&1”로 보내라는 뜻인데, 2>&1의 의미는 표준 출력의 전달되는 곳으로 표준에러를 전달하라라는 의미이다.
- 만약 위와 같다면, 에러 메시지(stderr)는 scheduler.out 파일에 에러 메시지를 출력하지 않고 바고 콘솔에다가 뿌려준다.
- 이건 stderr이 버퍼를 이용하지 않고 에러가 생기는 즉시 바로 출력을 해주기 때문이다.
- 이렇게 2>&1 리다이렉션을 시켜 줌으로 인해 stderr > stdout 으로 출력이 되고 scheduler.out 파일에 에러 메시지가 저장이 되게 되는 것이다.
- 마지막 “&” 는 백그라운드로 실행하라는 뜻이다.
/dev/null 의 의미
명령어 > /dev/null
- cat 명령어를 사용하여 ‘test.txt’ 내용을 표준 출력으로 터미널상에 표시하였다.
- 그 다음으로, >/dev/null 은 출력을 /dev/null로 하겠다는 뜻이다. /dev/null로 리다이렉션 하는 건 표준출력을 버리라는 뜻이다. 즉, 출력이 안보인다.
- 스크립트 등에서 표준 출력을 표시하고 싶지 않을 경우에 유용하게 사용할 수 있다.
명령어 2> /dev/null
- 표준 출력을 버리는 방법과 마찬가지로 표준 오류 또한 null 장치와 리다이렉션을 이용하여 표시하지 않을 수 있다. 차이점은 리다이렉션에서 표준 출력이 아닌 표준 오류를 null 장치로 보내주도록 지정하는 것이다.
- ‘no_test.txt’라는 존재하지 않은 파일에 대해서 cat 명령를 수행하였고 파일이 없으므로 “No such file or directory”라는 에러 메시지를 출력하였다.
- “cat no_test.txt 2> /dev/null” 입력을 하게 되면 아무런 오류 메시지도 출력이 되지 않게 된다. 표준 오류를 null 장치로 리다이렉션 하였기 때문에 아무런 메시지도 표시되지 않게 된 것이다.
명령어 &> /dev/null
- &> /dev/null은 명령의 모든 출력을 버리고, 터미널에 아무것도 표시하지 않는 것을 의미한다.