У меня есть тема bash, в которой лениво отображаются различные части приглашения.Таким образом, он отображает набор информации в начале, а затем информацию о отложенной загрузке, которая требует времени для загрузки и перезаписи приглашения от фонового процесса.
Теперь, поскольку рендеринг отложенной загрузки является асинхронным, если вы отойдете оттекущий рабочий каталог в другой, в то время как асинхронная часть не была обработана, мы получим неверную информацию в неправильном месте.Пример:
Функция асинхронного рендеринга вызывается:
# Check the async side of the prompt if available
set +m
_render_async &
Теперь, чтобы этого не произошло, я добавилперед тем как отобразить подсказку, проверьте, есть ли у меня какой-либо фоновый процесс, который ожидает рендеринга той асинхронной стороны, которая не находится в текущем каталоге, и уничтожьте ее.
# Check and kill any irreelvant background jobs
# Outdated background jobs are any gaudi::async_render executed on folders
# other than the current working directory $PWD
export PROMPT_COMMAND="gaudi::kill_outdated_asyncRender; $PROMPT_COMMAND"
# Kill all background gaudi::render_async that are running in the wrong context
# Wrong context is any directory (CWD) that is not the current directory
# USAGE:
# gaudi::kill_outdated_asyncRender
gaudi::kill_outdated_asyncRender() {
joblist="$(jobs | grep '_render_async.*wd:' | cut -d "[" -f2 | cut -d "]" -f1 | tr '\n' ' ')"
IFS=' '
for job in $joblist; do kill "%$job"; done
}
Теперь это работает отлично, и я не вижунеправильный рендеринг, но я заметил, что теперь завершение bash для функций испорчено, и элементы не отображаются так, как они предназначены:
Как вы можете видеть, элементы завершения находятся не в одной строке, а просто разбиты.Удаление kill_outdated_asyncRender
исправляет это поведение, но я все еще не уверен, почему это происходит.