
Redirection 이란?
stdout (표준출력, 1), sdtin(표준입력, 0), stderr(표준에러, 2)을 redirection하는 방법에 대한 문서
서버에서 백그라운드로 명령어 수행시
출력이나 error 메시지 등을
stdout이 아닌 file에 남길 때 유용.
- redirectiont operation에서 부등호 기호의 오른쪽에 stdin(0), stderr(2), stdout(1) 등이 놓일 경우 반드시 ampersand
&가 주어져야 함.1>,>&1
- 동시에 하나의 redirection operation이므로 중간에 공백문자가 들어가선 안 됨.
Linux에서 stdin, stdout, stderr 에 할당된 번호들(0,1,2가 각각 할당됨)은 기본으로 할당된 File Descriptor(FD)임.
Linux에서는 파일들에 integer 숫자를 할당하여 처리하며
모든 실행되는 프로그램에게는 FD 0,1,2 를 stdin, stdout, stderr에 할당되어 주어진다
(이후 해당 프로그램이 다른 파일을 open할 경우, 이외의 FD 즉 3이상의 FD가 할당됨. ).
Linux에서
Shell은 모든 processes에 stdin, stdout, stderr 을 기본으로 제공
1> 혹은 >
stdout(1)의 redirection을 수행.
stdout 스트림으로 지정된 프로세스의 출력 스트림을 다른 스트림으로 재지정할 때 사용됨.
ls * 1> m.log
cat m.log
- stdout에 출력될 내용이
m.log에 저장됨.
[Linux] 파일 내용확인하기: cat, bat, less, more, head, tail
cat, bat, head, tail대표적인 text processing utilities로 file viewing commands라고도 불림.less, morepager라고 불리는 utilities로 긴 출력을 화면에 페이지 단위로 나누어 보여주는 역할을 수행함.cat, batcat (concatenate
ds31x.tistory.com
2>
stderr (표준에러, 보통 stdout과 같이 모니터로 설정되어 있음)의 redirection을 수행.
ls error* # 없어서 No such file or directory 에러 발생.
ls error* 2> m.log
cat m.log
- stderr에 출력될 내용이
m.log에 저장됨. - 위의 예제를 zsh에선 동작시키려면 "error*"와 같이 double quote로 찾고자 하는 패턴 문자열을 감싸주어야 한다.
&>
stdout과 stderr를 동시에 redirect시킴
>&1
stdout으로 redirect! : 출력스트림을 stdout으로 보냄.
>&2
stderr로 redirect
>>
붙여넣기(append) 모드로 출력. (기본적으로 1>> 임)
>는 기존의 파일을 지우고 새로 쓰는데 반해,>>는 기존파일의 뒤에 내용을 추가함.
응용사례 1 : 하나의 파일에 저장하기.
특정 명령어의 모든 출력(stdout, stderr)를 하나의 파일에 저장하기.
ls error > log.txt 2> log.txt
- 위의 예제는
ls error명령어 수행의 결과를 모두log.txt파일에 저장함.
더 많이 쓰이는 것은 다음의 방법임.
ls error > log.txt 2>&1
위의 경우는 모두 overwrite가 되는 경우이며, append로 동작시키려면 다음을 사용함.
ls error >> log.txt 2>&1
응용사례 2 : 실행 결과와 error 메시지 각각의 파일에 저장하기.
ls error > log.txt 2> errlog.txt
위의 경우 log.txt와 errlog.txt에 나누어 저장됨.
다음은 error메시지는 append로 저장하고 실행결과는 overwrite로 저장하는 예임.
ls error > log.txt 2>> errlog.txt
tee 사용법: 동시에 stdout과 파일에 출력.
pipe | 와 tee를 이용.
pipe 사용에 대해 보다 자세한 건 다음을 참고:
우선 다음과 같은 shell script파일을 만들자.
#! /bin/env bash
echo "stdout: Hello,"
1>&2 echo "stderr: Redirection"
- 위의 파일에서 "stdout: Hello,"는 stdout으로 출력되고
- "stderr: Redirection"은 stderr로 출력됨
다음과 같이 테스트를 해보면 위 script file의 동작을 확인할 수 있음.
❯ chmod +x test.sh
❯ ./test.sh
stdout: Hello,
stderr: Redirection
❯ .test.sh 2> /dev/null
stdout: Hello,
❯ ./test.sh 1> /dev/null
stderr: Redirection
/dev/null로 redirection이 이루어지면 해당 출력을 보지않겠다는 의미임.- 사실
stdin은/dev/stdin이고,stdout은/dev/stdout,stderr은/dev/stderr로 일종의 파일이며 해당 파일의 stream을 통해 입출력이 이루어진다고 볼 수 있다.
아래와 같이 수행할 경우, tee에 의해 stdout과 log.txt 에 동시에 stderr과 stdout으로 보내지는 출력내용이 보내짐.
❯ ./test.sh 2>&1 | tee log.txt
tee의 경우, stdout과 파일에 동시에 출력하기 위해 사용됨.- 또는 permission 문제가 있어서 redirection으로 특정 파일에 기재가 불가할 경우,
| sudo tee permission요구파일과 같이 redirection 대신 pipe |와 tee의 조합을 사용한다. - redirection은 sudo를 취할 수 없기 때문에 pipe | 와 tee의 조합이 이 경우 필요함.
'Linux' 카테고리의 다른 글
| [Linux] Distribution (배포판)과 Kernel (0) | 2023.10.22 |
|---|---|
| [Linux] 현재 shell 또는 session의 관련 process들 확인하기 : jobs (0) | 2023.10.22 |
| [Linux] 한글 처리 : Ubuntu (2) | 2023.10.01 |
| [Linux] 파일 내용확인하기: cat, bat, less, more, head, tail (0) | 2023.09.30 |
| [Linux] 터미널 종료와 상관없이 지속 실행되는 process 만들기 : nohup, tmux (0) | 2023.09.29 |