
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
이렇게 하면 서브셸 내부와 외부 모두에서 문제가 해결됩니다.