名前付きパイプで1行ずつ読み込んで終了する方法は?

名前付きパイプで1行ずつ読み込んで終了する方法は?

難読化されたファイルオープナーとして使用したい次のbashスクリプトがあります。 fifoを生成し、fzfを実行する新しい端末を作成し、fzfの出力をfifoにリダイレクトします。次に、fifoから読み込み、ファイルを開く関数を呼び出します。

私の問題は、関数内のwhileループがopen終わらないことです。すべての行を読んだ後にFIFOを閉じる方法は?

#!/usr/bin/env bash

FIFO=/tmp/fuzzy-opener
[ -e "$FIFO" ] || mkfifo "$FIFO"
exec 3<> "$FIFO"

function open {
  while read file; do
    # open every $file based on its mime-type
  done <&3
  echo 'done' # this is never reached
}

alacritty -e sh -c "fzf -m >&3" \
  && open

ベストアンサー1

read()書き込みの終わりが閉じると、パイプにEOFが表示されます(0バイトの読み取りから返されます)。しかし、私の考えでは、<>パイプは読み取り/書き込みモードで開かれているので、パイプには常に作成者があり、シェルはファイルハンドルを開いたままにしておくことです。

私はシェルでパイプを開くことをスキップして、次のことができるはずだと思います。

alacritty -e sh -c "fzf -m >$FIFO" && open < "$FIFO"

または、より適切には次のようになります。

alacritty -e sh -c 'fzf -m >"$1"' sh "$FIFO" && open < "$FIFO"

ここでは、質問の構成が異なる動作をしていると仮定します。敏捷性がバックグラウンドで端末を作成し、すぐに終了する場合は、そうする必要があります。そうでない場合は、alacritty -e sh ... & open < "$FIFO"2つの部分を同時に実行する必要があります。

おすすめ記事