Цветная строка PS1

877
Will Vousden

Пояснение: я хочу __fooвыполняться каждый раз, когда строка PS1 представляется в терминале, а не когда строка PS1 создается (следовательно, она в кавычках). __fooсодержит логику, которая проверяет текущий каталог, поэтому его выполнение должно быть отложено.


Я пытаюсь использовать разные цвета в моей строке Bash PS1 из функции Bash:

LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m"  __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' }  PS1='$(__foo '$LIGHTRED' '$LIGHTGREEN')\['$RESET'\] \$' 

По сути, я хочу __fooсоздать часть PS1 в кучу разных цветов. Моя попытка, похоже, не работает, хотя; он производит следующий вывод:

-bash: 31m: command not found -bash: 32m: command not found \[]firstcolour \[\]secondcolour $ 

Что дает, и как я могу это исправить?

1

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

2
zero2cx

Use the Bash environment variable $PROMPT_COMMAND to redefine the $PS1 variable just before the prompt is displayed.

LIGHTRED='\033[1;31m' LIGHTGREEN='\033[1;32m' RESET='\033[m' __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n "\[$1\]firstcolour \[$2\]secondcolour" } PROMPT_COMMAND=$PROMPT_COMMAND'; PS1="$(__foo $RED $GRN)\[$OFF\]\n\$ "' 

Note two additional changes that I have made to your code are optional here. They were added because I think it clarifies where/where not the escape codes get expanded:

  • Hard quotes ' around the color definition variables.
  • Soft quotes " around the return string for __foo
В чем преимущество использования `PROMPT_COMMAND` для установки` $ PS1` вместо наличия динамической строки `$ PS1`? Will Vousden 12 лет назад 0
Я думаю, что цитирование проще с помощью `PROMPT_COMMAND`; вам не нужно создавать строку, которая запускает команду каждый раз, когда она оценивается; Вы просто оцениваете динамические части и помещаете результат в `PS1`. chepner 12 лет назад 0
@WillVousden - нулевое преимущество. Это просто ответ, который будет работать. Я предоставил это, потому что я предположил, что никто не предложит решить вопрос с помощью этого подхода. zero2cx 12 лет назад 0
Спасибо; Я не знал о $ PROMPT_COMMAND, так что это приятно знать! Will Vousden 12 лет назад 0
1
Eureka

Your function foo returns a string which is executed by bash as a command, since you surrounded it with $() (and escaped all variable substitution with single quote marks.

Changing your code to this make it work just fine:

LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m" __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' } PS1=$(__foo $LIGHTRED $LIGHTGREEN)\[$RESET\]\$ 
Я должен был быть более ясным в своем вопросе: я хочу, чтобы `__foo` выполнялся каждый раз, когда строка PS1 представляется в терминале, а не при выполнении сценария. Я обновил свой вопрос. Как я могу это сделать? Will Vousden 12 лет назад 0
0
Will Vousden

I've solved it:

LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m" __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' } PS1='$(__foo "'$LIGHTRED'" "'$LIGHTGREEN'")\['$RESET'\] \$' 

The arguments to __foo needed to be enclosed in quotes.

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