Bash prompt esegue il comando ogni volta che viene visualizzato un nuovo prompt


11

Ho il seguente prompt in bash che mostra l'attuale ramo git:

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

che funziona quando sorgente il .bashrc, ma non quando cambio il ramo, quindi la var PS1 viene valutata solo quando fonte il .bashrc, ma dovrebbe essere valutata ogni volta che viene visualizzato un nuovo prompt. Come può essere realizzato con bash 4.3?

Risposte:


14

Il tuo problema è che $(git_prompt)viene valutato in una stringa costante prima che venga aggiunto $PS1. Devi invece aggiungere il codice:

PS1+='$(git_prompt)'

2
questo dà l'errore bash: command substitution: line 1: syntax error near unexpected token ) 'bash: sostituzione comando: riga 1:git_prompt)'
danielr1996

1
È davvero strano. Fai un "backup" ( oldPS1="$PS1") e poi prova:PS1='$(git_prompt) '
Hauke ​​Laging,

9

L'ho risolto ora usando questo come prompt

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

prima di concatenare più stringhe su una stringa PS1, sembrava esserci il problema. Il trucco è scrivere un \prima di eseguire il comando con $(git_prompt).

Quindi $(git_prompt)verrà valutato quando .bashrcviene valutato e

\$(git_prompt) verrà valutato ogni volta che viene visualizzato un nuovo prompt


5
Per chiunque lo trovi in ​​futuro: nota le doppie virgolette che racchiudono "la stringa. L'uso \$(git_prompt)senza quelli non funziona.
dthor,

1

prova la singola citazione nella tua ps1

PS1+='$(git_prompt)'

suggerisco anche la mia funzione 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\] \$ '
}

inserisci qui la descrizione dell'immagine


Sembra interessante, puoi spiegare a cosa serve ps1tm?
danielr1996,

@ danielr1996 è la modalità testo (il grassetto non piegato sottolinea {0..5}, in questa funzione è impostato su 01 se non esiste alcun argomento
Giona

0

Vuoi vedere la follia? Ecco come costruisco il mio prompt di 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

Non sono un grande fan del colore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.