Linuxで最も強力なシェル演算子の1つは、パイプです。この記事では、通常のパイプと名前付きパイプがどのように機能するか、それらを使用する方法、およびそれらが互いにどのように異なるかを確認します。
パイプは、LinuxおよびUnixライクなオペレーティングシステムの最も価値のあるコマンドライン機能の1つです。パイプはさまざまな用途で利用されています。 Linuxのコマンドラインの記事を見ると、パイプが頻繁に表示されていることがわかります。
縦棒記号|
パイプを示します。パイプがあるため、あるコマンドからの出力を取得して、入力として別のコマンドに送ることができます。
その結果、あるコマンドの出力を別のコマンドの入力として使用したり、そのコマンドの出力を次のコマンドの入力として使用したりすることができます。
したがって、パイプされた単一のコマンドに制限されません。何度でも積み重ねることができます。
言い換えると、パイプは、Linuxで使用されるリダイレクトの形式であり、あるプログラムの出力を別のプログラムに送信して、さらに処理します。パイプを使用すると、シェルがサポートしていない操作をすぐに実行できます。
パイプまたは無名パイプコマンドの構文は、|
です。 任意の2つのコマンド間の文字:
command1 | command2 | ... | commandN
Linuxでパイプはどのように機能しますか
パイプがどのように機能するかを確認するために、以下の例を見てみましょう。
さまざまな種類のファイルでいっぱいのディレクトリがあります。そのため、このディレクトリに特定の種類のファイルがいくつあるかを知りたいのです。
したがって、ls
を使用してファイルのリストを簡単に取得できます。 コマンド:
ls -l
grepを使用して、探しているファイルの種類を分離します。たとえば、txt
という単語を含むファイルを探します 名前またはファイル拡張子として。
特殊なシェル文字|
を使用します ls
を指示する ‘grep
への出力 。
ls | grep txt
上の画像からわかるように、ls
の出力 コマンドがターミナルウィンドウに送信されませんでした。
したがって、結果は画面に表示されません。代わりに、grep
の入力にリダイレクトされます 指図。上記の出力はgrep
からのものです 、このチェーンの最後のコマンド。
それでは、チェーンの拡張を始めましょう。ファイルをカウントできますtxt
wc
を追加する チェーンへのコマンド。 -l
を使用します オプション(行数)とwc
。
ls | grep txt | wc -l
上記の例では、grep
はチェーンの最後のコマンドではなくなったため、その出力は表示されません。代わりに、grep
の出力 wc
にフィードされます コマンド。
ターミナルウィンドウに表示される結果は、wc
からのものです。 。 txt
の2つのファイルを報告します ディレクトリ内。
Linuxの名前付きパイプとは何ですか?
名前自体が示すように、これらは名前の付いたパイプです。通常のパイプと名前付きパイプの主な違いの1つは、名前付きパイプがファイルシステムに存在することです。 。つまり、ファイルのように表示されます。
Linuxの名前付きパイプは、特定の名前が付けられたパイプを使用して、あるコンピュータープロセスから別のコンピュータープロセスに情報を渡すための方法です。名前付きパイプはFIFOとも呼ばれ、先入れ先出しの略です。 。
mkfifo
を使用して名前付きパイプを作成できます 指図。例:
mkfifo mypipe
p
を使用すると、ファイルが名前付きパイプであるかどうかを確認できます。 ファイルパーミッションセクションのビット。
ls -l mypipe
prw-r--r-- 1 root root 0 Mar 20 12:58 mypipe
名前付きパイプは、ファイルシステム自体のファイルです。標準のパイプとは異なり、名前付きパイプは、他のファイルタイプと同様に、ファイルシステムの一部としてアクセスされます。
名前付きパイプのコンテンツは、ディスクに書き込まれるのではなく、メモリに存在します。したがって、パイプの両端が開いている場合にのみ通過します。また、パイプをもう一方の端で開いて読み取る前に、パイプに複数回書き込むことができます。
名前付きパイプを使用すると、1つのプロセスがパイプに書き込み、別のプロセスがパイプから読み取るプロセスを確立できます。これらの相互作用の時間を計ったり、慎重に調整したりする必要はありません。
名前付きパイプがどのように機能するかを確認するために、以下の例を見てみましょう。まず、名前付きパイプを作成しましょう:
mkfifo mypipe
それでは、このパイプでメッセージを消費しましょう。
tail -f mypipe
別のターミナルウィンドウを開き、このパイプにメッセージを書き込みます:
echo "hi" >> mypipe
これで、最初のウィンドウに「こんにちは」が印刷されているのがわかります。
tail -f pipe1
hi
これはパイプであり、メッセージが消費されているため、ファイルサイズを確認すると、まだ0であることがわかります:
ls -l mypipe
prw-r--r-- 1 root root 0 Mar 20 14:11 mypipe
名前付きパイプは単なるLinuxファイルであるため、rmコマンドを使用してパイプを削除できます。したがって、前の例で作成したパイプを削除するには、次のコマンドを実行します。
rm mypipe
Linuxで名前付きパイプの代わりに通常のパイプを使用するかどうかは、探している特性によって異なります。永続性、双方向通信、ファイル名の設定、フィルターの作成、アクセス許可の制限などがあります。
たとえば、コマンドの出力を複数回フィルタリングする場合は、無名パイプを使用するのが最も適切なオプションのようです。
一方、ファイル名が必要で、データをディスクに保存したくない場合は、名前付きパイプを探します。
結論として、次にLinuxターミナルでコマンドを操作していて、コマンド間でデータを移動していることに気付いたときは、パイプを使用するとプロセスがすばやく簡単になります。
結論
この記事では、Linuxコマンドで使用した場合のパイプの多様性について説明しました。それでも、比較的単純ですが、さまざまな複雑なクエリを解決できます。
さらに、このコマンドラインツールはシンプルで、UNIXおよびLinuxプラットフォームで動作します。
pipe
の詳細 Linuxでコマンドを実行するには、そのマニュアルページを参照してください。