GNU/Linux >> Linux の 問題 >  >> Linux

プロセス置換とパイプ?

次のことをどのように理解するのか疑問に思いました:

コマンドのstdoutを別のコマンドのstdinにパイプすることは、強力な
テクニックです。しかし、複数の
コマンドのstdoutをパイプする必要がある場合はどうなりますか?これがプロセス置換の出番です。

言い換えれば、プロセス置換はパイプができることは何でもできますか?

プロセス置換は何ができますが、パイプはできませんか?

承認された回答:

それらの違いを理解する良い方法は、コマンドラインで少し実験することです。 <の使用における視覚的な類似性にもかかわらず 文字、それはリダイレクトやパイプとは非常に異なることをします。

dateを使用しましょう テスト用のコマンド。

$ date | cat
Thu Jul 21 12:39:18 EEST 2011

これは無意味な例ですが、cat dateの出力を受け入れました STDINで吐き出します。プロセス置換でも同じ結果が得られます:

$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011

しかし、舞台裏で起こったことは異なっていました。 STDINストリームが与えられる代わりに、cat 実際には、開いて読み取るために必要なファイルの名前が渡されました。このステップは、echoを使用して確認できます。 catの代わりに 。

$ echo <(date)
/proc/self/fd/11

catがファイル名を受け取ると、ファイルの内容が読み取られます。一方、echoは、渡されたファイルの名前を示しただけです。この違いは、置換を追加するとより明白になります:

$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011

$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13

プロセス置換(ファイルを生成する)と入力リダイレクト(ファイルをSTDINに接続する)を組み合わせることができます:

$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011

見た目はほとんど同じですが、今回はファイル名ではなくSTDINストリームが渡されました。これは、echoで試してみるとわかります:

$ echo < <(date)
<blank>

echoはSTDINを読み取らず、引数が渡されなかったため、何も取得されません。

パイプと入力リダイレクトは、コンテンツをSTDINストリームに押し出します。プロセス置換はコマンドを実行し、それらの出力を特別な一時ファイルに保存してから、コマンドの代わりにそのファイル名を渡します。使用しているコマンドが何であれ、それはファイル名として扱われます。作成されたファイルは通常のファイルではなく、名前付きパイプであり、不要になると自動的に削除されることに注意してください。

関連:Process Monitorでフィルタリングされたイベントは、メモリまたはディスクに保存されていますか?
Linux
  1. `^ m`そしてそれを取り除く方法は?

  2. 一部のコマンドでBashプロセス置換が機能しないのはなぜですか?

  3. スレッドとファイル記述子

  1. Bash - 日付コマンドとスペース

  2. 一時ファイルの作成 vs プロセス置換 vs 変数展開?

  3. ファイルの Date Created 属性と Last Modified 属性を別のファイルのものに変更する

  1. スーパーブロック、iノード、Dentry、およびファイル?

  2. パイプ区切りファイルのタイムスタンプを再フォーマットする

  3. Linux プロセスのメモリをファイルにダンプする