難読化されたファイルオープナーとして使用したい次の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つの部分を同時に実行する必要があります。