대화형으로 파일을 요청하고 GUI 프로그램을 사용하여 파일을 열기 위해 터미널을 열려고 합니다.
foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &)'
그렇지 않으면 터미널이 종료될 때 setsid
터미널을 삭제하기 때문에 사용하고 있습니다 . xdg-open
그러나 위 명령은 작동하지 않습니다. 화면에 아무 것도 표시하지 않고 계속 종료됩니다. 그런데 sleep
마지막에 하나 추가 하면하다일하다:
foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &); sleep 0.0000000001'
터미널은 종료되지만 시작된 프로세스는 xdg-open
계속 실행 중입니다.
여기서 무슨 일이 일어나고 있는 걸까요? 잠을 피하는 더 깔끔한 방법이 있습니까? (정확한 잠의 타이밍은 시스템에 따라 다르다고 가정하기 때문입니다.)
을 사용해 보았 disown
으나 전혀 작동하지 않습니다(작동하더라도 sleep
).
답변1
백스테이지 과정:
- 터미널에서 분리(
setsid
); - 달리다
xdg-open
.
1단계가 완료되기 전에 터미널이 사라지면 프로세스 그룹 전체가 SIGHUP을 받고 종료된다. SIGHUP이 도착하는 것을 방지하지만 setsid
작업을 완료하기 전에 (또는 호출하는 서브셸)이 종료되면 xdg-open
도움이 되지 않습니다 .setsid
setsid
setsid
수정 사항은 포그라운드의 SIGHUP에서 분리하는 것입니다.
foot /bin/sh -c 'file=`fzf`; setsid sh -c "xdg-open \"\$1\" &" sh "$file"'
또 다른 해결책은 SIGHUP을 무시하는 것입니다.
foot /bin/sh -c 'file=`fzf`; trap "" SIGHUP; xdg-open "$file" &'