web-dev-qa-db-ja.com

プロセス置換のコマンドはサブシェルで呼び出されますか?

Bashマニュアルから

プロセス置換は、名前付きパイプ(fifos)または開いているファイルに名前を付ける_/dev/fd_メソッドをサポートするシステムでサポートされています。それはの形を取ります

_<(list)
_

または

_>(list)
_

プロセスリストは、入力または出力を_/dev/fd_のFIFOまたはファイルに接続して実行されます。このファイルの名前は、展開の結果として現在のコマンドに引数として渡されます。

プロセス置換のコマンドlistはサブシェルで呼び出されますか<(list)または>(list)は、コマンド置換、括弧でグループ化されたコマンド、および非同期コマンドと同様ですか? bashのマニュアルにあるように

コマンド置換、括弧でグループ化されたコマンド、および非同期コマンドはサブシェル環境で呼び出されますこれはシェル環境の複製ですが、シェルによってキャッチされたトラップはシェルが継承した値にリセットされます。呼び出し時の親。

  1. 答えはイエスかもしれません、なぜなら

    • プロセス置換はコマンド置換に似ていますが、

    • いくつかのソース はそれを言います

      その中のコマンドはバックグラウンドで実行されます。

    また、bashマニュアルからの上記の2番目の引用は、コマンド置換とバックグラウンドコマンドの両方がサブシェルで呼び出されることを示しています。

  2. 答えはノーかもしれません、なぜなら

    • Bashマニュアルでは、bashマニュアルからの上記の2番目の引用でプロセス置換が言及されていることはわかりませんでした。

    • そして いくつかのソース はプロセス置換を言います

      パイプラインによって引き起こされるサブシェルをバイパスするために特に重要です

      「サブシェルをバイパスする」とは、サブシェルで呼び出されないことを意味するかどうかはわかりませんが。

1
Tim

strace(1)の下で現在のシェルを実行してから、たとえば<(command)は以下を提供します:

 clone(child_stack = 0、flags = CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | SIGCHLD、child_tidptr = 0x7fa6713d59d0)= 13305 

clone(2) は次のように定義されているため、純粋に定義の観点から

子プロセスを作成する

および サブシェル as

シェルスクリプトを実行すると、新しいプロセスであるサブシェルが起動します。

はいと言うことができます-実行中のプロセス置換はサブシェルとして呼び出されます。

3
ckujau