プロセス置換のユースケースの理解が不足しているようです。私の直感は、プロセス置換形式が<(COMMANDS)
実行され、プログラムCOMMANDS
の結果がそれが属するコマンドに供給されるため、結果が評価され、最初のcommand1 <(command2)
引数command2
として渡されることですcommand1
。
私は次のことがうまくいくと思います。
$ for i in <(cat list.txt); do echo $i; done
list.txt
単語リスト(改行区切り)を含むファイルはどこにありますか?これを実行すると、/dev/fd/63
プロセスの交換時に生成されたサブシェルの出力への一時パス名と同じであると仮定できるもののみが出力されます。
私は文章を書くとうまくいったので、上記の内容がうまくいくと思いました。
$ for i in `cat list.txt`; do echo $i; done
このシンボルを見たことはありません。この記号`
は何を意味しますか?プロセスの置き換えについてどのような理解が欠けていますか?
答え1
`foo`
はいコマンドの置き換え、プロセス置換ではなく。$(foo)
また、コマンド置換であり、ネストされたコマンド置換を使用する方が簡単なので、好ましい形式です$(foo1 $(foo2 $(foo3 ...)))
。
`foo`
/をコマンドに置き換えると、$(foo)
の出力がfoo
コマンドラインの単語として使用されます。だからfor i in $(echo a b c)
あなたがそれを使ったのと同じですfor i in a b c
。まず、コマンドオーバーライドでコマンドを実行し、出力を取得し、次に出力を使用して次のコマンドラインを作成し、そのコマンドラインを実行するなどの操作を実行します。これにより、コマンドまたは関数を使用してforループによって繰り返されるリストを生成できます。フィールド分割、ワイルドカード拡張などがすべて発生するため、引用はコマンドの置き換えで重要な考慮事項です。
そしてプロセスの交換、<(foo)
/ >(foo)
、プロセスのstdin / stdoutがファイルとして提供されるため、andをcat <(foo)
使用したのと同じ、andを使用したのと同じです。これらのコマンドは同時に実行されます。シェルは出力を表示できないため、フィールド分割とワイルドカード拡張は問題になりません。foo > /some/file
cat /some/file
tee >(foo)
tee /some/file
foo < /some/file