I/O redirection using TEE

Younghwan Cha·2023년 2월 1일
0

linux command

목록 보기
1/16
post-thumbnail

실행한 커맨드의 결과를 특정 파일에 로그처럼 저장하고 싶다면 어떻게 할까?
이를 알아보기 위해 redirection 이라는 녀석에 대해 알아보자.


I/O redirection?

리눅스의 쉘은 항상 표준 입출력을 파일 형태로 열고있다.

  • /dev/stdin => 표준입력( stdin: 키보드 )
  • /dev/stdout => 표준출력( stdout: 모니터 )
  • /dev/stderr => 표준에러( stderr: 모니터 )
  • /dev/null 은 비워지는 공간으로 휴지통처럼 사용됨

이와 같이 리눅스 프로그램은 연산 결과들을 출력 장치로 내보내는 데,
이와 같이 출력되는 흐름을 제어하는 것을 재지향, redirection 이라고 한다.
파일이나 프로그램, 명령어 등의 출력을 낚아채어 다른 파일이나 프로그램, 명령어의 표준 입력으로 보내주는 것이다.


file descriptor

리눅스에서 열려 있는 파일은 각각의 파일 기술자( file descriptor )를 할당 받게된다.

  • 표준 입력(stdin) = 0
  • 표준 출력(stdout) = 1
  • 표준 에러(stderr) = 2

이를 통해서 입력, 출력, 에러를 다양하게 redirection 이 가능하다.

  1. <: Input redirection
cat < test.txt

=> test ( 기존 test.txt 에 존재하던 내용 )

지정된 파일의 내용을 표준 입력으로 넘겨준다.
파일 기술자 0 을 생략(0<)하고 있어 < 로 사용하면된다.

  1. >: Overwrite redirection
echo test > test.txt
cat test.txt

=> test ( 기존 test.txt 를 덮어씌운다 )

표준 출력에 전달된 내용을 지정된 파일로 넘겨준다.
파일 기술자 1 을 생략(1>)하고 있어 > 로 사용하면 된다.

  1. >>: Append redirection
echo test > test.txt
cat test.txt

=> hello world
test ( 기존 test.txt 에 추가된다 )

표준 출력에 전달된 내용을 지정된 파일로 넘겨준다. > 와 다르게 파일을 덮어쓰지 않고
기존의 내용에 더해준다.
파일 기술자 1 을 생략(1>>)하고 있어 >> 로 사용하면 된다.

  1. 2>: error redirection
a.sh 2> file.txt
cat file.txt

=> command not found ( a.sh 에서 발생한 에러 출력 )

표준 에러를 지정된 파일로 넘겨준다.

  1. <<: here document
cat << EOF > test.txt
1
2
3
EOF

구분자를 통해서 문서의 마지막을 나타낸다.
보통 EOF 를 구분자로 자주 사용한다.
파일 기술자 0 을 생략(0<<)하고 있어 << 로 사용하면된다.


이에 더해서 >& 와 같이 표준 출력과 표준 에러를 모두 반환 할 수도 있다.
이와 관련해서는 하단 포스팅을 참고해보자.

리다이렉션 기호 조합
https://inpa.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-devnull-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%EC%85%98-%EA%B8%B0%ED%98%B8-%EC%A2%85%EB%A5%98


아래의 경우를 다시 보자

cat hello > test.txt

cat hello stdout 을 test.txt 에 넘겨준다.
실제로 실행해보면 stdout 에는 아무것도 나오지 않는다.

하지만 나는 파일에도 기록하고 stdout 으로도 보고싶은걸...?

여기 그런 당신을 위한 선물이 있다.
바로 tee 라는 녀석이다.


tee

tee 명령어는 stdin 으로 받은 입력을 stdout 과 file_io 로 전달한다.

아래 예시에서 볼 수 있듯이

  • > => | tee
  • >> => | tee -a

위와 같이 사용 할 수 있다.

echo hello > file.txt

ls -al | tee file.txt
ls -al >> file.txt

ls -al | tee -a file.txt

[ref]
https://wooono.tistory.com/112
https://love-every-moment.tistory.com/52
https://tecadmin.net/tee-command-in-linux-with-examples/

profile
개발 기록

0개의 댓글