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 라인을 작성하는 것을 좋아한다는 것입니다.

관련 정보