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

375
David Kennedy

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

http://blog.superuser.com/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 
0

2 ответа на вопрос

2
Gordon Davisson

It's much simpler than you're making it out to be. When you run the command ext-color 172 \u (either as part of setting PS1 or on its own), the shell parses \u, removing what it thinks is an irrelevant \, before passing it to ext-color as $2. The solution is simple: enclose it in quotes before passing it to ext-color:

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

(Note that I've also replaced the backquotes with $( ), used \w instead of $(PWD), and quoted '\w' for the same reason as '\u'.)

Измененный принятый ответ, так как это обращается к тому, что я фактически спрашивал. Благодарю. David Kennedy 11 лет назад 0
1
Daniel Andersson

Adapting the approach that seems to work in the second part of the prompt, try e.g.:

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

or even simpler:

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

or even nicer:

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

The last version won't cut off the part after a potential space in current directory because of the quotes around the pwd call.


EDIT: That won't update the working directory, as noted in the comment. I didn't even think of that since the question specifically asked about the user part (it's late here :-) ).

The easiest ("correct", "only") way is to just write

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

and skip the function definition altogether.


Expansion: To get the PS1 variable to dynamically expand function calls, use a backslash to hinder premature evaluation:

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

should work.

Первые два, кажется, работают. Однако `$ PWD` не меняется, когда я переписываюсь. David Kennedy 11 лет назад 0
@ davidkennedy85: Хорошо, я подозревал, что это может быть так, но я не был уверен. Я обновлю. РЕДАКТИРОВАТЬ: или вы имеете в виду на всех вариантах? Хм, да, я понимаю почему. Интересно, как мы можем передать `\ w` на внешний вызов ... Я даже не смотрел на это, так как ваш вопрос конкретно касался части` \ u` :-) Daniel Andersson 11 лет назад 0
Странно - вызов `pwd` из командной строки или даже` echo $ PWD` отображает `/ home / dave / Code`, но приглашение не меняется. David Kennedy 11 лет назад 0
@ davidkennedy85: вызов `pwd` в переменной` PS1` будет выполнен только один раз при чтении файла `.bashrc`, поэтому он не будет постоянно обновляться. Последовательность `\ w` предназначена для того, чтобы позаботиться об этом как о« магическом значении », которое интерпретируется внутренней логикой Bash. Daniel Andersson 11 лет назад 0
Это цифры. Я просто пытался быть модным. Так вы говорите, что нельзя отправлять специальные символы bash в пользовательскую функцию? David Kennedy 11 лет назад 0
Подожди ... кажется, что выдача `PS1 = $ (pwd)` из командной строки работает, но не помещает его в .bashrc. David Kennedy 11 лет назад 0
@ davidkennedy85: В данном случае последовательность `\ w` является особенной, поскольку Bash интерпретирует ее специально, когда записывает значение` PS1` в приглашение. Вызовы функций `$ ()` или `\` \ `` выполняются, когда файл `.bashrc` запускается сначала, а затем никогда больше: если вы добавляете обратную косую черту, как, например, в` \ $ (pwd) `, он будет работать, так как он будет выполняться только при вызове `PS1`. Daniel Andersson 11 лет назад 0
Ага! `PS1 =" $ (ext-color 172 "$ USER") в $ (ext-color 172 "\ $ PWD") "` Хороший вызов обратной косой черты :) David Kennedy 11 лет назад 0

Похожие вопросы