バッシュダブルパイプ
この記事では、パイプと二重パイプについて十分に調べます。 Bash コマンド スクリプトでのパイプの使用法、表記法、および影響について説明します。
実生活では、パイプは流体またはガスをある場所から別の場所に運びます。 しかし、Bash では、パイプは流体を運ぶのではなく、1つのコマンドの出力を次のコマンドの入力として渡します。
Bash のパイプ
パイプは、コマンドの出力を次のコマンドの入力に送信するリダイレクト演算子です。 |
シンボルは、Bash のパイプとして使用されます。
Linux/UNIX システムでは、パイプが 1つのコマンドの stdout
を別のコマンドの stdin
に接続するとも言えます。
パイプは、前のコマンドの出力が次のコマンドの入力になる 2つ以上のコマンドを結合するためにも使用されます。 これにより、ファイル使用のオーバーヘッドがなくなります。
通常、ファイルから関連情報を抽出する必要がある場合は、まず前の出力をファイルに保存し、ファイルから読み取って、ファイル ストリームを必要な出力に変換します。
ただし、パイプでは、1つのコマンドの出力が入力として他のコマンドに直接フィードされます。 コマンドの基本的な表記を以下に示します。
Comand-1 | command-2 | .... | command-N
ls
と grep
の間にパイプを追加
ここで、パイプが 1つのコマンドの出力を次のコマンドの入力に接続する例を見ていきます。 この例では、指定されたディレクトリ内の一連のファイルから目的のファイルを名前で選択します。
ターミナルを開き、ファイルを配置したディレクトリに移動し、ls
コマンドを書き込みます。 ls -l
コマンドは、選択したディレクトリ ファイルの詳細を一覧表示します。
ただし、私たちの目標は、ls -l
の出力を選択し、パイプを追加し、特定のファイル名を検索して、出力に必要なファイルのみが含まれるようにすることです。
コードに従って、まず、特定のディレクトリ内のすべてのファイルの名前を一覧表示します。
ls -l
現在のディレクトリには 3つのファイルがあります。 詳細はスクリーンショットに示されています。 ただし、bash_double_pipe.md
ファイルの詳細に関心があります。
パイプと grep
そのファイルをその名前で使用します。
次のコードは、bash_double_pipe.md
の詳細を表示します。
ls -l | grep "bash_double_pipe.md"
パイプを使用した I\O リダイレクトを回避する
パイプは、リダイレクト中に標準の入力または出力を使用しません。 パイプはメイン メモリに実装されます。
次の例は、パイプがある場合とない場合のストリームのリダイレクトを示しています。
パイプなしの I\O リダイレクト
ls -l > temp
more < temp
上記のコードは、ls -l
の出力を temp
ファイルにリダイレクトし、temp
ファイルの内容を画面に表示します。 次のスクリーンショットは、上記の実行コードの出力を示しています。
ここで、パイプの標準入力または出力を使用せずに IO リダイレクトを調べます。 上記の例は、最初のコマンドの出力を 2 番目のコマンドの入力にリダイレクトします。
次のコードは、同じ IO リダイレクト操作を提供しますが、パイプを使用します。
ls -l | more
上記のコードは、ディスク IO なしで同じリダイレクト操作を実行します。 次のスクリーンショットは、上記の実行コマンドの結果を示しています。
上のスクリーンショットは、ディスク IO なしでパイプを使用してリダイレクトできることを示しています。
cat
、grep
、tee
、wc
コマンドでパイプを使用する
パイプは、cat
、grep
、tee
、および wc
コマンドでも非常に役立ちます。 ファイル内でレコードが何回出現するかを見たいとしましょう。
次に、多くの変数を作成する代わりに、これらのコマンド間にパイプを使用して、必要な出力を取得する必要があります。
次のコードは、cat
、grep
、tee
、および wc
コマンドとパイプの使用法を示しています。
cat abc.txt | grep "temp" | tee file2.txt | wc -l
cat
コマンドは abc.txt
のすべての内容を渡し、grep
コマンドに渡します。 grep
コマンドは、temp
と一致する文字列を持つ行のみを選択します。
次に、temp
文字列を含む行が tee
コマンドに渡され、出力が file2.txt
に書き込まれます。
その後、この出力は wc
コマンドに渡され、その中のレコード数がカウントされます。 file2.txt
には 3つの行があります。 上記のコマンドの出力は 3 です。
この記事を要約すると、パイプは、あるコマンドの出力を次のコマンドの入力に転送するのに非常に便利です。
単管と複管の違い
単管 |
あるコマンドの出力を次のコマンドの入力に送信しますが、二重パイプ||
単管とは違います。 二重パイプは OR
演算子を表し、一般に条件ステートメントで使用されます。
OR
演算子の構文と短絡評価
次のコードは、二重パイプの基本的な表記法を示しています。
command-1 || command-2
上記のコードは、||
の基本的な表記法と使用法を示しています。 オペレーター。 Bash は短絡評価をサポートしています。
短絡評価とは、条件の評価が停止し、それが明らかになるとすぐに最終決定を返すことを意味します。 たとえば、複数の式を OR
演算子で組み合わせた複合条件は、式の 1つが true
になるとすぐに停止します。
結果が最終的な決定に影響を与えないため、他の式をさらに評価することはありません。
したがって、Bash インタープリターは、上記の Bash スクリプトの最初のコマンドを実行しようとします。 最初のコマンドが正常に実行されると、command-2
は実行されません。
2 番目のコマンドは、最初のコマンドが正常に実行されなかった場合にのみ実行されます。
二重管の例を見てみましょう。
ls -a || echo "hello world"
上記のスクリプトでは、command-1
で、現在のディレクトリの要素を一覧表示します。 command-2
では、メッセージ hello world
を出力します。
これら 2つのコマンドの間に二重パイプを使用しました。 上記のコマンドを実行すると、command-1
は現在のディレクトリの要素を正常に一覧表示するため、command-2
は無視されます。
次に、command-1
が正常に実行されないシナリオを調べてみましょう。
ls a || echo "hello world"
上記のコマンドは、2 番目のコマンドが実行されるシナリオを示しています。 最初のコマンドでは、a
フラグの前にハイフン (-
) を使用していませんでした。 したがって、このコマンドは正常に実行されません。
したがって、OR
演算子は echo
コマンドを実行し、hello world
メッセージを出力します。
次のスクリーンショットは、上記の 2つのコマンドの出力を示しています。
上記のアイデアは、任意の数のコマンドを連鎖するように拡張できます。 たとえば、次のスクリプトは、||
を使用して 4つのコマンドを連結します。 演算子、および評価は左から右に開始されます。
いずれかのコマンドが正常に実行されると、右側の残りのコマンドはすべてスキップされます。
Command-1 || Command-2 || Command-3 || command-4
まとめ
この記事では、シングル パイプとダブル パイプの標識とその機能について説明しました。 単一のパイプ記号は、あるコマンドの出力を別のコマンドの入力に渡す Linux パイプを表します。
一方、二重パイプ記号は論理 OR
演算子であり、論理演算に役立ちます。