Вопрос или проблема
Каждый раз, когда я открываю командный терминал или нажимаю Enter, возникает вышеуказанное сообщение об ошибке. Оно не причиняет вреда, но очень раздражает.
~/.bash_profile находится здесь
# .bash_profile
# Получаем алиасы и функции
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# Пользовательская среда и программы запуска
Это область, которая вызывает ошибку в /etc/bashrc
if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then
PROMPT_COMMAND="__vte_prompt_command"
else
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
fi
Если я добавляю эту строку в ~/.bashrc, проблема решается
source /etc/profile.d/vte.sh
Очевидно, что _vte_prompt_command определен только в vte.sh
__vte_prompt_command() {
local command=$(HISTTIMEFORMAT= history 1 | sed 's/^ *[0-9]\+ *//')
command="${command//;/ }"
local pwd='~'
[ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/}
printf "\033]777;notify;Command completed;%s\007\033]0;%s@%s:%s\007%s" "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)"
}
Что эта команда на самом деле делает? Разве эти /etc/profile.d/*.sh не загружаются при запуске? Может кто-то объяснить, почему это ведет себя таким образом?
Из изменения версии gnome-terminal 3.7.0:
Чтобы новые вкладки, открываемые в терминале, имели тот же рабочий каталог, что и текущая вкладка, необходимо, чтобы оболочка, работающая в терминале, сотрудничала. Для этого vte устанавливает скрипт оболочки bash, который вы должны использовать в вашем bash PS1 приглашении. (…)
Я прочитал это на https://bugzilla.redhat.com/show_bug.cgi?id=924275, когда искал такой же вопрос
Ответ или решение
Ошибка bash: __vte_prompt_command: command not found
возникает в терминале, когда оболочка Bash не может найти функцию __vte_prompt_command
, которая необходима для настройки командного вывода в терминалах, использующих библиотеку VTE (Virtual Terminal Emulator). Давайте разберёмся в причинах возникновения этой проблемы и способах её устранения.
Причины возникновения
-
Отсутствие загрузки скриптов: Функция
__vte_prompt_command
определена в файле/etc/profile.d/vte.sh
, который, как предполагается, должен загружаться при запуске оболочки. Однако, не все конфигурации и среды автоматически загружают все скрипты в этой директории. -
Неверная конфигурация Bash: В вашем файле
~/.bash_profile
выполняется загрузка~/.bashrc
(если он существует), но, как видно из предоставленного кода, сам файл~/.bashrc
не содержит команд для запуска скриптов из/etc/profile.d/
. -
Необходимость условий для использования: В конфигурационном файле
/etc/bashrc
есть проверка на существование переменнойVTE_VERSION
, которая должна быть большей или равной 3405, чтобы корректно использовать__vte_prompt_command
. Если переменная не установлена или соответствует более низкому значению, возникнет ошибка.
Решение проблемы
Наиболее простое и эффективное решение, как вы уже отметили, заключается в добавлении следующей строки в ваш файл ~/.bashrc
:
source /etc/profile.d/vte.sh
Это обеспечит загрузку скрипта vte.sh
при каждом запуске оболочки, что, в свою очередь, позволит правильно определять функцию __vte_prompt_command
.
Пояснение работы функции
Функция __vte_prompt_command
в основном отвечает за обновление заголовка терминала и поддержку историй команд. Она делает несколько вещей:
- Запрашивает последнюю выполненную команду из истории.
- Форматирует вывод, чтобы отображать имя пользователя, имя хоста и текущую директорию в заголовке терминала.
- Уведомляет о завершении команды с помощью специальных ANSI управляющих последовательностей.
Элементы, которые могли бы оказаться полезными при работе с оболочкой и лучше понять, как работает ваше окружение, включают:
- Функции и показ их наличия:
declare -F
может помочь вам проверить, загружена ли функция. - Вывод информации об окружении:
env
илиprintenv
даст представление о текущих переменных среды.
Причины поведения загрузки скриптов
Скрипты в директории /etc/profile.d/
обычно загружаются при запуске интерактивной оболочки, но их загрузка может зависеть от конфигурации системы и оболочки, например, если ~/.bashrc
явно не содержит строк для их загрузки. Убедитесь, что у вас правильные права доступа и конфигурация для файлов.
Заключение
Устранение ошибки bash: __vte_prompt_command: command not found
требует простого добавления команды в ~/.bashrc
, что подтянет необходимые функции и уберет сообщение об ошибке. Экспериментируйте с настройками своего окружения, чтобы улучшить его функциональность и удобство.