web-dev-qa-db-fra.com

sh: parse_git_branch: commande introuvable

J'ai root activé sur osx El Captain. J'ai essayé une partie de la solution déjà fournie sur stackoverflow et supers mais je n'ai pas pu corriger l'erreur. J'ai exporté function parse_git_branch() vers .bash_profile de .bash_Prompt mais j'obtiens toujours cette erreur. Je ne connais pas les scripts bash, donc je n'ai aucune idée de ce qui se passe et de ce qui doit être corrigé.

abhimanyuaryan at Macbook in ~
$ Sudo su
sh: parse_git_branch: command not found
root at Macbook in /Users/abhimanyuaryan

.bash_profile

if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

# Add Homebrew `/usr/local/bin` and User `~/bin` to the `$PATH`
PATH=/usr/local/bin:$PATH
PATH=$HOME/bin:$PATH
export PATH

# Load the Shell dotfiles, and then some:
# * ~/.path can be used to extend `$PATH`.
# * ~/.extra can be used for other settings you don’t want to commit.
for file in ~/.{path,bash_Prompt,exports,aliases,functions,extra}; do
  [ -r "$file" ] && source "$file"
done
unset file

.bash_Prompt

# @gf3’s Sexy Bash Prompt, inspired by “Extravagant Zsh Prompt”
# Shamelessly copied from https://github.com/gf3/dotfiles
# Screenshot: http://i.imgur.com/s0Blh.png

if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then
  export TERM=gnome-256color
Elif infocmp xterm-256color >/dev/null 2>&1; then
  export TERM=xterm-256color
fi

if tput setaf 1 &> /dev/null; then
  tput sgr0
  if [[ $(tput colors) -ge 256 ]] 2>/dev/null; then
    # Changed these colors to fit Solarized theme
    Magenta=$(tput setaf 125)
    ORANGE=$(tput setaf 166)
    GREEN=$(tput setaf 64)
    PURPLE=$(tput setaf 61)
    WHITE=$(tput setaf 244)
  else
    Magenta=$(tput setaf 5)
    ORANGE=$(tput setaf 4)
    GREEN=$(tput setaf 2)
    PURPLE=$(tput setaf 1)
    WHITE=$(tput setaf 7)
  fi
  BOLD=$(tput bold)
  RESET=$(tput sgr0)
else
  Magenta="\033[1;31m"
  ORANGE="\033[1;33m"
  GREEN="\033[1;32m"
  PURPLE="\033[1;35m"
  WHITE="\033[1;37m"
  BOLD=""
  RESET="\033[m"
fi

export Magenta
export ORANGE
export GREEN
export PURPLE
export WHITE
export BOLD
export RESET

function parse_git_dirty() {
  [[ $(git status 2> /dev/null | tail -n1) != *"working directory clean"* ]] && echo "*"
}

function parse_git_branch() {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1$(parse_git_dirty)/"
}

export PS1="\[${BOLD}${Magenta}\]\u \[$WHITE\]at \[$ORANGE\]\h \[$WHITE\]in \[$GREEN\]\w\[$WHITE\]\$([[ -n \$(git branch 2> /dev/null) ]] && echo \" on \")\[$PURPLE\]\$(parse_git_branch)\[$WHITE\]\n\$ \[$RESET\]"
export PS2="\[$ORANGE\]→ \[$RESET\]"
13
AbhimanyuAryan

Le problème ici est que lorsque vous faites Sudo su, vous passez à root mais vous conservez votre propre profil. Ce profil contient un paramètre pour l'invite de commande qui fait référence à une fonction bash. Mais lorsque vous faites Sudo pour rooter, vous obtenez le shell de root, qui est sh au lieu de bash - donc toutes les modifications qui reposent sur les configurations bash ne fonctionneront pas, y compris la fonction à laquelle vous faites référence dans votre PS1.

Donc, la première chose à faire est de vous assurer que vous utilisez réellement bash au lieu de sh lorsque vous Sudo. C'est très simple - au lieu d'exécuter Sudo su, vous exécutez simplement Sudo bash.

Comme Sudo utilise par défaut le basculement vers root, vous allez maintenant exécuter le shell bash en tant que root, au lieu de simplement basculer vers le shell par défaut de l'utilisateur root.

Si vous rencontrez toujours des problèmes, cela peut être dû au fait que votre .bash_profile contient une référence au répertoire personnel de l'utilisateur actuel, en ce qu'il pointe vers ~ dans ces lignes:

for file in ~/.{path,bash_Prompt,exports,aliases,functions,extra}; do
  [ -r "$file" ] && source "$file"
done

Lorsque vous exécutez bash en tant que vous-même, ~ se développera dans votre propre répertoire personnel - mais lorsque vous l'exécuterez en tant que root, il sera évalué en /var/root et c'est là qu'il cherchera vos fichiers.

Il existe trois façons de résoudre ce problème; choisissez celui que vous préférez.

  1. Modifiez votre .bash_profile afin qu'il contienne le chemin complet de votre répertoire personnel au lieu du tilde
  2. Copiez tous les fichiers bash associés dans /var/root
  3. Au lieu d'exécuter Sudo su, faire Sudo su -. Cela vous donnera l'environnement root au lieu du vôtre. L'inconvénient est que toutes vos propres modifications d'environnement ne seront pas disponibles et que vous exécuterez sh au lieu de bash. (Dans certains systèmes d'exploitation, c'est la même chose, mais dans d'autres non. Je pense que MacOSX est l'un de ceux où sh et bash sont des choses différentes.)
12
Jenny D

avez-vous exporté votre $ PS1? Vous pouvez vérifier par la commande run:

printenv

sinon vous devez l'exporter par run:

export -n PS1

après vous pouvez exécuter Sudo ou Sudo su sans problème

1
Walterwhites