실행한 커맨드의 결과를 특정 파일에 로그처럼 저장하고 싶다면 어떻게 할까?
이를 알아보기 위해 redirection 이라는 녀석에 대해 알아보자.
리눅스의 쉘은 항상 표준 입출력을 파일 형태로 열고있다.
/dev/stdin
=> 표준입력( stdin: 키보드 )/dev/stdout
=> 표준출력( stdout: 모니터 )/dev/stderr
=> 표준에러( stderr: 모니터 )/dev/null
은 비워지는 공간으로 휴지통처럼 사용됨이와 같이 리눅스 프로그램은 연산 결과들을 출력 장치로 내보내는 데,
이와 같이 출력되는 흐름을 제어하는 것을 재지향, redirection 이라고 한다.
파일이나 프로그램, 명령어 등의 출력을 낚아채어 다른 파일이나 프로그램, 명령어의 표준 입력으로 보내주는 것이다.
리눅스에서 열려 있는 파일은 각각의 파일 기술자( file descriptor )를 할당 받게된다.
이를 통해서 입력, 출력, 에러를 다양하게 redirection 이 가능하다.
<
: Input redirectioncat < test.txt
=> test ( 기존 test.txt 에 존재하던 내용 )
지정된 파일의 내용을 표준 입력으로 넘겨준다.
파일 기술자 0 을 생략(0<
)하고 있어 <
로 사용하면된다.
>
: Overwrite redirectionecho test > test.txt
cat test.txt
=> test ( 기존 test.txt 를 덮어씌운다 )
표준 출력에 전달된 내용을 지정된 파일로 넘겨준다.
파일 기술자 1 을 생략(1>
)하고 있어 >
로 사용하면 된다.
>>
: Append redirectionecho test > test.txt
cat test.txt
=> hello world
test ( 기존 test.txt 에 추가된다 )
표준 출력에 전달된 내용을 지정된 파일로 넘겨준다. >
와 다르게 파일을 덮어쓰지 않고
기존의 내용에 더해준다.
파일 기술자 1 을 생략(1>>
)하고 있어 >>
로 사용하면 된다.
2>
: error redirectiona.sh 2> file.txt
cat file.txt
=> command not found ( a.sh 에서 발생한 에러 출력 )
표준 에러를 지정된 파일로 넘겨준다.
<<
: here documentcat << EOF > test.txt
1
2
3
EOF
구분자를 통해서 문서의 마지막을 나타낸다.
보통 EOF
를 구분자로 자주 사용한다.
파일 기술자 0 을 생략(0<<
)하고 있어 <<
로 사용하면된다.
이에 더해서 >&
와 같이 표준 출력과 표준 에러를 모두 반환 할 수도 있다.
이와 관련해서는 하단 포스팅을 참고해보자.
아래의 경우를 다시 보자
cat hello > test.txt
cat hello
stdout 을 test.txt
에 넘겨준다.
실제로 실행해보면 stdout 에는 아무것도 나오지 않는다.
하지만 나는 파일에도 기록하고 stdout 으로도 보고싶은걸...?
여기 그런 당신을 위한 선물이 있다.
바로 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/