ブロックせずに「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

これにより、サブシェルの内側と外側の両方で問題が解決されます。

おすすめ記事