sh: parse git branch: команда не найдена

у меня включен root на osx El Captain. Я попробовал некоторые решения, уже предоставленные на stackoverflow и supersu но не удалось исправить ошибку. Я экспортировал function parse_git_branch() to .bash_profile С .bash_prompt но я все еще получаю эту ошибку. Я не знаю сценариев bash, поэтому я понятия не имею, что происходит и что нужно исправить.

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

.файл

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="3[1;31m"
  ORANGE="3[1;33m"
  GREEN="3[1;32m"
  PURPLE="3[1;35m"
  WHITE="3[1;37m"
  BOLD=""
  RESET="3[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/* (.*)/$(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]"

2 ответов


проблема здесь в том, что когда вы делаете sudo su, вы переходите на root, но сохраняете свой собственный профиль. Этот профиль содержит параметр командной строки, который ссылается на функцию bash. Но когда вы судо корень, вы получаете оболочку корня, который sh вместо bash - поэтому любые изменения, которые полагаются на конфигурации bash, не будут работать, включая функцию, на которую вы ссылаетесь в своем PS1.

Итак, первое, что нужно сделать, чтобы убедиться что вы на самом деле запускаете bash вместо sh, когда вы sudo. Это очень просто-вместо запуска sudo su, вы просто запустите sudo bash.

поскольку sudo по умолчанию переключается на root, теперь вы будете запускать оболочку bash как root, а не просто переключаться на оболочку пользователя root по умолчанию.

если вы все еще есть проблемы, это может быть связано с вашим .файл, содержащий ссылку на домашний каталог текущего пользователя, в которые он указывает ~ в этих строки:

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

когда вы запускаете bash как себя,~ будет расширяться до вашего собственного домашнего каталога-но когда вы запустите его как root, он будет оценивать до /var/root и именно там он будет искать ваши файлы.

есть три способа исправить это; выберите тот, который вы предпочитаете.

  1. изменить .bash_profile, чтобы он содержал полный путь к вашему домашнему каталогу, а не только Тильду
  2. скопируйте все связанные bash файлы в /var/root
  3. вместо sudo su, do sudo su -. Это даст вам среду root вместо вашей собственной. Недостатком является то, что все ваши собственные изменения окружающей среды не будут доступны для вас, и вы будете работать sh вместо bash. (В некоторых операционных системах это одно и то же, но в других это не так. Я считаю, что MacOSX является одним из тех, где sh и bash - это разные вещи.)

вы экспортируете свой $ PS1 ? Вы можете проверить, выполнив команду:

printenv

иначе вы должны экспортировать его run:

export -n PS1

после того, как вы сможете запустить sudo или sudo su без проблем