línea de envoltura de bash rota

Estoy personalizando mi prompt bash en OsX para include git branch más algunas marcas del estado de la bifurcación. Esto rompe el ajuste de línea.

Sé que tengo que agregar \ [y \] para evitar este problema , pero hacerlo en las funciones muestra \ [y \] litteraly.

¿Qué puedo hacer para escaping de tales secuencias en esas funciones?

Descargo de responsabilidad: esos son mis primeros bashs en bash scripting.

function parse_git_dirty { # TODO make git status response a variable # [branch+] : working dir has staged changes if [[ $(git status 2> /dev/null | grep "to be committed") ]] then S=$S"$(tput setaf 2)+$(tput sgr0)" fi # [branch+] : working dir has unstaged changes if [[ $(git status 2> /dev/null | grep "not staged for commit") ]] then S=$S"$(tput setaf 1)+$(tput sgr0)" fi # [branch+] : working dir has untracked files if [[ $(git status 2> /dev/null | grep "tracked files") ]] then S=$S"$(tput setaf 1)+$(tput sgr0)" fi # [branch<] : local branch is behind origin if [[ $(git status 2> /dev/null | grep "Your branch is behind") ]] then S=$S"$(tput setaf 5)<$(tput sgr0)" fi # [branch>] : local branch is ahead origin if [[ $(git status 2> /dev/null | grep "branch is ahead of") ]] then S=$S"$(tput setaf 5)>$(tput sgr0)" fi # [branch<>] : branches have diverged if [[ $(git status 2> /dev/null | grep "have diverged") ]] then S=$S"$(tput setaf 5)<>$(tput sgr0)" fi echo $S } function parse_git_branch { git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' } function show_git_branch { if [[ $(parse_git_branch) ]] then echo "$(tput setaf 2)($(tput sgr0)$(parse_git_branch)$(parse_git_dirty)$(tput setaf 2))$(tput sgr0)" fi } export PS1="\u\[$(tput setaf 2)\]@\[$(tput sgr0)\]\h\[$(tput setaf 2)\]:\[$(tput sgr0)\]\W\[\$(show_git_branch)\] " 

Me alegra saber que has resuelto el problema con tu versión, pero pensé que podría valer la pena señalar que git ya está distribuido con una function de bash útil y cuidadosamente pensada llamada __git_ps1 que puedes include en tu PS1 . Por ejemplo, podrías usarlo así:

  export PS1='blah blah blah$(__git_ps1 " (%s)") ' 

Si no estás en un repository de git, $(__git_ps1 " (%s)") se convertirá en la cadena vacía. Sin embargo, si lo es, se usará la cadena de formatting. Eso generalmente le mostrará su twig actual, pero si está en el medio de una fusión o una rebase que se mostrará en su lugar.

De forma pnetworkingeterminada, __git_ps1 no le mostrará si el tree está sucio o si hay files sin seguimiento, ya que en ciertos repositorys esto podría hacer que sea irritantemente lento para que aparezca el post bash. Sin embargo, si desea ver esta información también, se los mostrará si establece GIT_PS1_SHOWDIRTYSTATE o GIT_PS1_SHOWUNTRACKEDFILES en algo no vacío.

Puede encontrar más información en la parte superior del file fuente git-completion.sh .

Necesita comillas simples alnetworkingedor del valor en la tarea:

 export PS1='\u\[$(tput setaf 2)\]@\[$(tput sgr0)\]\h\[$(tput setaf 2)\]:\[$(tput sgr0)\]\W\[$(show_git_branch)\] ' 

Dado que los contenidos se evalúan cuando se emite el aviso, no necesita comillas dobles como lo haría en otras circunstancias.

Gracias a Dennis, el código corregido es:

 function parse_git_dirty { # TODO make git status response a variable # [branch+] : working dir has staged changes if [[ $(git status 2> /dev/null | grep "to be committed") ]] then S=$S"$(tput setaf 2)+$(tput sgr0)" fi # [branch+] : working dir has unstaged changes if [[ $(git status 2> /dev/null | grep "not staged for commit") ]] then S=$S"$(tput setaf 1)+$(tput sgr0)" fi # [branch+] : working dir has untracked files if [[ $(git status 2> /dev/null | grep "tracked files") ]] then S=$S"$(tput setaf 1)+$(tput sgr0)" fi # [branch<] : local branch is behind origin if [[ $(git status 2> /dev/null | grep "Your branch is behind") ]] then S=$S"$(tput setaf 5)<$(tput sgr0)" fi # [branch>] : local branch is ahead origin if [[ $(git status 2> /dev/null | grep "branch is ahead of") ]] then S=$S"$(tput setaf 5)>$(tput sgr0)" fi # [branch<>] : branches have diverged if [[ $(git status 2> /dev/null | grep "have diverged") ]] then S=$S"$(tput setaf 5)<>$(tput sgr0)" fi echo $S } function parse_git_branch { git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' } function show_git_branch { if [[ $(parse_git_branch) ]] then echo "$(tput setaf 2)($(tput sgr0)$(parse_git_branch)$(parse_git_dirty)$(tput setaf 2))$(tput sgr0)" fi } export PS1='\u\[$(tput setaf 2)\]@\[$(tput sgr0)\]\h\[$(tput setaf 2)\]:\[$(tput sgr0)\]\W\[$(show_git_branch)\] '