Проблема решена! Я играл с perf trace
и по мере того, как прокручивались строки и строки вывода, я мельком увидел несколько странных вызовов libnotify из Konsole, моего терминала по умолчанию. Это казалось странным, так как после переформатирования у меня больше не было установленного демона уведомлений на рабочем столе (. Я использую i3, которого нет в комплекте, видите ли ). Это натолкнуло меня на мысль попробовать другой эмулятор терминала. Итак, я попробовал urxvt
и, о чудо, проблема исчезла. Я также пробовал с gnome-terminal
и никаких проблем! Может быть, тогда Konsole пыталась запустить уведомление на рабочем столе через dbus/systemd, но время истекло, потому что не был установлен демон libnotify для ответа на запрос? Итак, я установил dunst
, который является демоном, который я использовал до обновления, и, как я и подозревал, медлительность автозаполнения в Konsole исчезла!
Так что я понятия не имею, что, черт возьми, Konsole пытается сделать, когда вызывается автозаполнение, потому что я никогда не вижу никаких всплывающих уведомлений, даже после установки демона, но, во всяком случае, проблема теперь исправлена.
Думаю, я отнесу этот вопрос команде KDE и узнаю, что они думают, потому что, несмотря на то, что это отчасти моя вина в том, что не был установлен демон уведомлений, другие терминалы, которые я пробовал, прекрасно справились с проблемой..
В любом случае, спасибо всем за помощь!
Последовательность <ESC>]0;
(, показанная как \33]0;
с помощью strace ), является escape-последовательностью для установки заголовка окна терминала. Он заканчивается символом BEL (\7
), поэтому первый write
устанавливает заголовок окна. Второй печатает фактическую подсказку. Обратите внимание, что даже если не считать escape-последовательности, они не совсем одинаковы. Подсказка окружена [..]
, а заголовок окна — нет.
Мы также можем видеть, что первая запись идет на stdout (fd 1, первый аргумент — на write()
), а второй — на stderr. Bash печатает приглашение в stderr, поэтому первая запись происходит откуда-то еще. Это где-то, вероятно, PROMPT_COMMAND
, как в сценариях запуска Debian по умолчанию для Bash. Там есть что-то подобное:
case "$TERM" in
xterm*|rxvt*)
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
;;
*)
;;
esac
Он устанавливает, что PROMPT_COMMAND
при работе xterm
или rxvt
, которые должны поддерживать эту управляющую последовательность.