mirror of
https://github.com/pyenv/pyenv.git
synced 2024-11-21 20:47:00 -05:00
d2bd4c06ef
...rather than login mode. I couldn't get rid of the warning that `pyenv init -` no longer sets path until I did this. It looks like setting only on the login shell wasn't enough to hide the warning in other shells I opened. This fits with [how rbenv does the same thing](https://github.com/rbenv/rbenv/blob/master/libexec/rbenv-init#L74). I'm way out of my depth here, so someone who knows about shell types should definitely review this.
260 lines
5.2 KiB
Bash
Executable file
260 lines
5.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Summary: Configure the shell environment for pyenv
|
|
# Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
|
|
|
|
set -e
|
|
[ -n "$PYENV_DEBUG" ] && set -x
|
|
|
|
# Provide pyenv completions
|
|
if [ "$1" = "--complete" ]; then
|
|
echo -
|
|
echo --path
|
|
echo --no-rehash
|
|
echo bash
|
|
echo fish
|
|
echo ksh
|
|
echo zsh
|
|
exit
|
|
fi
|
|
|
|
mode="help"
|
|
no_rehash=""
|
|
for args in "$@"
|
|
do
|
|
if [ "$args" = "-" ]; then
|
|
mode="print"
|
|
shift
|
|
fi
|
|
|
|
if [ "$args" = "--path" ]; then
|
|
mode="path"
|
|
shift
|
|
fi
|
|
|
|
if [ "$args" = "--no-rehash" ]; then
|
|
no_rehash=1
|
|
shift
|
|
fi
|
|
done
|
|
|
|
shell="$1"
|
|
if [ -z "$shell" ]; then
|
|
shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
|
|
shell="${shell%% *}"
|
|
shell="${shell##-}"
|
|
shell="${shell:-$SHELL}"
|
|
shell="${shell##*/}"
|
|
shell="${shell%%-*}"
|
|
fi
|
|
|
|
root="${0%/*}/.."
|
|
|
|
function main() {
|
|
case "$mode" in
|
|
"help")
|
|
help_
|
|
exit 1
|
|
;;
|
|
"path")
|
|
print_path
|
|
exit 0
|
|
;;
|
|
"print")
|
|
init_dirs
|
|
warn_path
|
|
print_env
|
|
print_completion
|
|
print_shell_function
|
|
exit 0
|
|
;;
|
|
esac
|
|
# should never get here
|
|
exit 2
|
|
}
|
|
|
|
function help_() {
|
|
case "$shell" in
|
|
bash )
|
|
profile='~/.bash_profile'
|
|
rc='~/.bashrc'
|
|
;;
|
|
zsh )
|
|
profile='~/.zprofile'
|
|
rc='~/.zshrc'
|
|
;;
|
|
ksh )
|
|
profile='~/.profile'
|
|
rc='~/.profile'
|
|
;;
|
|
* )
|
|
profile='your shell'\''s login startup file'
|
|
rc='your shell'\''s interactive startup file'
|
|
;;
|
|
esac
|
|
|
|
{
|
|
echo
|
|
echo '# (The below instructions are intended for common'
|
|
echo '# shell setups. See the README for more guidance'
|
|
echo '# if they don'\''t apply and/or don'\''t work for you.)'
|
|
echo
|
|
case "$shell" in
|
|
fish )
|
|
echo "# Add pyenv executable to PATH by running"
|
|
echo "# the following interactively:"
|
|
echo
|
|
echo 'set -Ux PYENV_ROOT $HOME/.pyenv'
|
|
echo 'set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths'
|
|
echo
|
|
echo "# Load pyenv automatically by appending"
|
|
echo "# the following to ~/.config/fish/config.fish:"
|
|
echo
|
|
echo 'status is-interactive; and pyenv init --path | source'
|
|
echo 'pyenv init - | source'
|
|
echo
|
|
echo "# If fish is not your login shell,"
|
|
echo "# add the following to ~/.profile:"
|
|
echo
|
|
echo 'export PYENV_ROOT="$HOME/.pyenv"'
|
|
echo 'export PATH="$PYENV_ROOT/bin:$PATH"'
|
|
echo 'eval "$(pyenv init --path)"'
|
|
echo
|
|
;;
|
|
* )
|
|
echo '# Add pyenv executable to PATH and'
|
|
echo '# enable shims by adding the following'
|
|
case "$shell" in
|
|
bash|ksh )
|
|
echo '# to ~/.profile:'
|
|
;;
|
|
* )
|
|
echo '# to ~/.profile and '"${profile}"':'
|
|
;;
|
|
esac
|
|
echo
|
|
echo 'export PYENV_ROOT="$HOME/.pyenv"'
|
|
echo 'export PATH="$PYENV_ROOT/bin:$PATH"'
|
|
echo 'eval "$(pyenv init --path)"'
|
|
echo
|
|
if [[ $shell == "bash" ]]; then
|
|
echo '# If your ~/.profile sources '"${rc}"','
|
|
echo '# the lines need to be inserted before the part'
|
|
echo '# that does that. See the README for another option.'
|
|
echo
|
|
echo '# If you have '"${profile}"', make sure that it'
|
|
echo '# also executes the above lines -- e.g. by'
|
|
echo '# copying them there or by sourcing ~/.profile'
|
|
echo
|
|
fi
|
|
echo "# Load pyenv into the shell by adding"
|
|
echo "# the following to ${rc}:"
|
|
echo
|
|
echo 'eval "$(pyenv init -)"'
|
|
echo
|
|
echo '# Make sure to restart your entire logon session'
|
|
echo '# for changes to profile files to take effect.'
|
|
echo
|
|
;;
|
|
esac
|
|
} >&2
|
|
}
|
|
|
|
function init_dirs() {
|
|
mkdir -p "${PYENV_ROOT}/"{shims,versions}
|
|
}
|
|
|
|
function print_path() {
|
|
# Need to use the login shell rather than the current one
|
|
case "$shell" in
|
|
fish )
|
|
echo "set -gx PATH '${PYENV_ROOT}/shims' \$PATH"
|
|
;;
|
|
* )
|
|
echo 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"'
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function warn_path() {
|
|
if ! [[ ":${PATH}:" == *":${PYENV_ROOT}/shims:"* ]] ; then
|
|
echo 'echo '\''WARNING: `pyenv init -` no longer sets PATH.'\'
|
|
echo 'echo '\''Run `pyenv init` to see the necessary changes to make to your configuration.'\'
|
|
fi
|
|
}
|
|
|
|
function print_env() {
|
|
case "$shell" in
|
|
fish )
|
|
echo "set -gx PYENV_SHELL $shell"
|
|
;;
|
|
* )
|
|
echo "export PYENV_SHELL=$shell"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function print_completion() {
|
|
completion="${root}/completions/pyenv.${shell}"
|
|
if [ -r "$completion" ]; then
|
|
echo "source '$completion'"
|
|
fi
|
|
|
|
if [ -z "$no_rehash" ]; then
|
|
echo 'command pyenv rehash 2>/dev/null'
|
|
fi
|
|
}
|
|
|
|
function print_shell_function() {
|
|
commands=(`pyenv-commands --sh`)
|
|
case "$shell" in
|
|
fish )
|
|
cat <<EOS
|
|
function pyenv
|
|
set command \$argv[1]
|
|
set -e argv[1]
|
|
|
|
switch "\$command"
|
|
case ${commands[*]}
|
|
source (pyenv "sh-\$command" \$argv|psub)
|
|
case '*'
|
|
command pyenv "\$command" \$argv
|
|
end
|
|
end
|
|
EOS
|
|
;;
|
|
ksh )
|
|
cat <<EOS
|
|
function pyenv {
|
|
typeset command
|
|
EOS
|
|
;;
|
|
* )
|
|
cat <<EOS
|
|
pyenv() {
|
|
local command
|
|
EOS
|
|
;;
|
|
esac
|
|
|
|
if [ "$shell" != "fish" ]; then
|
|
IFS="|"
|
|
cat <<EOS
|
|
command="\${1:-}"
|
|
if [ "\$#" -gt 0 ]; then
|
|
shift
|
|
fi
|
|
|
|
case "\$command" in
|
|
${commands[*]})
|
|
eval "\$(pyenv "sh-\$command" "\$@")"
|
|
;;
|
|
*)
|
|
command pyenv "\$command" "\$@"
|
|
;;
|
|
esac
|
|
}
|
|
EOS
|
|
fi
|
|
}
|
|
|
|
main
|