
Too many of our users have a shell initialization set up that inadvertently duplicates some or most of the entries in their PATH, bringing the system paths again in front of rbenv's shims. If this was a nested shell (a typical scenario when starting up tmux), `rbenv init` would get eval'd again but this time, shims won't get added to the front of the PATH and would only stay and the end of the path, effectively rendering them useless. I tried to argue that this is a user problem rather than rbenv's, but I can't fix everybody shell init when they report bugs. Instead, let's revert to simpler times in rbenv where we just roll along with the duplication and don't ask any questions. This reverts commit 03fa148e814d50aba8012dc94b866213a00ea8a9. Fixes #369
166 lines
2.6 KiB
Bash
Executable File
166 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Summary: Configure the shell environment for rbenv
|
|
# Usage: eval "$(rbenv init - [--no-rehash] [<shell>])"
|
|
|
|
set -e
|
|
[ -n "$RBENV_DEBUG" ] && set -x
|
|
|
|
print=""
|
|
no_rehash=""
|
|
for args in "$@"
|
|
do
|
|
if [ "$args" = "-" ]; then
|
|
print=1
|
|
shift
|
|
fi
|
|
|
|
if [ "$args" = "--no-rehash" ]; then
|
|
no_rehash=1
|
|
shift
|
|
fi
|
|
done
|
|
|
|
shell="$1"
|
|
if [ -z "$shell" ]; then
|
|
shell="$(ps c -p "$PPID" -o 'ucomm=' 2>/dev/null || true)"
|
|
shell="${shell##-}"
|
|
shell="${shell%% *}"
|
|
shell="$(basename "${shell:-$SHELL}")"
|
|
fi
|
|
|
|
READLINK=$(type -p greadlink readlink | head -1)
|
|
if [ -z "$READLINK" ]; then
|
|
echo "rbenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
|
exit 1
|
|
fi
|
|
|
|
resolve_link() {
|
|
$READLINK "$1"
|
|
}
|
|
|
|
abs_dirname() {
|
|
local cwd="$(pwd)"
|
|
local path="$1"
|
|
|
|
while [ -n "$path" ]; do
|
|
cd "${path%/*}"
|
|
local name="${path##*/}"
|
|
path="$(resolve_link "$name" || true)"
|
|
done
|
|
|
|
pwd
|
|
cd "$cwd"
|
|
}
|
|
|
|
root="$(abs_dirname "$0")/.."
|
|
|
|
if [ -z "$print" ]; then
|
|
case "$shell" in
|
|
bash )
|
|
profile='~/.bash_profile'
|
|
;;
|
|
zsh )
|
|
profile='~/.zshrc'
|
|
;;
|
|
ksh )
|
|
profile='~/.profile'
|
|
;;
|
|
fish )
|
|
profile='~/.config/fish/config.fish'
|
|
;;
|
|
* )
|
|
profile='your profile'
|
|
;;
|
|
esac
|
|
|
|
{ echo "# Load rbenv automatically by adding"
|
|
echo "# the following to ${profile}:"
|
|
echo
|
|
case "$shell" in
|
|
fish )
|
|
echo 'status --is-interactive; and . (rbenv init -|psub)'
|
|
;;
|
|
* )
|
|
echo 'eval "$(rbenv init -)"'
|
|
;;
|
|
esac
|
|
echo
|
|
} >&2
|
|
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "${RBENV_ROOT}/"{shims,versions}
|
|
|
|
case "$shell" in
|
|
fish )
|
|
echo "setenv PATH '${RBENV_ROOT}/shims' \$PATH"
|
|
echo "setenv RBENV_SHELL $shell"
|
|
;;
|
|
* )
|
|
echo 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"'
|
|
echo "export RBENV_SHELL=$shell"
|
|
;;
|
|
esac
|
|
|
|
completion="${root}/completions/rbenv.${shell}"
|
|
if [ -r "$completion" ]; then
|
|
case "$shell" in
|
|
fish ) echo ". '$completion'" ;;
|
|
* ) echo "source '$completion'" ;;
|
|
esac
|
|
fi
|
|
|
|
if [ -z "$no_rehash" ]; then
|
|
echo 'rbenv rehash 2>/dev/null'
|
|
fi
|
|
|
|
commands=(`rbenv-commands --sh`)
|
|
case "$shell" in
|
|
fish )
|
|
cat <<EOS
|
|
function rbenv
|
|
set command \$argv[1]
|
|
set -e argv[1]
|
|
|
|
switch "\$command"
|
|
case ${commands[*]}
|
|
eval (rbenv "sh-\$command" \$argv)
|
|
case '*'
|
|
command rbenv "\$command" \$argv
|
|
end
|
|
end
|
|
EOS
|
|
;;
|
|
ksh )
|
|
cat <<EOS
|
|
function rbenv {
|
|
typeset command
|
|
EOS
|
|
;;
|
|
* )
|
|
cat <<EOS
|
|
rbenv() {
|
|
local command
|
|
EOS
|
|
;;
|
|
esac
|
|
|
|
if [ "$shell" != "fish" ]; then
|
|
IFS="|"
|
|
cat <<EOS
|
|
command="\$1"
|
|
if [ "\$#" -gt 0 ]; then
|
|
shift
|
|
fi
|
|
|
|
case "\$command" in
|
|
${commands[*]})
|
|
eval "\`rbenv "sh-\$command" "\$@"\`";;
|
|
*)
|
|
command rbenv "\$command" "\$@";;
|
|
esac
|
|
}
|
|
EOS
|
|
fi
|