Comando Bash prompt execute sempre que um novo prompt é exibido

11

Eu tenho o seguinte prompt no bash, que mostra o ramo git atual:

PS1+="$(git_prompt)" #git_prompt is a function in my .bashrc

que funciona quando eu origino o .bashrc, mas não quando altero a ramificação, portanto a var PS1 só é avaliada quando eu origino o .bashrc, mas deve ser avaliada sempre que um novo prompt é exibido. Como isso pode ser feito com o bash 4.3?

danielr1996
fonte

Respostas:

14

Seu problema é que $(git_prompt)é avaliado como uma seqüência constante antes de ser adicionado $PS1. Você precisa adicionar o código:

PS1+='$(git_prompt)'
Hauke ​​Laging
fonte
2
isso dá o erro bash: command substitution: line 1: syntax error near unexpected token ) 'bash: substituição de comando: linha 1:git_prompt)'
danielr1996
1
Isso é realmente estranho. Faça um "backup" ( oldPS1="$PS1") e tente:PS1='$(git_prompt) '
Hauke ​​Laging 03/02
9

Corrigi-o agora usando isso como prompt

PS1="$green\u $r@ $red\h $r: $yellow\W \!$r \$(git_prompt) \n$yellow\$ $r"

antes de concatenar várias seqüências de caracteres para uma de PS1, parecia haver o problema. O truque é escrever um \antes de executar o comando com $(git_prompt).

Então $(git_prompt)será avaliado quando o .bashrcfor avaliado e

\$(git_prompt) será avaliado sempre que um novo prompt for exibido

danielr1996
fonte
5
Para quem encontrar isso no futuro: Observe as aspas duplas "ao redor da string. Usar \$(git_prompt)sem esses não funciona.
dthor 21/09/16
1

tente aspas simples no seu ps1

PS1+='$(git_prompt)'

Eu também sugiro minha função psOne

psOne () 
{ 
    ps1tm=${1:-01};
    ps1tc=(30 31 32 33 34 35 36 37 38);
    PS1='${debian_chroot:+($debian_chroot)}\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\]\u\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\]@\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\]\h\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\] :\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\] \w\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\] \$ '
}

insira a descrição da imagem aqui

Jonah
fonte
Isso parece interessante, você pode explicar para que serve o ps1tm?
Danielr1996
@ danielr1996 que o modo de texto (negrito sublinhado piscar unbold {0..5}, neste funções ele é definido como 01, se existe nenhum argumento
Jonah
0

Quer ver a loucura? É assim que eu construo meu prompt do bash:

# inspiration: http://www.stumbleupon.com/su/2LpQMi 
user_host_path="${debian_chroot:+($debian_chroot) }"'\u@\h:\w'
xterm_title='\[\e]0;'"$user_host_path"'\a\]'
[[ $TERM == xterm* || $TERM == rxvt* ]] && line1="${xterm_title}"
git_branch='$(git_current_branch " (%s)")'
line1="${line1}${user_host_path}${git_branch} "
line2='\$ '
print_time='{ printf "%*s" $(($(tput cols) - 10)) " "|sed -e "s/./˙/g" -re "s/.{6}(..)$/ bash \1/"; date "+ %T"; } >&2'
color_bold='\[\e[0;1m\]'
color_reset='\[\e[0m\]'
PROMPT_COMMAND="_rc_=\$?;${print_time};((_rc_!=0)) && PS1='${line1}\n${color_bold}[\$_rc_]${color_reset} ${line2}' || PS1='${line1}\n${line2}'"
unset user_host_path xterm_title color_bold color_reset line1 line2 print_time git_branch

Eu não sou um grande fã de cores.

Glenn Jackman
fonte