mirror of
https://github.com/pyenv/pyenv.git
synced 2024-12-01 12:49:12 -05:00
aab562c696
E.g. for a GUI session, ~/.profile is executed by the GUI login "shell" at its startup so one needs to fully log out and log back in. Before that, the change would only be seen by shells explicitly started as login shells.
221 lines
3.7 KiB
Bash
Executable file
221 lines
3.7 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='~/.bashrc'
|
|
;;
|
|
zsh )
|
|
profile='~/.zshrc'
|
|
;;
|
|
ksh )
|
|
profile='~/.profile'
|
|
;;
|
|
fish )
|
|
profile='~/.config/fish/config.fish'
|
|
;;
|
|
* )
|
|
profile='your profile'
|
|
;;
|
|
esac
|
|
|
|
{ echo "# Load pyenv automatically by appending"
|
|
echo "# the following to ${profile}:"
|
|
echo
|
|
case "$shell" in
|
|
fish )
|
|
echo 'pyenv init - | source'
|
|
;;
|
|
* )
|
|
echo 'eval "$(pyenv init -)"'
|
|
;;
|
|
esac
|
|
echo
|
|
echo "# And the following to ~/.profile:"
|
|
echo
|
|
case "$shell" in
|
|
fish )
|
|
echo 'pyenv init --path | source'
|
|
;;
|
|
* )
|
|
echo 'eval "$(pyenv init --path)"'
|
|
;;
|
|
esac
|
|
echo
|
|
echo '# Make sure to restart your entire logon session'
|
|
echo '# for changes to ~/.profile to take effect.'
|
|
echo
|
|
} >&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 ! perl -ls0x3A -e 'while (<>) { chomp; ($_ eq $d) && exit 0; } exit 1' -- -d="${PYENV_ROOT}/shims" <<<"$PATH" ; 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
|