典型的なシナリオ:
一時的に、仮想ホストによってアクセスがブロックされているファイルにアクセスする必要があります。vim を起動し、設定を編集して、バックグラウンド vim で Apache に設定を再読み込みするように指示します。
問題:
これを忘れると、セッションを CTRL+D したときに、シェルから「停止したジョブがあります」というメッセージが表示されます。ただし、ssh、tmux などのため、シェルの中にシェルを入れる習慣があるため、作業を終えてウィンドウを閉じるときに、EOF を頻繁に繰り返し送信します。その結果、警告にもかかわらず、シェルを誤って終了させてしまいます。
このようなシェルを殺しにくくすることはできますか?
答え1
を使用している場合はbash
、シェル変数に、EOF を終了信号として扱う前にシェルが無視する連続する EOF 文字の数を指定する数値を設定できますIGNOREEOF
。詳細については、man ページを確認してください。
ただし、これは「停止されたジョブがあります」というメッセージがトリガーされる前にトリガーされるため、同じ問題が依然として発生します。つまり、そのメッセージが表示され、さらに ^D を 1 回押すとシェルが終了します。
別の方法としては、シェル ジョブの数が 0 より大きい場合に、その数をプロンプトに入力する方法があります。
たとえば、私の .bashrc からの抜粋:
PROMPT_COMMAND=prompt_command
prompt_command() {
job_count=$(jobs | wc -l)
if [ $job_count -gt 0 ] ; then
prompt_job="[$job_count] "
else
prompt_job=""
fi
}
PS1="...\${prompt_job}..."
この後、シェルは次のようになります...[1] ...
ジョブ数が 0 より大きい場合は、プロンプトにジョブ数が表示されます。これにより、未完了のジョブがあるかどうかが簡単にわかり、ジョブがまだ実行中であることを視覚的に知らせる手段として (私にとっては) 有効です。
答え2
前回の回答に基づいて、私はこれを思いつきました
PROMPT_COMMAND=protect_bg_jobs
protect_bg_jobs()
{
if [ "$(jobs)" == "" ]; then
set +o ignoreeof
else
set -o ignoreeof
fi
}
「停止ジョブがあります」というメッセージは非表示になりますが、vim バッファは保存されます。