テキスト出力を生成する独自のプログラムを実行しています。一種のロガーのようです。
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
標準出力は実際にパイプの書き込み終了です。パイプのもう一方の端には、それを読み取り、通常どおり2つの出力を配布するシェルプロセスがありますtee
。