표준 입력을 콘솔에 보내고 파일을 압축합니다.

표준 입력을 콘솔에 보내고 파일을 압축합니다.

텍스트 출력을 생성하는 독점 프로그램을 실행하고 있습니다. 일종의 로거와 같습니다.

logger

서버가 숨쉬는지 확인하기 위해 터미널에서 이 출력을 보고 텍스트 파일로 보내고 싶습니다. 그래서 보통 나는 이렇게 한다:

logger | tee /tmp/log.txt

그러나 이러한 로그 파일은 가상 머신의 디스크 공간을 압도할 정도로 커질 수 있습니다. 압축되지 않은 텍스트 파일로 텍스트를 보내는 대신 즉시 압축되기를 원합니다. 그래서 나는 이렇게 할 수 있습니다:

logger

터미널에서 그리고

logger | gzip > /tmp/log.gz

다른 터미널에서. 하지만 기분이 좋지 않습니다.

를 사용하는 것과 유사하게 단일 명령으로 이를 수행할 수 있는 방법이 있습니까 tee? 이것이 내가 원하는 것입니다. 분명히 작동하지 않을 것입니다. 그러나 아마도 다음과 같은 아이디어를 얻게 될 것입니다.

logger | tee gzip > /tmp/log.txt

답변1

ksh93, 또는 :zshbash

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>&1gziptee

그리고 zsh:

logger >&1 > >(gzip > /tmp/log.txt.gz)

그 사용zsh 여러 운영 체제이 함수는 동일한 출력을 여러 파일(여기서는 프로세스 대체를 다시 사용하기 위한 원시 stdout() 및 파이프 )로 리디렉션 zsh하는 방법을 내부적으로 구현합니다 .tee>&1gzip

logger표준 출력은 실제로 파이프의 쓰기 끝입니다. 파이프의 다른 쪽 끝에는 이를 읽고 평소와 같이 두 개의 출력을 배포하는 셸 프로세스가 있습니다 tee.

관련 정보