端末外でプログラムを実行する

端末外でプログラムを実行する

対話的にファイルを要求し、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

バックステージコース:

  1. 端末から分離(setsid)。
  2. 走るxdg-open

ステップ1が完了する前に端末が消えた場合、プロセスグループ全体がSIGHUPを受けて終了します。 SIGHUPが到着するのを防ぎますが、setsid操作を完了する前(または呼び出すサブシェル)が終了してもxdg-open役に立ちません。setsidsetsidsetsid

修正は、前景の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" &'

関連情報