본문 바로가기
Linux

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

by ds31x 2023. 10. 2.
728x90
반응형

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의 조합이 이 경우 필요함.