Commande Bash prompt execute chaque fois qu'une nouvelle invite est affichée

11

J'ai l'invite suivante dans bash qui montre la branche git actuelle:

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

qui fonctionne lorsque je source le .bashrc, mais pas lorsque je change de branche, donc la var PS1 n'est évaluée que lorsque je source le .bashrc, mais elle doit être évaluée chaque fois qu'une nouvelle invite est affichée. Comment cela peut-il être accompli avec bash 4.3?

danielr1996
la source

Réponses:

14

Votre problème est qu'il $(git_prompt)est évalué en une chaîne constante avant d' être ajouté à $PS1. Vous devez ajouter le code à la place:

PS1+='$(git_prompt)'
Hauke ​​Laging
la source
2
cela donne l'erreur bash: command substitution: line 1: syntax error near unexpected token ) 'bash: substitution de commande: ligne 1:git_prompt)'
danielr1996
1
C'est vraiment étrange. Faites une "sauvegarde" ( oldPS1="$PS1") puis essayez:PS1='$(git_prompt) '
Hauke ​​Laging
9

Je l'ai corrigé maintenant en l'utilisant comme invite

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

avant de concaténer plusieurs chaînes en une chaîne PS1, il semblait y avoir le problème. L'astuce consiste à écrire un \avant d'exécuter la commande avec $(git_prompt).

Ainsi $(git_prompt)sera évalué lorsque le .bashrcest évalué et

\$(git_prompt) sera évalué chaque fois qu'une nouvelle invite est affichée

danielr1996
la source
5
Pour tous ceux qui trouveront cela à l'avenir: notez les guillemets qui "entourent la chaîne. L'utilisation \$(git_prompt)sans ceux-ci ne fonctionne pas.
dthor
1

essayez un guillemet simple dans votre ps1

PS1+='$(git_prompt)'

je suggère aussi ma fonction 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\] \$ '
}

entrez la description de l'image ici

Jonas
la source
Cela semble intéressant, pouvez-vous expliquer à quoi sert la ps1tm?
danielr1996
@ danielr1996 il le mode texte (gras non clignotant soulignement {0..5}, dans cette fonction il est réglé sur 01 si aucun argument n'existe
Jonah
0

Vous voulez voir la folie? Voici comment je construis mon invite 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

Je ne suis pas un grand fan de couleur.

glenn jackman
la source