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