차단하지 않고 "xdg-open"을 통해 서브셸에서 프로그램 실행

차단하지 않고 "xdg-open"을 통해 서브셸에서 프로그램 실행

xdg-open서브셸에서 호출하면 시작된 프로세스가 닫힐 때까지 안정적으로 차단된다는 것을 확인했습니다 . 이에 대한 이유가 있을 것으로 생각되지만 이유는 확실하지 않습니다. 예를 들어 xdg-open명령줄에서 직접 호출하면 Nautilus 시작이 차단되지 않습니다.

xdg-open ~/dir ; echo foo              # doesn't block

그러나 서브쉘에서 xdg-open을 호출하면 터미널이 안정적으로 차단됩니다.

var=$(xdg-open ~/dir ; echo foo)       # blocks

{ xdg-open ~/dir ; echo foo ; } | cat  # blocks.

내 이해는 xdg-open시작된 프로세스를 쉘 세션에서 분리하여 더 이상 하위 프로세스가 아니라는 것입니다. 따라서 이는 서브셸 내에서 호출하는 것과 다를 것으로 예상됩니다. sleep 1 &이 경우 서브셸을 종료하면 모든 하위 프로세스가 완료될 때까지 차단되는 것이 합리적입니다.

var=$(sleep 1 & echo foo)      # also blocks, but understandable.

그러나 xdg-open프로세스가 분리되는 경우 서브쉘이 대기하는 원인은 무엇입니까?

(?)가 대답의 일부일 수 있는 것에서 나는 실행 중이라는 것을 알았습니다.

{ xdg-open <file> ; ps ; } | cat

시작된 프로그램을 기반으로 <file>차단된 프로그램은 제어 터미널로 tty가 있는 프로그램이기도 함을 보여줍니다. 이는 왜 이런 일이 발생하는지, 왜 서브셸에서만 발생하는지, 그리고 궁극적으로 터미널에서 데스크톱 프로세스를 시작하고 완전히 안정적으로 분리하는 좋은 방법은 무엇일까 하는 질문을 불러일으킵니다.

편집 : 수정되었습니다 bash.

답변1

먼저 귀하의 예에서

var=$(sleep 1 & ; echo foo)

이미 줄 끝으로 사용되었으므로 bash작동 해서는 안 됩니다 . (-bash: 명령 대체: 1행: 예상치 못한 마커 ";" 근처에 구문 오류가 있습니다.)&


노력하다

var=$(sleep 1 & echo foo) # no ';' !!

(에코 $var: foo)

내 이해로는 간단하다.

xdg-open <something> & # optional: echo foo

이렇게 하면 서브셸 내부와 외부 모두에서 문제가 해결됩니다.

관련 정보