ジョブがバックグラウンドにある場合にZshが終了しないようにする

ジョブがバックグラウンドにある場合にZshが終了しないようにする

で以下man zshを見ることができます。

[...]もう一度終了しようとすると、シェルは再び警告しません。このオプションを設定するSIGHUPと、HUP保留中のジョブが終了し、実行中のジョブにシグナルが表示されます。

zshジョブがバックグラウンドで実行されている場合、そのジョブが終了するのを防ぐ方法はありますか?

ベストアンサー1

ソースコードを見ると直接的な方法はないようです。バックグラウンドジョブの確認は次のとおりです。zexit、デフォルトのzshプロセスがfrom exit、from logout、ファイルの終わり、またはさまざまな状況で終了を試みることを決定したときに呼び出されます。終了コマンドをキャンセルするにはstopmsg0でなければなりません。stopmsg2「(実行中|一時停止|中止)ジョブがあります」という警告が表示された後。唯一の方法stopmsgはドアを閉めるだけです。コマンド実行の準備(空でないコマンドラインから)二重。したがって、を実行すると、exit次に入力するコマンドはシャットダウン保護されません。

exit後でリセットするために、no-opコマンドを偽造できる組み込み関数に接続する方法(または関数などに置き換える方法)は思い出されませんstopmsg

組み込み機能を無効にしexitたり、タスクがあるかどうかを確認する機能に置き換えることができます。

function exit {
  emulate -L zsh
  setopt extended_glob
  if [[ -n ${jobstates[(r)s*]} ]]; then
    echo "you have suspended jobs"
    return 1
  fi
  if [[ -n ${jobstates[(r)^done:*]} ]]; then
    echo "you have running jobs"
    return 1
  fi
  builtin exit "$@"
}

exitただし、これは他の方法ではなく、これにのみ機能します。

ファイルの終わりには、次のことができますsetopt ignore_eof

おすすめ記事