Dashでプロセス交換をシミュレートする方法は?

Dashでプロセス交換をシミュレートする方法は?

bashプロセス置換を使用し、プロセスの出力をディスクに保存されているファイルとして処理できます。

$ echo <(ls)
/dev/fd/63

$ ls -lAhF <(ls)
lr-x------ 1 root root 64 Sep 17 12:55 /dev/fd/63 -> pipe:[1652825]

残念ながら、dash

Process Substitutionダッシュでシミュレーションする最良の方法は何ですか?

/tmp/出力を一時ファイル()に保存してから削除したくありません。別の方法がありますか?

ベストアンサー1

パイプラインを手動で実行して、シェルが内部的に実行する操作を再現できます。システムにエントリがある場合は、ファイル記述子の混合を使用できます。翻訳できます。/dev/fd/NNN

main_command <(produce_arg1) <(produce_arg2) >(consume_arg3) >(consume_arg4)

到着

{ produce_arg1 |
  { produce_arg2 |
    { main_command /dev/fd5 /dev/fd6 /dev/fd3 /dev/fd4 </dev/fd/8 >/dev/fd/9; } 5<&0 3>&1 |
    consume_arg3; } 6<&0 4>&1; |
  consume_arg4; } 8<&0 9>&1

複数の入力と出力を説明するより複雑な例を紹介します。標準入力から読み取る必要がなく、プロセス置換を使用する唯一の理由は、コマンドに明示的なファイル名が必要なことである場合は、単に以下を使用できます/dev/stdin

main_command <(produce_arg1)
produce_arg1 | main_command /dev/stdin

それ以外の場合は使用する必要があります。/dev/fd/NNN名前付きパイプ。名前付きパイプはディレクトリエントリなので、どこかに一時ファイルを作成する必要がありますが、そのファイルは名前にすぎず、データは含まれていません。

tmp=$(mktemp -d)
mkfifo "$tmp/f1" "$tmp/f2" "$tmp/f3" "$tmp/f4"
produce_arg1 >"$tmp/f1" &
produce_arg2 >"$tmp/f2" &
consume_arg3 <"$tmp/f3" &
consume_arg4 <"$tmp/f4" &
main_command "$tmp/f1" "$tmp/f2" "$tmp/f3" "$tmp/f4"
rm -r "$tmp"

おすすめ記事