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\]"
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.
/var/root
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.)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