典型场景:
我暂时需要访问我的虚拟主机阻止我访问的文件。我启动 vim,编辑设置和后台 vim 以告诉 apache 重新加载其配置。
问题:
如果我现在忘记了这一点,当我按 CTRL+D 会话时,我的 shell 会告诉我“有已停止的作业”。然而,由于我有壳中壳中壳的习惯,由于 ssh、tmux 等类似的原因,当我结束工作并关闭窗口时,我也经常重复发送 EOF。这反过来又导致我不小心杀死了 shell,尽管有警告。
我可以增加杀死这些炮弹的难度吗?
答案1
如果使用bash
,则可以将IGNOREEOF
shell 变量设置为一个数字,该数字指定 shell 在将 EOF 视为退出信号之前应忽略多少个连续的 EOF 字符。检查手册页了解具体信息。
但是,它会在“有已停止的作业”消息触发之前触发,因此您仍然遇到相同的问题 - 您收到该消息,并且又一个 ^D 退出 shell。
另一种方法是,如果 shell 作业的数量大于零,则将其放入提示符中。
例如,我的 .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] ...
如果作业计数大于零,则会在提示中显示作业计数。这使得您可以很容易地看到何时有未完成的作业,并且(对我来说)效果很好,作为作业仍在运行的视觉提醒。
答案2
根据之前的答案我想出了这个
PROMPT_COMMAND=protect_bg_jobs
protect_bg_jobs()
{
if [ "$(jobs)" == "" ]; then
set +o ignoreeof
else
set -o ignoreeof
fi
}
它隐藏了“有停止作业”消息,但它会保存我的 vim 缓冲区。