「プロセス置換」の概念を理解[重複]

「プロセス置換」の概念を理解[重複]

クライアントや企業のために毎日サーバー環境のメンテナンスを行うことなく、個人的なプロジェクトのためにサーバー環境のメンテナンスを時々実行する一般の聴衆/非専門的なシステム管理者を対象に、「プロセスの置き換え」という用語の簡単な説明が要求されるかどうか探しています。ここなら。

  • この概念はどのような問題を解決するように設計されていますか?
  • 置き換えられるプロセスは何で、名前が誤解を招く可能性がありますか?
  • 「標準入力の維持」とも呼ばれますか?それではなぜ? stdinデバイスが別のコマンドにパイプすることができる標準入力を持っている場合、「保存」できるもう1つのことは何ですか?

これは、次のコマンドを理解するのに役立ちます。

bash <(wget -O - URL)

新規移民のための注意事項: -O -wgetデータを標準出力に書き込むように指示します。

ベストアンサー1

重要な事実:2つの殻が関連しています。

まず、2つのシェルが関連していることに注意してください。あなたが働き、bash <(wget -O - URL)電話する外部Bash 。コマンドが実行されると、内部 Bash は外部 Bash の子プロセスとして実行されます。

つまり、外部 Bash はbash <(wget -O - URL)コマンドを受け入れ、内部 Bash を生成します。適切な場合は2つを区別します。


重要な事実:Bashでコードを実行する方法はいくつかあります。

(内部的に)Bashにいくつかのコードを実行させる方法はいくつかあります。

  1. bashコードは標準入力から読み取ることができます。

    echo 'date; sleep 2; date' | bash
    

    標準入力はコンソールにすることができます。たとえば、一般的に機能するインタラクションはbashコンソールから読み取られますが、実際には標準入力から読み取られます。はい標準入力です。

  2. bashコードはファイルから読み取ることができます。

    bash /path/to/some/file
    

    (パスは相対的な場合があります。)

  3. bashコマンドライン引数からコードを読み取ることができます。

    bash -c 'date; sleep 2; date'
    

コンテキスト

コメントでは、文脈は次のように述べています。この問題。私の答えは、次のものを置き換えることを示唆しています。

wget -O - URL | bash

そして

bash <(wget -O - URL)

最初のコマンドは、内部がbash標準入力から読み取られるようにします。 2番目のコマンドがbash標準入力以外のファイルを内部的に読み取ることを認識していないようです。


どうしたの?<(…)

Bashで実行すると、外部Bashが特定のパスにbash <(wget -O - URL)置き換えられます。<(…)文書。置換後の実際のコマンドの実行は次のとおりです。

bash /dev/fd/63

これにより内部 Bash が生成されます。/dev/fd/63開くように開きます/path/to/some/file

プロセス交換の「魔法」のおかげで、/dev/fd/63パイプはすでに接続されていますwget -O - URL

注:/dev/fd使用できないシステムでは、外部 Bash は実際の名前付きパイプ (たとえば/tmp/sh-np.pldKay.


類似性

どちらの場合もwget(内部)への接続は似ています。bashを実行すると、wget -O - URL | bashコードはパイプが書き込むbash標準入力から読み取られます。wgetを実行すると、bash <(wget -O - URL)パイプが作成した他のファイルbash(つまり、標準入力ではなく)からコードを読み込みます。wgetどちらの場合も、外部 Bash がパイプを設定します。


違い

違いは、プロセス置換の場合、内部 Bash の標準入力がコードを渡すために使用されないことです。標準入力は他の目的に使用できます。たとえば、標準入力はコンソールにすることができ、readコードから読み取ることができます。


あなたの明確な質問への回答

  • この概念はどのような問題を解決するように設計されていますか?

    コマンドにパス名(ファイルパス)が必要で、通常のファイルを提供するのではなく、何かをパイプする場合は、名前付きパイプを作成して目標を達成できます。これを行うには、実際にパイプ(mkfifo)を作成し、パイプに何かをパイプし(バックグラウンドまたは他のコンソールで)コマンドを実行し、最後に名前付きパイプ(rm)を削除する必要があります。

    プロセスの置き換えにより、Bashはパイプを処理できます。とても便利です。

  • どのプロセスが置き換えられていますか?何と交換しますか?

    bash <(wget -O - URL)コマンド(および同様のコマンド)を実行する前に、構文<(wget -O - URL)をファイルパスに置き換えてくださいbash /dev/fd/63。外部 Bash はファイルを準備するので、ファイルを読み取るということはwget -O - URL(プロセスが) 書いた内容を読むという意味です。ファイルは実際には通常のファイルではなくパイプです。

  • 「標準入力の維持」とも呼ばれますか?それではなぜ?

    「標準入力の保持」が発生しますが、プロセス交換の代替名ではありません。これはない公式起こったことの名前。

    (外部) Bash 内で (内部) 実行すると、bash …内部 Bash は外部 Bash から標準入力を継承します (つまり、同じファイルです)。標準入力はコンソールです。

    ただし、代わりに実行すると、Bash内部で独自の標準入力からのデータがwget … | bash …表示されます。wgetこれで、内部 Bash の一部(例:read 組み込み)またはBash内のいくつかのサブプロセスがstdinから何かを読みたいと思うかもしれません。彼らはコンソールのようなものから入力を期待していますが、いいえ内部的に、Bashはコードを実行する必要があります。しかし、内部的には、Bashの標準入力はパイプから出てくるので、組み込み機能はwgetそれを使用し、子プロセスはそれを次のように継承します。彼ら標準入力。外部 Bash の標準入力を継承しません。

    (内部)標準入力を介してコードをパイピングするのではなく、プロセス置換を使用すると、bash外部Bashの標準入力を内部Bashの組み込み関数と子で使用できるようになります。あなた救う組み込み機能と内部 Bash の子が使用する外部 Bash への標準入力です。同時に、Bashが内部的に読み込んで実行するコードフローを、組み込み関数または子関数が読み取ることを防ぐことができます。

    bashこれは、コマンドライン引数で指定されたファイルにコードを提供できるために機能します。 (内部的に)Bashがstdinからのコード読み取りのみをサポートしている場合は、stdinを介してコードを提供する必要があります。この場合、プロセス全体では問題を解決できません。あなたが直面する問題

おすすめ記事