Правильно ли.bashrc устанавливает заголовок графического терминала?

По умолчанию .bashrc это:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac 

Результат проверяется с помощью команды echo:

$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

Похоже, что ${debian_chroot:+($debian_chroot)} условная вставка будет выполнена для командной строки, но не для заголовка терминала. Похоже, .bashrc автор предполагал, что он будет отображаться в обоих местах слева от user@host но фактически это не делало это в оба места. Оценка debian_chroot произошло при определении PS1, но оно не предназначалось для оценки в то время, скорее оно должно было оцениваться во время запроса. Корень проблемы в том, что при построении строк "" цитирование оценивает и '' цитирования нет. Оценка была ранней, потому что все это заключено в \[\] был предназначен для названия. Правильно ли истолковано?

2 ответа

Решение

Я бы сказал, что все это не имеет значения. debian_chroot установлен в/etc/bash.bashrc, Справедливо поспорить, что в обычном порядке, если переменная была установлена, была запущена новая оболочка - зачем /etc/bash.bashrc быть источником в противном случае? И в этом случае, ~/.bashrc будет также получены. Итак, либо переменная устанавливается, когда PS1 устанавливается и изменяется в строках, которые вы показываете, или нет, и не будет. Эффект тот же.

Я могу только догадываться, почему оригинальный разработчик использовал одинарные кавычки при настройке PS1 на первом месте. Предположительно, разработчик научился осторожности и использует "" только при необходимости, что происходит при изменении PS1,

Обратите внимание, что :+ просто означает ничего не делать, если переменная не установлена.

${debian_chroot:+($debian_chroot)} вставка зависит от наличия $debian_chroot переменная или /etc/debian_chroot файл.

Вот простой пример. На скриншоте ниже я подключен через ssh к Raspberry Pi с Ubuntu Snappy, на котором есть $debian_chroot переменная установлена ​​(по умолчанию), в то время как Ubuntu моего ноутбука нет. Вы можете увидеть полученную подсказку на вкладках, и в обоих случаях переменную для $TERM является xterm

Теперь, если переменная $TERM было что-то еще, это не изменило бы название терминала GUI. Это может быть связано с screen сеанс, например, где переменная $TERM является screen,

Другие вопросы по тегам