![「プロセス置換」の概念を理解[重複]](https://linux33.com/image/189776/%E3%80%8C%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E3%80%8D%E3%81%AE%E6%A6%82%E5%BF%B5%E3%82%92%E7%90%86%E8%A7%A3%5B%E9%87%8D%E8%A4%87%5D.png)
クライアントや企業のために毎日サーバー環境のメンテナンスを行うことなく、個人的なプロジェクトのためにサーバー環境のメンテナンスを時々実行する一般の聴衆/非専門的なシステム管理者を対象に、「プロセスの置き換え」という用語の簡単な説明が要求されるかどうか探しています。ここなら。
- この概念はどのような問題を解決するように設計されていますか?
- 置き換えられるプロセスは何で、名前が誤解を招く可能性がありますか?
- 「標準入力の維持」とも呼ばれますか?それではなぜ? 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にいくつかのコードを実行させる方法はいくつかあります。
bash
コードは標準入力から読み取ることができます。echo 'date; sleep 2; date' | bash
標準入力はコンソールにすることができます。たとえば、一般的に機能するインタラクションは
bash
コンソールから読み取られますが、実際には標準入力から読み取られます。はい標準入力です。bash
コードはファイルから読み取ることができます。bash /path/to/some/file
(パスは相対的な場合があります。)
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を介してコードを提供する必要があります。この場合、プロセス全体では問題を解決できません。あなたが直面する問題。