stdout (표준출력, 1), sdtin(표준입력, 0), stderr(표준에러, 2)을 redirection하는 방법에 대한 문서
서버에서 백그라운드로 명령어 수행시
출력이나 error 메시지 등을
stdout이 아닌 file에 남길 때 유용.
- redirectiont operation에서 부등호 기호의 오른쪽에 stdin(0), stderr(2), stdout(1) 등이 놓일 경우 반드시 ampersand
&
가 주어져야 함.1>
,>&1
- 동시에 하나의 redirection operation이므로 중간에 공백문자가 들어가선 안 됨.
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
에 저장됨.
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
응용사례 3: 동시에 stdout과 파일에 출력.
pipe |
와 tee
를 이용.
2023.09.12 - [Linux] - [Linux] 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] SIGNAL 에 대한 요약 정리. (0) | 2023.10.22 |
---|---|
[Linux] 현재 shell 또는 session의 관련 process들 확인하기 : jobs (0) | 2023.10.22 |
[Linux] 한글 처리 : Ubuntu (1) | 2023.10.01 |
[Linux] 파일 내용확인하기: cat, bat, less, more, head, tail (0) | 2023.09.30 |
[Linux] 터미널 종료와 상관없이 지속 실행되는 process 만들기 : nohup, tmux (0) | 2023.09.29 |