標準入力をコンソールに送信し、ファイルを圧縮します。

標準入力をコンソールに送信し、ファイルを圧縮します。

テキスト出力を生成する独自のプログラムを実行しています。一種のロガーのようです。

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標準出力は実際にパイプの書き込み終了です。パイプのもう一方の端には、それを読み取り、通常どおり2つの出力を配布するシェルプロセスがありますtee

関連情報