#!/usr/bin/env bash # # Summary: Run an executable with the selected Ruby version # # Usage: rbenv exec [args...] # # Runs an executable contained by the currently selected Ruby's bin # directory. Rough equivalent of: # # exec "$(rbenv prefix)/bin/$command" args... set -e [ -n "$RBENV_DEBUG" ] && set -x rubypath="" # Provide rbenv completions while true; do case "$1" in "--complete" ) exec rbenv shims --short ;; "--rubypath" ) rubypath=1 shift 1 ;; * ) break ;; esac done # Replace any "RBENV_ROOT/shims" or "RBENV_ROOT/versions/*/bin" paths in the # list with the given path. If no replacements were made, prepend the path onto # the list. replace_shims_path() { local path="$1" local dir="$2" # fake directory that serves as a placeholder for shims location in RUBYPATH: local placeholder="/rbenv_shims_were_here" local found="" local result="" local -a paths IFS=: paths=($path) for path in "${paths[@]}"; do if [[ $path = "${RBENV_ROOT}/shims" || $path == "${RBENV_ROOT}/versions/"*/bin || $path = $placeholder ]]; then found=1 result="${result}${dir:-$placeholder}:" else result="${result}${path}:" fi done # if no rbenv paths were replaced, simply prepend the path [ -n "$found" -o -z "$dir" ] || result="${dir}:${path}" echo "${result%:}" } RBENV_VERSION="$(rbenv-version-name)" RBENV_COMMAND="$1" if [ -z "$RBENV_COMMAND" ]; then rbenv-help --usage exec >&2 exit 1 fi export RBENV_VERSION RBENV_COMMAND_PATH="$(rbenv-which "$RBENV_COMMAND")" OLDIFS="$IFS" IFS=$'\n' scripts=(`rbenv-hooks exec`) IFS="$OLDIFS" for script in "${scripts[@]}"; do source "$script" done shift 1 if [ -n "$rubypath" ]; then bindir="" [ "$RBENV_VERSION" != "system" ] && bindir="${RBENV_COMMAND_PATH%/*}" export RUBYPATH="$(replace_shims_path "${RUBYPATH:-$PATH}" "$bindir")" fi exec -a "$RBENV_COMMAND" "$RBENV_COMMAND_PATH" "$@"