Функция перегрузки exit()
не подходит для сценария ^D
. Итак, давайте поговорим о trap
.
В вашем предложении else
должны быть некоторые вещи, которые могут либо удерживать bash, либо игнорировать сигнал выхода. Я тоже не знаю, как это сделать.
Но сейчас, как вариант, я думаю, вы можете повторно -открыть bash.
Если вы замените пункт else
этим:
echo
history -a
bash
И затем, если вы отмените выход в командной строке, будет повторно -открыт новый bash, и он будет выглядеть так, как будто ничего не произошло, как и в старом.
У этого подхода есть недостаток: вы потеряете присвоения переменных, которые вводили ранее, возможно, мы сможем над этим поработать. Но если вас это устраивает, то это оно.
В любом случае вы можете изменить этот код в соответствии с вашими потребностями.
Похоже на добросовестную -ошибку...
Проверьте с последним ядром из вашего дистрибутива и сообщите об этом со всеми подробностями (прикрепите тестовую программу! ).
pivot_root(new_root, put_old)
перемещает старый корневой каталог вызывающего процесса (, который должен быть корнем монтирования ), в put_old
и помещает new_root
на его место. Затем он устанавливает текущий каталог и корень каждого процесса, который был установлен в старом корневом каталоге, равным new_root
.
Итак, после pivot_root(".", ".")
новый корневой каталог смонтирован поверх старого корневого каталога.
Всякий раз, когда ..
разрешается в каталог, к которому смонтирован другой каталог, он фактически разрешается в каталог, смонтированный поверх него. Это соответствует историческому поведению Unix и Linux, где ..
, за исключением корневого каталога файловой системы, не имел специальной обработки при обходе пути и был реализован записью каталога, хранящейся на диске.
Это не экранирование пространства имен монтирования.