сломанная линия быстрого запуска bash - PullRequest
3 голосов
/ 19 февраля 2011

Я настраиваю мое приглашение bash на OsX, чтобы включить git branch плюс некоторые отметки состояния ветки. Это перенос строки.

Я знаю, что Я должен добавить \ [и \], чтобы предотвратить эту проблему , но при этом в функциях отображается \ [и \] буквально.

Что я могу сделать, чтобы избежать таких последовательностей в этих функциях?

Отказ от ответственности: это мои первые попытки написания сценариев bash.

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)\] "

Ответы [ 3 ]

5 голосов
/ 19 февраля 2011

Я рад слышать, что вы решили проблему с вашей версией, но я подумал, что стоит отметить, что git уже распространяется с полезной и тщательно продуманной функцией bash, которая называется __git_ps1, которую вы можете включить в ваш PS1. Например, вы можете использовать его так:

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

Если вы не находитесь в репозитории git, $(__git_ps1 " (%s)") превратится в пустую строку. Если вы, тем не менее, то будет использоваться строка формата. Обычно это покажет вам вашу текущую ветку, но если вы находитесь в середине слияния или перебазирования, которое будет показано вместо.

По умолчанию __git_ps1 не покажет вам, является ли дерево грязным или нет неотслеживаемых файлов, так как в некоторых репозиториях это может замедлить появление вашего приглашения bash. Однако, если вы также хотите просмотреть эту информацию, она будет отображаться, если вы установите для GIT_PS1_SHOWDIRTYSTATE или GIT_PS1_SHOWUNTRACKEDFILES что-то непустое.

Дополнительную информацию можно найти в верхней части исходного файла git-completion.sh .

3 голосов
/ 19 февраля 2011

Вам нужны одинарные кавычки вокруг значения в присваивании:

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

Поскольку содержимое оценивается при выдаче приглашения, двойные кавычки не нужны, как в других случаях.

1 голос
/ 19 февраля 2011

Благодаря Деннису исправленный код:

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)\] '
...