Пояснение: я хочу __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 $
Что дает, и как я могу это исправить?
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.