このコマンドは非常にうまく機能します。
bash < <(echo 'ls')
このコードはどのように機能しますか?
このスクリプトの内部プロセスを理解できません。
<(anycmd)は、 anycmdの出力で一時ファイルを作成します
anycmd <は、その stdin が<の右側のファイルから供給されて anycmd を実行しています。
したがって、コマンドは次と同等です
tmpf=$(mktemp)
echo 'ls' > $tmpf
bash < $tmpf
unlink $tmpf
<(echo 'stuff')
プロセス置換と呼ばれます。名前付きパイプ (または FIFO) を使用して、コマンドからの出力をパイプします (ただし、正確なメカニズムはシステムによって異なります)。この構文は、ファイル名を使用できる場所ならどこでも使用できます*。
program < <(command)
commandから出力を取得し、それをprogramの標準入力ストリームに渡します。
*anywhere: 一部のプログラムでは、名前付きパイプでは使用できないメモリ マッピング(「参考文献」を参照)と呼ばれる手法が使用されます。man 2 mmap
適切に作成されたプログラムは、事前にファイルの種類をチェックしますが、残念ながら、すべてのプログラムが適切に作成されているわけではありません....
echo ls
生成しls
ます。<( ... )
それを含むファイルを作成します。<
このファイルを の標準入力に送り、bash
実行bash
させます。