Оболочка приглашения bash отображается по-разному в терминале и консоли tty

Это часть моего файла ~/.bashrc:

prompt(){
    local EXIT="$?"  # return code
    PS1=""
    local red="\[\033[0;31m\]"  # text colour
    local purple="\[\033[0;35m\]"  # text colour
    local normal="\[\033[0m\]"  # text colour

    if [ $EXIT == 0 ]; then  # $EXIT colour based upon its value
        local return="${normal}${?}"
    else
        local return="${red}${?}${normal}"
    fi

    PS1+="${normal}[${purple}\\D{%-l:%M%P}${normal}]${return} \\[\\e]0; \
    \\u@\\h: \\w\\a\\]${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ "
}

export PROMPT_COMMAND=prompt

Это моя командная оболочка в gnome-терминале (отображается правильно):

[5:01pm]0 user@host:~$

Но когда я переключаюсь на консоль tty, после того, как я вошел в систему, это отображается:

[5:05pm]0 ;user@host: ~user@host:~$

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


Версии ПО:

  • GNU bash, версия 4.3.11(1)-выпуск (i686-pc-linux-gnu),
  • Убунту Гном 14.04.

Некоторое объяснение значения PS1:

[5:01pm]   # current time
0          # return/exit code of the last command (0 can be any number;
           # if return code has a non-zero value, it turns red)

PS — В настоящее время в tty-консолях мне нужно source ~/.bashrc, чтобы иметь возможность использовать все мои настройки. (1) Где находится собственный .bashrc консоли tty? (2) Или как настроить его на использование ~/.bashrc?


Решение различного поведения приглашения

Как следует из принятого ответа, в переменной PS1 была часть, которую следует опустить, поэтому я просто изменил последнюю строку функции на

PS1+="${normal}[${purple}\\D{%-l:%M%P}${normal}]${return} \
${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ "

Решение Post Scriptum (PS)

консоли tty используют ~/.bashrc_profile вместо ~/.bashrc, потому что (как сказал @chepner в комментарии ниже) последний исходит от эмулятора терминала с графическим интерфейсом (поскольку он обычно запускает интерактивную оболочку без входа в систему). tty console — это интерактивная оболочка.

Мое решение состоит в том, чтобы добавить следующее к ~/.bash_profile:

. ~/.bashrc

person tukusejssirs    schedule 05.05.2015    source источник
comment
.bashrc зависит от пользователя, входящего в систему, а не от типа терминала.   -  person chepner    schedule 05.05.2015
comment
Так что я тоже подумал, но даже если я вхожу с теми же учетными данными в мод GUI (и, следовательно, в gnome-терминал) и в консоль tty, все еще в консоли tty, если я хочу использовать настройки ~/.bashrc, сначала мне нужно для ввода команды source ~/.bashrc.   -  person tukusejssirs    schedule 05.05.2015
comment
Когда вы входите в консоль, программа login запускает оболочку входа в систему, источником которой является .bash_profile, а не .bashrc. Эмулятор терминала с графическим интерфейсом обычно запускает интерактивную оболочку без входа в систему, источник которой .bashrc, а не .bash_profile, поскольку ваш графический интерфейс предположительно был запущен из оболочки входа в систему. Довольно распространенной практикой является включение source ~/.bashrc из .bash_profile, так что .bashrc используется для всех интерактивных оболочек, независимо от того, являются ли они оболочками для входа в систему.   -  person chepner    schedule 05.05.2015


Ответы (1)


У вас есть \\[\\e]0; \\u@\\h: \\w\\a\\] и \\u@\\h:\\w\\$ в PS1.

Вопрос в том, почему ваш терминал не показывает этот первый набор, а ваша консоль показывает.

Я полагаю, что ответ заключается в том, что у вас есть этот первый набор, заключенный в блок \[...\], который указывает, что он не печатается и не занимает места (вот почему вам нужно заключать цветовые коды в \[...\], чтобы приглашение не было короче, чем терминал ожидает, когда коды не создают видимых символов.

Это заставляет gnome-terminal отбрасывать все (даже видимые символы) из вывода/содержимого блока \[...\].

Консоль, по-видимому, просто печатает видимые символы (и игнорирует непечатаемые символы). (Интересно, вызывает ли это просчеты быстрого размера или нет.)

Решение здесь состоит в том, чтобы удалить этот первый (на первый взгляд непреднамеренный) набор побегов.

person Etan Reisner    schedule 05.05.2015