Типичный сценарий:
Мне временно нужно получить доступ к файлу, к которому мой vhost не позволяет мне получить доступ. Я запускаю vim, редактирую настройки и фоновый vim, чтобы сказать apache перезагрузить его конфигурацию.
Проблема:
Если я сейчас забуду об этом, моя оболочка скажет мне "There are stopped jobs", когда я нажму CTRL+D на сеанс. Однако, поскольку у меня есть привычка иметь оболочки в оболочках в оболочках из-за ssh, tmux и подобных, я также часто повторно отправляю EOF, когда завершаю свою работу и закрываю окна. Это, в свою очередь, заставляет меня случайно завершить оболочку, несмотря на предупреждение.
Можно ли сделать так, чтобы такие снаряды было сложнее уничтожить?
решение1
Если вы используете bash
, вы можете установить IGNOREEOF
переменную оболочки на число, которое указывает, сколько последовательных символов EOF оболочка должна игнорировать, прежде чем рассматривать EOF как сигнал выхода. Проверьте страницу руководства для получения подробностей.
Однако это срабатывает до того, как появляется сообщение «есть остановленные задания», поэтому проблема остается прежней — вы получаете это сообщение, и еще один ^D завершает работу оболочки.
Альтернативой является указание количества заданий оболочки в командной строке, если это число больше нуля.
Например, отрывок из моего .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.