これをプロセス代替と呼びます。
<(list)
構文は両方でサポートされています bash
と zsh
.コマンドの出力を渡す方法を提供します (list
) パイプ (|
を使用する場合) を別のコマンドに ) 不可能です。たとえば、コマンドが STDIN
からの入力をサポートしていない場合 または、複数のコマンドの出力が必要です:
diff <(ls dirA) <(ls dirB)
<(list)
list
の出力を接続します /dev/fd
のファイルで 、システムでサポートされている場合、それ以外の場合は名前付きパイプ (FIFO) が使用されます (これもシステムによるサポートに依存します。両方のメカニズムがサポートされていない場合に何が起こるかはマニュアルにも記載されていません。おそらくエラーで中止されます)。次に、ファイルの名前がコマンド ラインの引数として渡されます。
zsh
追加で =(list)
をサポート <(list)
の可能な限りの置き換え . =(list)
で /dev/fd
の file の代わりに一時ファイルが使用されます またはFIFO。 <(list)
の代わりとして使用できます プログラムが出力を lseek する必要がある場合。
ZSH のマニュアルによると、<(list)
の方法には他にも問題がある可能性があります。 作品:
=
/dev/fd
<(...)
の名前付きパイプの実装 欠点があります。前者の場合、一部のプログラムは、コマンド ラインでファイルを調べる前に、問題のファイル記述子を自動的に閉じることがあります。特に、プログラムが setuid を実行している場合など、セキュリティ上の理由でこれが必要な場合です。 2 番目のケースでは、プログラムが実際にファイルを開かない場合、パイプからの読み取りまたはパイプへの書き込みを試行するサブシェルは (典型的な実装では、異なるオペレーティング システムは異なる動作をする可能性があります) 永久にブロックされ、明示的に強制終了する必要があります。 .どちらの場合も、シェルは実際にはパイプを使用して情報を提供するため、lseek を期待するプログラム (man ページ lseek(2)
を参照) ) は機能しません。
これは zsh ではなく bash の回答であることに注意してください。
パイプを使用できない bash のケースがあります:
some_command | some_other_command
パイプはパイプラインの各コンポーネントにサブシェルを導入するため、サブシェルが終了すると、依存していた副作用がなくなります。たとえば、この不自然な例:
cat file | while read line; do ((count++)); done
echo $count
$count
であるため、空白行が表示されます。 変数は現在のシェルに存在しません。
bash プロセス置換を使用すると、ファイルから読み取るように「some_command」出力から読み取ることができるため、この難問を回避できます
while read line; do ((count++)); done < <(cat file)
# ....................................1.2
echo $count # the variable *does* exist in the current shell
(1) は通常の入力リダイレクトです。 (2) は <()
の始まりです 置換構文を処理します。