A パイプまたはピップeは実際にはUNIX / Linuxで利用可能なパイプラインであり、非常に実用的です。 ただし、パイプとは何かを完全に理解するには、* nix環境に3つの組み込みデータストリームがあることを知っておく必要があります。 つまり、知らない人にとっては、データがXNUMXつのポイントに出入りできることを意味します。
その後、あなたはこれをより良い方法で理解するでしょう、しかし私が今あなたに明らかにしたいのは、パイプラインであなたができることはそれらのポイントのXNUMXつから他のポイントへのチャネルであるということです。 これにより、プログラムが別のプログラムの入力に向けてスローした出力または結果を、そのプログラムが使用できるようにすることができます。 私はあなたがそれを非常によく理解するのを助けるいくつかの実際的な例でそれを説明しようとします。
私が話していたそれらのポイントまたは データストリーム、:
- stdin:0に対応し、標準入力です。 一般に、* nixシステムの標準入力はキーボードです。 つまり、入力するのは使用される情報です。 彼女には、/ dev / stdinという特別なデバイスが関連付けられています。
- (Linuxで言うところのstdout):1で識別され、標準出力です。 通常、それはあなたが情報を見ることができるあなたのコンピュータのモニターまたはスクリーンに対応します。 たとえば、lsコマンドを実行すると、目次が画面に表示されますよね? 関連するデバイスは/ dev / stdoutです。
- stderr:2で識別され、プログラムでエラーが発生した場合の標準エラー出力です。 関連するデバイスは/ dev / stderrです。
パイプラインを使用すると、あるコマンドの標準出力または標準出力を別のコマンドの標準入力に直接渡すことができます。。 つまり、あるプログラムに別のプログラムをフィードさせることができます。 パイプは、キーボードで入力されたパラメーターを使用する代わりに、前のコマンドで生成された情報を、|で表されるこのパイプラインを介して配信します。
とともに 例 あなたはそれをよりよく理解するでしょう。 ディレクトリの内容を一覧表示したいが、docという単語に一致する名前だけを表示したいとします。 したがって、パイプラインを使用してlsの出力をgrepフィルターの入力にパイプし、そのパターンに一致するものだけを表示するように指示できます。
ls -l | grep doc
つまり、すべての名前を表示するのではなく、単に表示するだけです。 あなたが本当に興味を持っているもの。 ファイルの内容についても同じことができます。 すべてではなく、firefoxという名前のプロセスの情報のみを表示したいとします。
ps aux | grep firefox
psプログラムのすべての出力を画面(stdout)に表示する代わりに、それをgrepフィルターの入力に向けてチャネル化し、この場合はFirefoxパターンに対応するものだけを出力に表示します...
必要に応じて、使用できます 様々なパイプ XNUMXつのコマンドの出力を別のXNUMX番目のコマンドの入力に、そのXNUMX番目の出力をXNUMX番目のコマンドの入力に移動します。 例えば:
cat libro | grep love | more
お分かりのように、 可能性はたくさんあります、あなたが想像することができ、許可されているすべてのもの。 ファイルの最初と最後の行だけを表示し、リストから来るwcに入る行を数え、さらにそれらをソートします。
cat listado | head cat listado | tail cat listado | wc -l cat listado | sort
一緒に作業することもできます |&のエラー たとえば、失敗した場合は、スクリプトの出力でアラートという単語を探します。
./miscript |& grep alerta
そして最後に、パイプに密接にリンクされたXNUMXつのコマンドがあります。 teeとxargs そして、それらはこれらの可能性をさらに広げることができます。 teeの場合、前のプログラムの結果を標準出力に表示して表示できるようにするだけでなく、別のファイルにパイプすることもできます。 例としては、ディレクトリの内容を一覧表示し、現時点でls -lの出力を確認し、それをファイルlisting.txtに保存する場合があります。
ls -l | tee listado.txt
teeを使用しない場合、コンソールに出力を表示することはできません...
Y xargs 場合によってはさらに興味深いものです。 この場合、パイプラインを介して受け取る標準入力からコマンドを作成できます。 言い換えると、前のプログラムがその出力を介して起動し、パイプラインを介してxargsに到達し、引数として別のコマンドに渡すすべてのものをキャプチャすることができます。
それでもわかりませんか? 例を使用すると、はるかによくわかります。 ディレクトリ、ディスク、またはパーティションからすべてのいまいましいthumbs.dbファイルを削除したいとします。 数が多い場合は、rmコマンドでXNUMXつずつ手動で削除できない場合があります。 しかし、xargsを使用すると、すべてを自動化できます。 そして、findを使用してそれらを見つけ、xargsの入力を介して出力を送信すると、rmに引数として名前が付けられます。 したがって、見つかったものはすべて自動的に削除されます。
find ./ -name "thumbs.db" | xargs rm
たとえば、findが/home/name/thumbs.db、/media/test/thumbs.db、および/tmp/thumbs.dbを検索するとします。 そうですね、xargsはそれらを引数であるかのようにrmに配信します。 つまり、rm /home/name/thumbs.db、次にrm /media/test/thumbs.db、次にrm / tmp / thumbs.dbを実行したかのようになります。
すばらしい、この情報は私たちLinuxユーザーにとって非常に重要です
Linuxコマンドラインの本でI / Oリダイレクトを研究しているので、なんて良い記事でしょう。 パイプ(パイプライン)とXNUMXつのデータストリームについては、私にはわかりやすいです。 貢献に感謝します。 ご挨拶。
xargsを使用した例は、手袋のように私に適していました。 まさに今日、私は「部分的に」送信しなければならなかった複数の出口の詳細を扱っていました。 xargsはpinturitaを歩きました。
とても感謝しています!