Bash пытается написать две подсказки оболочки?

Проблема решена! Я играл с perf traceи по мере того, как прокручивались строки и строки вывода, я мельком увидел несколько странных вызовов libnotify из Konsole, моего терминала по умолчанию. Это казалось странным, так как после переформатирования у меня больше не было установленного демона уведомлений на рабочем столе (. Я использую i3, которого нет в комплекте, видите ли ). Это натолкнуло меня на мысль попробовать другой эмулятор терминала. Итак, я попробовал urxvtи, о чудо, проблема исчезла. Я также пробовал с gnome-terminalи никаких проблем! Может быть, тогда Konsole пыталась запустить уведомление на рабочем столе через dbus/systemd, но время истекло, потому что не был установлен демон libnotify для ответа на запрос? Итак, я установил dunst, который является демоном, который я использовал до обновления, и, как я и подозревал, медлительность автозаполнения в Konsole исчезла!

Так что я понятия не имею, что, черт возьми, Konsole пытается сделать, когда вызывается автозаполнение, потому что я никогда не вижу никаких всплывающих уведомлений, даже после установки демона, но, во всяком случае, проблема теперь исправлена.

Думаю, я отнесу этот вопрос команде KDE и узнаю, что они думают, потому что, несмотря на то, что это отчасти моя вина в том, что не был установлен демон уведомлений, другие терминалы, которые я пробовал, прекрасно справились с проблемой..

В любом случае, спасибо всем за помощь!

11
15.09.2019, 23:18
1 ответ

Последовательность <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, которые должны поддерживать эту управляющую последовательность.

24
27.01.2020, 19:57

Теги

Похожие вопросы