본문 바로가기
Linux

[Bash] 입출력 목적지 변경하기 : Redirection Operation

by ds31x 2023. 10. 2.

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에 저장됨.

https://ds31x.tistory.com/110

 

[Linux] 파일 내용확인하기: cat, bat, less, more, head, tail

cat, bat cat (concatenate)은 가장 간단하게 파일 내용을 확인할 수 있게 해준다. stdout에 파일의 내용을 출력해주는 역할을 한다. bat은 cat을 보다 개선한 프로그램이다. 행번호 출력 및 페이지에 맞춰

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

응용사례 3: 동시에 stdout과 파일에 출력.

pipe |tee를 이용.

2023.09.12 - [Linux] - [Linux] Pipe와 다중 명령어

 

[Linux] Pipe와 다중 명령어

| : Pipe Pipe |는 2개의 processes를 연결해주는 연결 통로로서 pipe 앞의 프로세스의 stdout(표준출력)이 pipe 뒤의 프로세스의 stdin(표준입력)으로 쓰이도록 연결해주는 것임. 예를 들어 ls|sort|more의 경우

ds31x.tistory.com

 

우선 다음과 같은 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의 조합이 이 경우 필요함.
728x90