web-dev-qa-db-ja.com

sh:parse_git_branch:コマンドが見つかりません

OS X El Captainでrootを有効にしています。 stackoverflow および supers ですでに提供されているソリューションのいくつかを試しましたが、エラーを修正できませんでした。 _.bash_profile_からfunction parse_git_branch()を_.bash_Prompt_にエクスポートしましたが、それでもこのエラーが発生します。私はbashスクリプトを知らないので、何が起こっているのか、何が修正されるのかわかりません。

_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

ここでの問題は、Sudo suを実行すると、rootに変更されますが、独自のプロファイルを保持していることです。そのプロファイルには、bash関数を参照するコマンドプロンプトの設定が含まれています。しかし、ルートにSudoすると、ルートのシェル(shではなくbash)が取得されます。そのため、bash構成に依存する変更は、あなたが参照している関数を含め、機能しませんPS1

したがって、最初に行うことは、Sudoを実行するときに、shではなくbashを実際に実行していることを確認することです。これは非常に簡単です。Sudo suを実行する代わりに、Sudo bashを実行するだけです。

Sudoはデフォルトでrootに切り替えるので、単にrootユーザーのデフォルトシェルに切り替えるのではなく、bashシェルをrootとして実行することになります。

それでも問題が解決しない場合は、現在のユーザーのホームディレクトリへの参照が含まれている.bash_profileが原因である可能性があります。これは、次の行で~を指しているためです。

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

自分でbashを実行すると、~は自分のホームディレクトリに展開されますが、rootとして実行すると、/var/rootと評価され、ファイルが検索されます。

これを修正する方法は3つあります。好きな方を選んでください。

  1. .bash_profileを変更して、チルダだけでなくホームディレクトリへのフルパスを含めます。
  2. 関連するすべてのbashファイルを/var/rootにコピーします
  3. Sudo suを実行する代わりに、Sudo su -を実行します。これはあなたの代わりにあなたのルートの環境を与えます。欠点は、独自の環境変更がすべて利用できなくなり、shではなくbashが実行されることです。 (一部のオペレーティングシステムでは同じものがありますが、異なるものもあります。MacOSXは、shbashが異なるものの1つだと思います。)
12
Jenny D

$ PS1をエクスポートしましたか?コマンドを実行して確認できます:

printenv

それ以外の場合は、次のコマンドを実行してエクスポートする必要があります。

export -n PS1

sudoまたはSudo suを問題なく実行できるようになった後

1
Walterwhites