インタラクティブコンソールでを押してZenityウィンドウを^C
閉じます。スクリプトでのみ使用zenity --info & fg
できます。zenity --info & wait
ただし、^C
この場合、Zenityウィンドウは閉じません。もっと仕事wait
のように振る舞う方法はありますか?fg
^C
ベストアンサー1
あなたができる最も簡単なことは、ハンドラSIGINT
でバックグラウンドプロセスをキャッチして(^ C)殺すことです:
#! /bin/sh
trap 'kill "$!"; exit 1' INT QUIT
zenity --info &
wait
一部のシェルでスクリプトを呼び出す場合、たとえばbash
いわゆる「待って協力していきましょう」(望むよりここ議論のために)シグナルを受信した後にプログラムが完全にシャットダウンされると予想される方法は、ハンドラーをリセットしてから同じシグナルでセルフシャットダウンすることです。
#! /bin/sh
termsig(){ trap - "$1"; kill "$!"; kill -s "$1" "$$"; }
trap 'termsig INT' INT
trap 'termsig QUIT' QUIT
zenity --info &
wait
もちろん、これらすべては非常に粗雑であり、それ自体が生成できるサブプロセスでzenity
は何もしません。複数のバックグラウンドプロセスに合わせて調整する必要があります。より確実な解決策は(trap - INT; zenity --info) &
次のとおりです。いいえ/bin/sh
Debian派生ディストリビューション(Ubuntuなど)またはbusyboxベースのシステムで動作します。
SIGINT
別の解決策は、設定をデフォルト値にリセットできるラッパーを介してプログラムを実行することです。そしてperl
:
#! /bin/sh
perl -e '$SIG{INT} = $SIG{QUIT} = "DEFAULT"; exec @ARGV' zenity --info &
wait
perl
ただし、そうすることで、またはpython
;-)を使用してスクリプト全体を再構築することもできます。