내 사용 사례는 파일 시스템을 마운트하는 다른 스크립트를 사용하는 yad 프로그램입니다. 내가 현재 하고 있는 일과 다소 불만족스러운 일은 복잡한 kill and wait를 통해 yad에서 사용할 수 있는 반환 값을 "시뮬레이트"하는 것입니다.
(마운트 스크립트는 코드 조각 위에 있으며 관련이 없습니다. 종료 또는 다시 마운트 시 "FD"(SEL_FD 아님)에 쓰기를 보냅니다. 아래 코드는 GAME_SEL 및 REMOUNTED에 따라 루프를 사용하거나 사용하지 않습니다.)
#stdout to FD (to get the selection on exit and still be a background proc)
GAME_SEL=$(mktemp -u -p "${XDG_RUNTIME_DIR}" "${0##*/}.XXXXXXXXXX")
mkfifo "$GAME_SEL"
exec {SEL_FD}<> "$GAME_SEL"
yad \
--width=600 \
--height=660 \
--center \
--window-icon "applications-games" \
--title "Dosbox Launcher with games overlay" \
--text=" Click to play" \
--list \
--noheaders \
--search-column=2 \
--regex-search \
--column="Path:HD" \
--column="Game Config:TEXT" \
--button=gtk-close:1 \
--button=gtk-ok:0 \
"${CONF_LIST[@]}" \
2>/dev/null 1>& "$SEL_FD" &
yad_pid=$!
#wait for copy-on-write-drive notification (quit or mount doesn't matter)
#and kill the dialog using yad signal for graceful failure termination
( read -u "$FD"; kill -USR2 $yad_pid ) &
pidof_killer=$!
#wait for yad termination and read its stdout on a timeout. If triggers timeout, it's empty
wait $yad_pid 2>/dev/null
read -t 0.1 -u "$SEL_FD" GAME
exec {SEL_FD}>&- #close FD
#kill the killer if still active
kill $pidof_killer 2>/dev/null
wait $pidof_killer 2>/dev/null #supresses 'Terminated' output too
#if the killer was already dead (it caught a notification), this is 0, otherwise != 0
REMOUNTED=$?
내가 이해하는 바에 따르면, 마운트 스크립트 FD 알림에 대한 응답으로 yad 프로세스를 종료할 수 있도록 백그라운드에 yad 프로세스를 배치해야 하기 때문에 이러한 복잡성이 필요합니다. 이로 인해 yad의 반환 값(stdout 대신)이 SEL_FD가 됩니다. 캡처)는 기본 스크립트 프로세스에서 캡처할 수 없습니다. 이 논리를 구현하는 더 좋은 방법이 있습니까? 너무 복잡한 것 같아요.