텍스트 출력을 생성하는 독점 프로그램을 실행하고 있습니다. 일종의 로거와 같습니다.
logger
서버가 숨쉬는지 확인하기 위해 터미널에서 이 출력을 보고 텍스트 파일로 보내고 싶습니다. 그래서 보통 나는 이렇게 한다:
logger | tee /tmp/log.txt
그러나 이러한 로그 파일은 가상 머신의 디스크 공간을 압도할 정도로 커질 수 있습니다. 압축되지 않은 텍스트 파일로 텍스트를 보내는 대신 즉시 압축되기를 원합니다. 그래서 나는 이렇게 할 수 있습니다:
logger
터미널에서 그리고
logger | gzip > /tmp/log.gz
다른 터미널에서. 하지만 기분이 좋지 않습니다.
를 사용하는 것과 유사하게 단일 명령으로 이를 수행할 수 있는 방법이 있습니까 tee
? 이것이 내가 원하는 것입니다. 분명히 작동하지 않을 것입니다. 그러나 아마도 다음과 같은 아이디어를 얻게 될 것입니다.
logger | tee gzip > /tmp/log.txt
답변1
ksh93
, 또는 :zsh
bash
logger | tee >(gzip > /tmp/log.txt.gz)
그것은 ksh
호출되는 것을 사용합니다프로세스 교체. >(gzip > /tmp/log.txt.gz)
예교체됨파일 경로(보통 다음과 같지만 /dev/fd/something
일시적일 수도 있음)명명된 파이프)는 파이프의 쓰기 끝을 나타냅니다. 파이프의 다른 쪽(읽기) 끝에서 쉘은 명령을 실행하는 새 프로세스(백그라운드에서 실행 중)의 표준 입력에 연결됩니다 gzip
.
그래서 tee
글을 쓸 때문서, 실제로 데이터를 에 공급합니다 gzip
.
가 있는 시스템에서는 /dev/fd/n
이 작업을 수동으로 수행할 수 있습니다(ksh93을 제외한 Bourne과 유사한 셸 사용). 예:
{ logger | tee -a /dev/fd/3 | gzip > /tmp/log.txt.gz; } 3>&1
(단, 이 경우에는 표준 출력만 연결된 파이프가 /dev/fd/3
아니라 파일 설명자 3에서 사용한 원시 표준 입력을 참조합니다 .)3>&1
gzip
tee
그리고 zsh
:
logger >&1 > >(gzip > /tmp/log.txt.gz)
그 사용zsh
여러 운영 체제이 함수는 동일한 출력을 여러 파일(여기서는 프로세스 대체를 다시 사용하기 위한 원시 stdout() 및 파이프 )로 리디렉션 zsh
하는 방법을 내부적으로 구현합니다 .tee
>&1
gzip
logger
표준 출력은 실제로 파이프의 쓰기 끝입니다. 파이프의 다른 쪽 끝에는 이를 읽고 평소와 같이 두 개의 출력을 배포하는 셸 프로세스가 있습니다 tee
.