cat と tee の違いは何ですか?

cat と tee の違いは何ですか?

Apache をいじっていたphp.iniところ、関数を持つ PHP ファイルでメールを送信すると、mail()メールが自分のコンピューターに保存されるようになりました。これはテストや Web 開発者にとって便利です。以下は、私が に追加したコード行ですphp.ini

sendmail_path = "cat > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"

次のコード行も機能しました:

sendmail_path = "tee > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"

catコマンドとコマンドの違いは何ですかtee?

答え1

要約: catは、渡された名前のファイルから読み取りますが、tee書き込みも行います。ファイル名を渡さない場合にのみ、同じ効果があります。それ以外の場合、teewhen you mean を使用すると、cat読み取ろうとしていたファイルが上書きされ、予期しないデータ損失が発生する可能性があります。

catteeファイル名を指定しない場合も同様に動作します。これがあなたの例で起こっていることです。コマンドは出力リダイレクト( >) は渡されますが、実際のコマンドライン引数は渡されません。catおよびコマンドのファイル名を渡すと、それらは互いに異なる動作をするため、に渡すつもりteeが にファイル名を渡して、誤ってファイルを上書きしたり、データを失ってしまう可能性もあります。teecat

catと はtee引数なしでは同じことを行いますが、引数としてファイル名が渡されると異なることを行います。その理由は、それぞれの動作を考慮することで判別できます。一般に、それらはほぼ反対の動作をします。catは潜在的に多数のファイルを読み取り、その出力を 1 か所に送信しますが、 はtee1 つの入力を読み取り、潜在的に多数のファイルにそれを送信します。

catすべての入力ファイルの内容をコピーします標準出力を 1 つずつ実行します。つまり、ファイルを連結します。たとえば、は のcat x y内容を出力し、その後に の内容を出力します。単一のファイル名が渡されると、そのファイルの内容を標準出力にコピーし、それ以上引数がないので停止します。xy

cat一緒に走るといいえファイル名は、デフォルトで独自の標準入力基本的に、それは何であれ読むことを意味しますパイプまたはリダイレクトあるいは、端末に入力されたものに置き換えられます。(別の言い方をすると、ファイル名がない場合、catは のように動作します。cat -なぜなら、 はcat他のさまざまなコマンドと同様には、-特別扱いして標準入力を指定するようにとります。

ティー

tee標準入力の内容をすべての出力ファイルにコピーします。独自の標準出力もつまり、それはT字路--あるいは、もっと正確に言えば、いいえT字路ではいいえは、名前を渡す出力ファイルの数です。たとえば、tee xは入力を読み取り、それをファイルに書き込みx、さらに自身の標準出力にも書き込みます。tee x yは入力を読み取り、それをファイルに書き込みxまたファイルに書き込むだけyでなく、独自の標準出力にも書き込みます。

の最も一般的な使用法は、tee単一のファイル名引数を使用してパイプラインに挿入することです。たとえば、 というコマンドの出力を というfooコマンドの入力にパイプするとしますbar。 と記述できますfoo | bar。ただし、 というファイルに出力を記録してlogfile検査したい場合は、 を使用できますfoo | tee logfile | bar

teeは、指定した名前のファイルを上書きします。ただし-a、 オプションを渡した場合は、ファイルに追加されます。たとえば、そのログを上書きするのではなく追加するには、 を使用しますfoo | tee -a logfile | bar

とは異なりcat、このteeコマンドはファイル名引数がない場合を特別なケースとして扱いません。代わりに、入力を単にすべてゼロは、指定したファイル名のファイルをコピーし、通常どおり標準出力に渡します。 の場合と同様に、ファイル名を指定せずにcat実行するとtee、標準入力が標準出力にコピーされます。

stdin を stdout にコピーしたいだけの場合は、cat が適しています。

この目的のために引数なしでもcatも使用できますが、 を使用すると、人々はあなたが何を意味しているか理解できます。引数なしでも問題ありませんが、teecattee見た目cat間違いのように。時には、これは慣用的なそれを実行する方法。

catまた、とでサポートされているコマンドラインオプションがtee異なることにも注意してください。これらは主に異なることを行うため、まったく異なる方法で動作をカスタマイズできるため、これは予想どおりです。man catそしてman tee特にこれについての詳細は。

答え2

要約すると、cat読むためです(手動入力そしてファイル)とファイルへの書き込み(および>>>です。そしてteeはファイルへの書き込みについてのみ述べていますが、同時に入力を処理するコマンドの出力に応じて異なります。

例えば:

  • ping 192.168.1.xx | tee [-a] ping_report.txt

上記のコマンドを使用すると、同時にpingコマンドの出力を見るそしてその出力はファイルに書き込まれますping_report.txt(もちろん後で分析されます)。パラメータ-aが使用されている場合、入力 (最初のコマンドの出力) がファイルに追加されます。ping_report.txtそれ以外の場合は、新しい入力によって現在のコンテンツが上書きされます。

関連情報