diff --git a/src/main/bash/sdkman-init.sh b/src/main/bash/sdkman-init.sh index 6a85b1ee..1e8e23d8 100644 --- a/src/main/bash/sdkman-init.sh +++ b/src/main/bash/sdkman-init.sh @@ -163,29 +163,29 @@ else fi fi -# initialise once only -if [[ "${SDKMAN_INIT}" != "true" ]]; then - # Build _HOME environment variables and prefix them all to PATH +# Build _HOME environment variables and prefix them all to PATH - # The candidates are assigned to an array for zsh compliance, a list of words is not iterable - # Arrays are the only way, but unfortunately zsh arrays are not backward compatible with bash - # In bash arrays are zero index based, in zsh they are 1 based(!) - for (( i=0; i <= ${#SDKMAN_CANDIDATES[*]}; i++ )); do - # Eliminate empty entries due to incompatibility - CANDIDATE_NAME="${SDKMAN_CANDIDATES[${i}]}" - CANDIDATE_DIR="${SDKMAN_DIR}/${CANDIDATE_NAME}/current" - if [[ -n "${CANDIDATE_NAME}" && -h "${CANDIDATE_DIR}" ]]; then - CANDIDATE_HOME_VAR="$(echo ${CANDIDATE_NAME} | tr '[:lower:]' '[:upper:]')_HOME" - export $(echo "${CANDIDATE_HOME_VAR}")="$CANDIDATE_DIR" - PATH="${CANDIDATE_DIR}/bin:${PATH}" - unset CANDIDATE_HOME_VAR - fi - unset CANDIDATE_NAME - unset CANDIDATE_DIR - done - unset i - export PATH +# The candidates are assigned to an array for zsh compliance, a list of words is not iterable +# Arrays are the only way, but unfortunately zsh arrays are not backward compatible with bash +# In bash arrays are zero index based, in zsh they are 1 based(!) +for (( i=0; i <= ${#SDKMAN_CANDIDATES[*]}; i++ )); do + # Eliminate empty entries due to incompatibility + CANDIDATE_NAME="${SDKMAN_CANDIDATES[${i}]}" + CANDIDATE_DIR="${SDKMAN_DIR}/${CANDIDATE_NAME}/current" + if [[ -n "${CANDIDATE_NAME}" && -h "${CANDIDATE_DIR}" ]]; then + CANDIDATE_HOME_VAR="$(echo ${CANDIDATE_NAME} | tr '[:lower:]' '[:upper:]')_HOME" + export $(echo "${CANDIDATE_HOME_VAR}")="$CANDIDATE_DIR" - export SDKMAN_INIT="true" - alias gvm="sdk" -fi + # Prefix candidate bin to PATH if it doesn't exist already + CANDIDATE_BIN="${CANDIDATE_DIR}/bin" + echo "$PATH" | grep -q "${CANDIDATE_BIN}" || PATH="${CANDIDATE_BIN}:${PATH}" + + unset CANDIDATE_HOME_VAR + fi + unset CANDIDATE_NAME + unset CANDIDATE_DIR +done +unset i +export PATH + +alias gvm="sdk" diff --git a/src/test/cucumber/path_initialisation.feature b/src/test/cucumber/path_initialisation.feature index e9ba7a86..6b1a37ab 100644 --- a/src/test/cucumber/path_initialisation.feature +++ b/src/test/cucumber/path_initialisation.feature @@ -7,8 +7,6 @@ Feature: Path Initialisation Scenario: sdkman is initialised for the first time Given the candidate "grails" version "2.1.0" is already installed and default And the system is bootstrapped - When I enter "echo $SDKMAN_INIT" - Then I see "true" When I enter "echo $PATH" Then I see a single occurrence of "grails"