Bash:コマンド置換を使用した貼り付けコマンドとFIFO FDの違い

Bash:コマンド置換を使用した貼り付けコマンドとFIFO FDの違い

貼り付けコマンドで複数のFIFO FDを使用するときに「壊れたパイプ」の状況が発生する理由を理解しようとしていますが、コマンド置換を使用するとすべてが問題ありません。

いくつかの背景知識:かなり大きな配列を処理し、特定の値を探し、最終的にユーザーが望む一連のタスクを完了する必要があります。この大規模なデータセットの場合、速度は非常に重要です。これまで私が考えたことは、単に配列(下付き文字と値の両方がユーザーの操作で使用されるため、並列に)を印刷し、各配列項目を処理できるように互いに貼り付けることです。 「ユーザーは主にパイプライン(ユーザー操作)によって承認されます。

しかし、最初の列(配列の下付き文字)の貼り付けコマンドが成功しなかったことがわかりました。

以下は非常に単純化されたコマンドの例です(create_tmp_fifoは非常に単純な操作を実行します。パイプの「cat」はユーザー操作の抽象的な例です)。

fifo_pasteOutput=$(create_tmp_fifo) fifo_subscriptPrint=$(create_tmp_fifo) fifo_valuePrint=$(create_tmp_fifo);
printf '%s\n' "${!DATA_SET[@]}" >$fifo_subscriptPrint &
printf '%s\n' "${DATA_SET[@]}" >$fifo_valuePrint &
paste -d'|' <$fifo_subscriptPrint <$fifo_valuePrint | cat;
printf '\n';
rm $fifo_subscriptPrint $fifo_valuePrint $fifo_pasteOutput

出力:

[1] 117250
[2] 117251
#0,SYS[offset=0,ceiling=10]
#1,MSG[offset=11,ceiling=20]
#2,MISC[offset=21,ceiling=50]
[1]-  Broken pipe             printf '%s\n' "${!DATA_SET[@]}" > $fifo_subscriptPrint
[2]+  Done                    printf '%s\n' "${DATA_SET[@]}" > $fifo_valuePrint

最初のプロセスに「壊れたパイプ」が表示されるのはなぜですか?私がするなら:

paste -d'|' <(printf '%s\n' "${!DATA_SET[@]}") <(printf '%s\n' "${DATA_SET[@]}")

すべてが期待どおりに動作します。 Bashのマニュアルを読んで、プロセスの置き換えは、基本的に指定されたFIFOファイルで実行する作業と同じであることを理解しました。私が何かを間違って理解したのでしょうか?混乱しています。

ユーザーの使用のために配列を印刷する機能は、さまざまな方法で出力形式を指定するさまざまなオプションを使用するため、貼り付けコマンドでプロセスの置き換えを避けることをお勧めします。そのため、貼り付けコマンドのさまざまなバリアント数をそれぞれ減らそうとしています。

どんな洞察力にもよろしくお願いします。

ベストアンサー1

私自身が愚かに感じる。すでに答えを見つけました。

paste -d'|' $fifo_subscriptPrint $fifo_valuePrint

最後に、コマンドを見て、引数がファイル自体であるかどうか疑問に思います。とにかく、お時間をいただきありがとうございます。

おすすめ記事