Comando de ejecución de solicitud de Bash cada vez que aparece una nueva solicitud

11

Tengo el siguiente mensaje en bash que muestra la rama git actual:

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

que funciona cuando obtengo el .bashrc, pero no cuando cambio la rama, por lo que la var PS1 solo se evalúa cuando obtengo el .bashrc, pero debe evaluarse cada vez que se muestra una nueva solicitud. ¿Cómo se puede lograr esto con bash 4.3?

danielr1996
fuente

Respuestas:

14

Su problema es que $(git_prompt)se evalúa en una cadena constante antes de agregarse $PS1. En su lugar, debe agregar el código:

PS1+='$(git_prompt)'
Hauke ​​Laging
fuente
2
esto da el error bash: command substitution: line 1: syntax error near unexpected token ) 'bash: sustitución de comando: línea 1:git_prompt)'
danielr1996
1
Eso es realmente extraño. Haga una "copia de seguridad" ( oldPS1="$PS1") y luego intente:PS1='$(git_prompt) '
Hauke ​​Laging
9

Lo arreglé ahora usando esto como indicador

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

Antes de concatenar varias cadenas a una cadena PS1, parecía haber un problema. El truco es escribir un \antes de excitar el comando con $(git_prompt).

Entonces $(git_prompt)se evaluará cuando .bashrcse evalúe y

\$(git_prompt) se evaluará cada vez que se muestre una nueva solicitud

danielr1996
fuente
55
Para cualquiera que encuentre esto en el futuro: tenga en cuenta las comillas dobles que encierran "la cadena. Usar \$(git_prompt)sin esos no funciona.
dthor
1

prueba comillas simples en tu ps1

PS1+='$(git_prompt)'

También sugiero mi función 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\] \$ '
}

ingrese la descripción de la imagen aquí

Jonás
fuente
Esto parece interesante, ¿puedes explicar para qué sirve el ps1tm?
danielr1996
@ danielr1996 es el modo de texto (negrita, negrita, parpadeo, subrayado {0..5}, en esta función se establece en 01 si no existe ningún argumento
Jonás
0

¿Quieres ver locura? Así es como construyo mi indicador de 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

No soy un gran fanático del color.

Glenn Jackman
fuente