Yadはフォークして結果を返します。

Yadはフォークして結果を返します。

私はyadプロセスを他のプロセス(インストールプログラムですがそれほど重要ではありません)と連携させようとしています。

重要なセクションには、次のコード構造(単純化)があります。 `

yad --list --button=gtk-close:1 --button=gtk-ok:0 "${CONF_LIST[@]}" 2>/dev/null &
yad_pid=$!
#3 is the file descriptor of the named pipe of the other process
{ read -u 3 line && kill -USR2 $yad_pid 2>/dev/null; } & pidof_killer=$!
wait $yad_pid
result=$?
kill $pidof_killer 2>/dev/null
#do something with result.

私の問題は(結果に加えて)必要な部分がリストの選択であるということです。以前はフォークでVAR=$(yad ...)yad終了コードでこれを得ることができましたが、今は待機後に基本プロセスに渡す方法がわかりません。

ベストアンサー1

終了コードは実際には必要ないことがわかりました。 yadは選択した行をstdoutとして印刷するため、プロセスが終了すると何も表示されないため、次のことを試しました。

SELPIPE=$(mktemp -u -p "${XDG_RUNTIME_DIR}" "${0##*/}.XXXXXXXXXX")
mkfifo "$SELPIPE"
exec 4<> "$SELPIPE"
yad ... 2>/dev/null 1>&4 &
yad_pid=$!

#wait for notification
( read -u 3 line && kill -USR2 $yad_pid ) 2>/dev/null &
pidof_killer=$!
#wait for yad termination and read its stdout on a timeout. If triggers timeout, it's empty
wait $yad_pid
read -u 4 -t 1 SEL
exec 4>&- #close FD4

kill $pidof_killer 2>/dev/null
#etc

それは動作します。ただ終了したプロセスが醜い$PID Termedラインを書くのが好きだということです。

おすすめ記事